模块上下文中的 getResource return null url

getResource return null url in context of module

我是 Java 模块化的新手。我正在使用 Java 9.

程序顺利编译。它也 运行 来自 "exploded module" 文件夹,但有一个例外:它抛出一个异常,其原因源于以下代码行:

URL introURL = AboutPanel.class.getResource("help.html");

introURL 被分配为空。

当 运行在 Eclipse 中运行程序时,或者从 Eclipse 导出的 jar 文件中,URL 会正确填充资源文件 (help.html) 的地址与调用 class.

在同一目录中

这是我用来 运行 来自 "out" 文件夹中的 "exploded module" 程序的命令:

java -p out/ -m moduleTCD/com.adonax.tanpura.TCDLaunch  

该项目由两个包组成,我将它们捆绑在一个模块中。

src/moduleTCD/com/adonax/tanpura
                        /pfaudio

"main"class(入口点)是tanpura.TCDLaunch

这里是module-info.javaclass内容:

module moduleTCD {
    exports com.adonax.tanpura;

    requires java.base;
    requires java.desktop;
}

尝试从命令行 运行 时的错误语句:

java.io.IOException: invalid url
    at java.desktop/javax.swing.JEditorPane.setPage(Unknown Source)
    at moduleTCD/com.adonax.tanpura.documentation.AboutPanel.<init>(AboutPanel.java:28)
    at moduleTCD/com.adonax.tanpura.panels.ControlPanel.initializeHelpPanel(ControlPanel.java:525)
    at moduleTCD/com.adonax.tanpura.panels.ControlPanel.<init>(ControlPanel.java:163)
    at moduleTCD/com.adonax.tanpura.TCDLaunch.main(TCDLaunch.java:43)

在使用 null 作为参数调用 JEditorPane 方法 setPage 时,在 IOException 的 try/catch 中抛出此异常。

textArea.setPage(introURL);

起初,我的模块中没有导出行-info.java,但是当我从 API 中为 Class.getResource 阅读以下内容时添加了它:

Returns: A URL object; null if no resource with this name is found, the resource cannot be located by a URL, the resource is in a package that is not open to at least the caller module, or access to the resource is denied by the security manager.

这增加了模块 Java.base 中的 Class 可能需要该软件包的可能性。 exports 现在的命令是最广泛的。但是添加它并没有改变错误。我想知道我这样做的方式是否有问题,或者我是否忽略了其他事情。

我的经典错误。我假设错误与我不熟悉的新技术有关,而不是首先验证显而易见的。

失败是因为没有意识到 javac 命令没有将所需的资源移动到目标文件夹系统中。

我还验证了模块信息中不需要 "exports" 语句来允许加载资源。

所以,事实上,这根本不是 java 模块问题,只是一个疏忽,我认为部分原因是缺乏使用 shell 级别 Java 命令。

非常感谢 Alan Bateman!