我是模块的初学者。我正在阅读@Nicolai Parlog 的 Java 模块系统的好书,并且我自己也做了一些简单的编码。
我有一个易于掌握的可重现示例。
我有一个像这样的简单课程。
package university.harvard;
public class Pilot{
public static void main(final String args[]){
System.out.println("My Kid JOHN Stephen Ortiz Rondon: "+java.util.Arrays.toString(args));
}
}
使用这样的 module-info.java。
module John{
exports university.harvard;
}
它看起来像这样。
我可以这样编译。
C:\Ocp11>javac -d out --module-source-path src --module John
成功,它正在创建正确的目录
我可以毫无问题地运行它。
C:\Ocp11>java -p out -m John/university.harvard.Pilot
后来我创建了一个这样的Java文件。
package unnamedmodule;
public class CallingModule extends university.harvard.Pilot{
public CallingModule(){
System.out.println("COnstructor nice");
}
public static void main(final String args[]){
System.out.println("ClassInside A UNNAMEDModule"+java.util.Arrays.toString(args));
}
}
如您所见,这是一个非常简单的类,它正在扩展
extends university.harvard.Pilot{
这是 John 模块中导出包中的类。
只要我了解自动模块以及 unamedmodule 就可以访问导出的包。如果我在这里错了,请指出我。
后来我尝试了这个命令。
C:\Ocp11>javac -d out -p out src/CallingModule.java
我收到:
src\CallingModule.java:3: error: package university.harvard is not visible
public class CallingModule extends university.harvard.Pilot{
^
(package university.harvard is declared in module John, which is not in the module graph)
但是我将 --module-path 设置为我认为编译器正在识别但无法允许访问的输出?我知道这很简单,但对我来说很重要。就像模块不允许访问模块中的导出包一样。
如果将标志放入 -classpath 它可以工作,但我想将 John 作为一个模块来处理。
将所有内容视为类路径的工作代码
C:\Ocp11>javac -d out -cp out/John src/CallingModule.java
我指的是错误的方法?如何使用/使用未命名模块中的导出包。
我在用着
java 14 2020-03-17
Java(TM) SE Runtime Environment (build 14+36-1461)
Java HotSpot(TM) 64-Bit Server VM (build 14+36-1461, mixed mode, sharing)
它看起来像这样。首先
感谢@JohannesKuhn,我的代码现在可以工作了,我错过了标志
--add-modules
现在我的命令看起来像这样。
汇编
C:\Ocp11>javac -p out --add-modules John -d out src/CallingModule.java
跑
C:\Ocp11>java -cp out -p out --add-modules John unnamedmodule.CallingModule