我在~/Desktop/src目录下编写了两个模块的源代码
模块myModuleA的代码
M1.java
package myPack1;
import myPack2.M2;
public class M1
{
public static void main(String[] args)
{
System.out.println("I am M1");
M2.print();
System.out.println("I am M1 Again");
}
}
模块信息.java
module myModuleA
{
requires myModuleB;
}
模块myModuleB的代码
M2.java
package myPack2;
public class M2
{
public static void print()
{
System.out.println("I am M2");
}
}
模块信息.java
module myModuleB
{
exports myPack2;
}
我将两个模块编译为:
gyan@#ns:~/Desktop$ javac --module-source-path src -d out -m myModuleA,myModuleB
桌面上创建了out目录,也就是我当前的目录。
此后,我在桌面上创建了另一个名为 OtherModule 的目录。将 myModuleB 的编译模块目录从 out 目录剪切并粘贴到目录 OtherModule 中。从目录 src 中删除了模块 myModuleB 的源目录。删除了目录。
我再次使用模块 myModuleB 的编译代码编译了模块 myModuleA:
gyan@#ns:~/Desktop$ javac --module-source-path src --module-path OtherModule -d out -m myModuleA
并成功执行代码:
gyan@#ns:~/Desktop$ java --module-path out/:OtherModule/ -m myModuleA/myPack1.M1
I am M1
I am M2
I am M1 Again
gyan@#ns:~/Desktop$
但是后来我将模块 myModuleA 的 module-info.java 文件更改为:
module myModuleA
{
requires static myModuleB;
}
我再次删除了目录并将代码编译为:
gyan@#ns:~/Desktop$ javac --module-source-path src --module-path OtherModule -d out -m myModuleA
代码编译成功。然后我尝试执行代码:
gyan@#ns:~/Desktop$ java --module-path out/:OtherModule/ -m myModuleA/myPack1.M1
I am M1
Exception in thread "main" java.lang.NoClassDefFoundError: myPack2/M2
at myModuleA/myPack1.M1.main(M1.java:8)
Caused by: java.lang.ClassNotFoundException: myPack2.M2
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
... 1 more
gyan@#ns:~/Desktop$
即使我提供了两个已编译模块的路径,此错误背后的原因是什么。
最佳答案
Optional dependencies are not resolved on their own - 即使它们存在于模块路径中。如果未解决,则不会进入 readability graph因此它们在运行时不可用 - 因此出现错误消息。
要使可选依赖项在运行时可用,它必须是第三个模块非可选需要的、在服务绑定(bind)期间解析的,或者 added manually with --add-modules
.
关于java - 在 Java 9 中使用模块化编程的可选依赖项不适用于提供的模块路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48459832/