java - 在 Java 9 中使用模块化编程的可选依赖项不适用于提供的模块路径

标签 java java-9 modularity

我在~/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/

相关文章:

wpf - Prism 、MVVM 和模块化

communication - EventAggregator vs CompositeCommand

java - 在 Maven 中检测不兼容的依赖项?

java - JRE 何时完全停止作为单独的产品?

java - 动态发生异常后运行一些逻辑

spring - Java 9项目结构问题

eclipse - xxSkin 类中的深度反射失败

objective-c - 在Xcode中组织大型Cocoa应用程序源代码的最佳方法是什么?

用于离屏渲染的 Java Graphics(2D)

Java 方法 CharAt 在与 # 比较时崩溃