getResource在模块的上下文中返回null url

时间:2018-05-03 23:08:40

标签: java-9 java-module

我是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命令现在是最广泛的。但添加它并没有改变错误。我想知道我是怎么做错的,或者是否有其他我忽视的东西。

1 个答案:

答案 0 :(得分:1)

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

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

我还验证了&#34;出口&#34;在module-info中不需要声明以允许加载资源。

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

非常感谢Alan Bateman!