【问题标题】:How to let an automatic module find its own resources in Java 9?Java 9 如何让自动模块找到自己的资源?
【发布时间】:2017-04-23 16:40:22
【问题描述】:

我试图让我的应用程序使用 Java 9 运行,但不幸的是,当它尝试使用 classLoader.getResource(name) 加载资源时,一个普通的 jar 依赖项会得到一个 null。

这当然适用于 Java 8。

我使用模块文件声明了对相关模块的依赖关系,通过其 jar 名称(糟糕)引用模块的名称,并使用 @987654323 按原样添加了 jar(Java 9 没有自定义) @ 选项。

这是我的大概模块文件声明:

module my.mod {
    requires ivy; // the file is called ivy-2.4.0.jar
}

我用这个命令运行:

java --module-path my-mod.jar:ivy-2.4.0.jar -m my.mod

当我运行应用程序时,如果库不尝试加载该资源,它会正常工作......但如果这样做,它会在尝试使用该资源的行处获得 NullPointerException

我可以看到资源存在于 jar 文件的正确路径中。

我尝试将我的应用程序作为 jar(如上所示)和类文件运行:

java --module-path modules-dir:ivy-2.4.0.jar -m my.module/my.Main

在后一种情况下,错误是不同的,但相关:Ivy 甚至找不到它尝试从自己的 jar 加载的属性文件!

是否有任何解决方法,这是一个已知的错误,还是我做错了什么?

【问题讨论】:

  • 您从哪里获得 Java 9?发布了吗? 2017 年 06 月 15 日
  • 获取SDKMAN 并使用sdk install java 9ea167 安装。这是一个 EA(抢先体验)版本。
  • 只是无法得到问题,my-mod.jar 与 my.mod 模块文件有什么关系?你想让 my-mod.jar 依赖 ivy-2.4.0.jar 吗?
  • 如您在上面的模块文件中所见,是的。

标签: java java-9


【解决方案1】:

尝试向自动模块“ivy”添加“opens”声明。这允许访问它的资源:

java --add-opens ivy/<dot.separated.path.to.resources>=ALL-UNNAMED --module-path my-mod.jar:ivy-2.4.0.jar -m my.mod

【讨论】:

  • ALL-UNNAMED 我猜这里可能只是my.mod。我had answered 一个相关问题在资源方面做相反的事情,我已经链接了资源的encapsulation strategy。你也可以利用它。会根据dot.separated.path.to.resources 为答案增加价值。
猜你喜欢
  • 2018-10-25
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2017-11-05
  • 1970-01-01
  • 2017-07-10
相关资源
最近更新 更多