如何让自动模块在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