I created two small projects de.app1 and de.app2, where App
from de.app1 uses Test
from de.app2.
├── de.app1
│ ├── de
│ │ └── app
│ │ └── App.java
│ └── module-info.java
└── de.app2
└── de
└── test
└── Test.java
module-info.java in the first project just contains module de.app1 {}
I compiled the second project and created a jar file:
javac de/test/Test.java
jar cf app2.jar de/test/Test.class
and then tried to compile the first project like this:
javac -cp ../de.app2/app2.jar de/app/App.java module-info.java
which failed because Test
could not be found. When I compile the project without module-info.java, everything is working as usual.
Is it somehow possible to use classes from a jar that is not a Java 9 module within a Java 9 module? Especially for projects that depend on 3rd-party projects (e.g. apache-commons,...), I think something like this would be required.
Yes, it is possible. What you are looking for are automatic modules.
To create one you simply put a regular JAR into a folder that you mention on the module path (e.g. guava-19.0.jar
in a folder libs
- see my example project). This tells the JVM to create a module from it. This module will get a name based on the file name (in this case guava
), will read all other modules, and export all of its packages.
You can then require it with the name it was given (e.g. require guava;
- see here).