我是Java Modularity的新手。我使用的是Java 9。
该程序无需投诉即可编译。它也可以从"爆炸模块中完美运行。文件夹,但有一个例外:它抛出一个异常,其原因来自以下代码行:
URL introURL = AboutPanel.class.getResource("help.html");
introURL
被指定为null。
在Eclipse中运行程序时,或者从Eclipse导出的jar文件中运行该程序时,URL将使用与调用类位于同一目录中的资源文件(help.html)的地址正确填充。
这是我用来从"爆炸模块"运行程序的命令。那是在" out"文件夹:
java -p out/ -m moduleTCD/com.adonax.tanpura.TCDLaunch
该项目包含两个包,我将它们捆绑在一个模块中。
src/moduleTCD/com/adonax/tanpura
/pfaudio
" main" class(入口点)是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)
在使用null作为参数调用JEditorPane方法setPage时,在IOException的try / catch中抛出此异常。
textArea.setPage(introURL);
起初,我的module-info.java中没有导出行,但是当我从Class.getResource
的API中读取以下内容时添加了该行:
返回: 一个URL对象; null如果找不到具有此名称的资源,则无法通过URL找到该资源,该资源位于包中 至少对调用者模块或对资源的访问不开放 被安全经理拒绝。
这增加了模块Java.base中Class
可能需要包的可能性。那里的exports
命令现在是最广泛的。但添加它并没有改变错误。我想知道我是怎么做错的,或者是否有其他我忽视的东西。
答案 0 :(得分:1)
我的经典错误。我假设错误与技术有关,这对我来说是新的和不熟悉的,而不是先验证显而易见的。
失败的原因是没有意识到javac命令没有将所需的资源移动到目标文件夹系统中。
我还验证了&#34;出口&#34;在module-info中不需要声明以允许加载资源。
所以,事实上,这根本不是一个java模块问题,只是一种疏忽,我认为部分原因是缺少使用shell级别Java命令的chops。
非常感谢Alan Bateman!