Combining -classpath and module-info?

Stephan Herrmann stephan.herrmann at berlin.de
Tue Nov 7 22:25:58 UTC 2017


Thanks a lot, Jon,

This is very helpful.

As you mention legacy mode as "no modules being compiled", this mode
is still tied to the -source, -target, and --release options, right?

IOW, the fact that the command line without module-info.java succeeds
is not owed to using a different compilation mode, but to compiling
everything in the same unnamed module, right?


Does JEP 261 have a process for correcting the text after it has been delivered?

Which space should I watch for updates?
- http://openjdk.java.net/jeps/261
- https://bugs.openjdk.java.net/browse/JDK-8061972
- any other?

regards,
Stephan

On 07.11.2017 23:03, Jonathan Gibbons wrote:
> 
> 
> On 11/07/2017 12:56 PM, Stephan Herrmann wrote:
>> On 07.11.2017 21:43, Alan Bateman wrote:
>>> On 07/11/2017 18:56, Stephan Herrmann wrote:
>>>> I recently noticed that compilers start to ignore -classpath as soon
>>>> as module-info (.java or .class) is found during the compile.
>>>> (Incidentally, javac and Eclipse compiler agree in this).
>>>>
>>>> Using a trivial test class this works:
>>>> $ javac -classpath junit4.jar -d bin/ src/pkg/TestJUnit4.java
>>>>
>>>> This doesn't (cannot resolve any types from junit4.jar):
>>>> $ javac -classpath junit4.jar -d bin/ src/pkg/TestJUnit4.java src/module-info.java
>>> The module you are compiling doesn't read the unnamed module. You can't write "requires $CLASSPATH" for example.
>>>
>>> If you add `--add-reads <module>=ALL-UNNAMED` to the command line then it should compile.
>>>
>>> -Alan
>>
>> Thanks, Alan, that would work.
>>
>> But that is not what I meant when referring to JEP 261.
>>
>> In JEP 261 I see (under "Single-module mode"):
>> "It is possible to put arbitrary classes and JAR files on the class path in this mode,
>>  but that is not recommended since it amounts to treating those classes and JAR files as
>>  part of the module being compiled."
>>
>> Doesn't this say, my above command line treats junit4.jar as part of the current module,
>> *not* as an unnamed module?
>>
>> Is everything referenced via -classpath definitely treated as an unnamed module?
>> Independent of single-/multi-module modes?
>>
>> Stephan
> 
> Stephan,
> 
> I think you have identified some outdated text that needs to be fixed.
> 
> The text was correct at one point, when the distinction between "single module mode"
> and "multi-module mode" was a bigger deal.
> 
> These days, the primary distinction is between "classpath (legacy) mode" (no modules being compiled)
> and "module mode" (one or more modules being compiled.)
> 
> Here's how javac treats these modes:
> 
> In classpath (legacy) mode ...
> 
> * the sourcepath, classpath and output directory behave as previously, such as in JDK 8.
> 
> In module mode ...
> 
> * all classes on the classpath (-classpath) are treated as part of the unnamed module.
> 
> * if you are just compiling a single module, you may either put the source for that module
> on the source path (-sourcepath) or in a directory on the module source path (--module-source-path).
> 
> * if you are compiling multiple modules, they must be in separate directories on the
> module source path (--module-source-path).
> 
> * javac will implicitly look for previously compiled classes in the output directory (-d).
> (This is in contrast to the usage in classpath/legacy mode, where it has always been common practice
> to explicitly put the output directory on the classpath as well.)
> 
> -- Jon
> 
> 



More information about the jigsaw-dev mailing list