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

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

当然,这适用于Java 8。

我使用模块文件声明了对相关模块的依赖,通过其jar名称引用模块的名称(糟糕),并使用--module-path添加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 --add-opens ivy/=ALL-UNNAMED --module-path my-mod.jar:ivy-2.4.0.jar -m my.mod