modulepath and classpath mixture

Jonathan Gibbons jonathan.gibbons at oracle.com
Tue Feb 23 23:15:26 UTC 2016



On 02/23/2016 01:22 PM, Robert Scholte wrote:
> On Tue, 23 Feb 2016 22:14:32 +0100, Jonathan Gibbons 
> <jonathan.gibbons at oracle.com> wrote:
>
>>
>>
>> On 02/23/2016 01:06 PM, Jonathan Gibbons wrote:
>>>
>>>
>>> On 02/23/2016 12:48 PM, Robert Scholte wrote:
>>>> On Tue, 23 Feb 2016 01:52:50 +0100, Jonathan Gibbons 
>>>> <jonathan.gibbons at oracle.com> wrote:
>>>>
>>>>>
>>>>>
>>>>> On 02/22/2016 12:44 PM, Robert Scholte wrote:
>>>>>> Hi,
>>>>>>
>>>>>> first of all I'd like to say that I'm very pleased with the new 
>>>>>> -mp options, these matches better with the way Apache Maven would 
>>>>>> like to work with jars and class-folders.
>>>>>>
>>>>>> Here's my use case: I noticed that if I add a module-info to 
>>>>>> src/main/java and put all compile-scoped dependencies to the 
>>>>>> module path, all compiles fines.
>>>>>> I assume that developers are less interested in adding a 
>>>>>> module-info.java file to src/test/java, so that's what I'm doing 
>>>>>> right now too.
>>>>>> Now it seems that I *must* add compile + test scoped to the 
>>>>>> *classpath* to be able to compile the test classes.
>>>>>> My first approach was to leave the compile-scoped dependencies on 
>>>>>> the modulepath and all test-scoped dependencies on the classpath, 
>>>>>> so the modules keeps their inner related structure, but it seems 
>>>>>> that the classpath classes cannot access the modulepath classes.
>>>>>>
>>>>>> I'm looking for the confirmation that putting all dependencies on 
>>>>>> the classpath is indeed the right approach in this case.
>>>>>>
>>>>>> thanks,
>>>>>> Robert
>>>>>
>>>>> Robert,
>>>>>
>>>>> We definitely need some more detailed notes on setting up javac 
>>>>> compilations (note to self!) but one thing to note is that by 
>>>>> default, the unnamed module (i.e. code on the classpath) only has 
>>>>> observability of the modules in the system image. To make modules 
>>>>> on the module path observable, you need to use the -addmods option.
>>>>>
>>>>> -- Jon
>>>>
>>>> Hi Jonathan,
>>>>
>>>> this would indeed explain what I'm facing right now. However, 
>>>> adding -addmods gives me the following exception:
>>>> Caused by: java.lang.IllegalArgumentException: -addmods requires an 
>>>> argument
>>>>         at 
>>>> com.sun.tools.javac.main.Arguments.error(jdk.compiler at 9-ea/Arguments.java:708)
>>>>
>>>> Is -addmods followed by the same entries as -modulepath or by the 
>>>> modulenames. I really hope it is not the latter, because that would 
>>>> mean that I first need to discover and read all module-info files.
>>>>
>>>> thanks,
>>>> Robert
>>>
>>> Sorry, I should have been more explicit.
>>>
>>> Both javac and java (the launcher) accept an option "-addmods 
>>> <module-name>,..." which can be used to name modules to be included 
>>> in the module graph.   Confusingly, for javac, the option is listed 
>>> under javac -X (that's a bug we will fix), but setting that aside, 
>>> here's what the command line help says:
>>>
>>>   -addmods <modulename>[,<modulename>...] Root modules to resolve in 
>>> addition to the initial modules
>>>
>>> "java -help" says effectively the same.
>>>
>>>
>>> So yes, the option takes a list of module names, not module paths.
>>>
>>> -- Jon
>>>
>>>
>>>
>>
>>
>>
>> ... but that being said, note that you don't have to list all the 
>> modules on the module path.    You only need to list root modules, 
>> and javac will determine the transitive closure of all the necessary 
>> modules.
>>
>> So, if you're writing tests in the unnamed module, to test a module 
>> M, the chances are that you only need "-addmods M".
>>
>
> This makes sense. And although I still don't like the fact that this 
> requires me to read the module-info, this should be possible for the 
> target/mods/m (since it is already compiled).
> So my response to Alan was probably a bit too fast.
> This requires some tricks on our side to stay compatible with lower 
> Java versions while adding some code to read the module-info.
>
> thanks,
> Robert


When we've had discussions about how these options might work, we've 
generally assumed you might have some a priori knowledge of the module 
name from some other context, rather than having to rely on reading 
module info.

-- Jon

>
>
>>
>> Alan wrote a separate email about different compilation scenarios. 
>> Note that in many/most of those cases, no -addmods was necessary.
>>
>>
>> -- Jon
>
>



More information about the jigsaw-dev mailing list