Is it possible to use dependencies without module-info.class in a Java 9 module

Jan Gassen picture Jan Gassen · Jul 8, 2016 · Viewed 7.1k times · Source

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.

Answer

Nicolai Parlog picture Nicolai Parlog · Jul 8, 2016

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).