0

我是模块的初学者。我正在阅读@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
4

0 回答 0