I have created a multimodule project with the following structure
myproject
|- mymodule
|- src
|- main
|- java
|- com
|- mymodule
|- Util.java
|-newmodule
|-src
|-main
|-java
|-com
|-newmodule
|- Main.java
|-module-info.java
Now i want to use Util.java which is a non modularized code in a modularized module newmodule. i have declared following in newmodule
module newmodule {
requires mymodule;
}
Project is compiling fine, but Intellij is showing module not found and package com.mymodule is declared in unnamed module , module 'newmodule' does not read it.
How to resolve this issue?
And one more question does all the old non modular code is by default turn into automatic-module in java 9 if i don't even modularized legacy modules?
An unnamed module is a JAR that is built without module-info. java declaration. An unnamed module will require all other modules and will export all its packages as well. Type 2: Named Module. A named module is a module that is created with a module declaration file module-info.
Defining the Java 9 module. A module is a collection of code, data, and resources. It is a set of related packages and types (classes, abstract classes, interfaces, and more) with code, data files, and some static resources.
xml module, code in modules that read java. desktop becomes dependent on java. xml . Without the requires transitive directive in java.
An Automatic Module is a JAR from the classpath that has been put in the module path. Their name is derived from the jar file name by default.
One clear way to resolve this is to make the mymodule
as an explicit module as well. This would just be the ideal world of modules I would say.
You can do that by including a module-info.java
in mymodule
as well, something like -
module mymodule {
exports com.mymodule;
}
does all the old non modular code is by default turn into automatic-module in java 9 if i don't even modularized legacy modules?
The concept of both the unnamed module and automatic module is to aid the migration and provide the compatibility with the existing classpath techniques.
On one hand, the dependencies of your module which are still not themselves modular and you would still rely on them being one, can be used on the module path for the module system to implicitly define them, when treated as automatic modules and bridge the bottom-up migration expected by JPMS.
The unnamed modules on the other hand relies on the type that is not defined in any module and is resolved to be still found on the classpath. This ensures that every type resolved is part of some module(if nothing then the unnamed module) and also provides the compatibility such that code of existing applications relying on the classpath shall compile and run similarly on module system as well.
The reason, why you would fail to declare an explicit dependence in your code is stated clearly in the doc:-
The unnamed module exports all of its packages. This enables flexible migration, as we shall see below. It does not, however, mean that code in a named module can access types in the unnamed module. A named module cannot, in fact, even declare a dependence upon the unnamed module. This restriction is intentional, since allowing named modules to depend upon the arbitrary content of the class path would make reliable configuration impossible.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With