如何让自动模块在Java 9中找到自己的资源?

Ren*_*ato 7 java java-9

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

当然,这适用于Java 8.

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

这是我的近似模块文件声明:

module my.mod {
    requires ivy; // the file is called ivy-2.4.0.jar
}
Run Code Online (Sandbox Code Playgroud)

我用这个命令运行:

java --module-path my-mod.jar:ivy-2.4.0.jar -m my.mod
Run Code Online (Sandbox Code Playgroud)

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

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

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

java --module-path modules-dir:ivy-2.4.0.jar -m my.module/my.Main
Run Code Online (Sandbox Code Playgroud)

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

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

loj*_*joe 3

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

java --add-opens ivy/<dot.separated.path.to.resources>=ALL-UNNAMED --module-path my-mod.jar:ivy-2.4.0.jar -m my.mod
Run Code Online (Sandbox Code Playgroud)