我是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命令的印章。
非常感谢艾伦·贝特曼!