获取资源返回模块上下文中的空 URL



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

该程序毫无怨言地编译。它在"松散模块"文件夹中也能很好地运行,但有一个例外:它抛出了一个异常,其原因源于以下代码行:

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

introURL被分配为空。

在 Eclipse 中或从 Eclipse 导出的 jar 文件中运行程序时,将使用与调用类位于同一目录中的资源文件 (help.html( 的地址正确填充 URL。

这是我用来从"out"文件夹中的"松散模块"运行程序的命令:

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

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

src/moduleTCD/com/adonax/tanpura
/pfaudio

"主"类(入口点(是tanpura.TCDLaunch

以下是module-info.java类内容:

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)

此异常在 IOException 的 try/catch 中引发,此时调用 JEditorPane 方法 setPage,并将 null 作为参数。

textArea.setPage(introURL);

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

返回: 一个 URL 对象;null 如果未找到具有此名称的资源,则无法通过 URL 找到该资源,该资源位于 至少对调用方模块或对资源的访问权限不开放 被安全管理员拒绝。

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

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

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

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

所以,事实上,这根本不是一个Java模块的问题,只是一个疏忽,我部分归功于缺乏使用shell级Java命令的印章。

非常感谢艾伦·贝特曼!

最新更新