2017-04-23 17 views
7

我試圖讓我的應用程序能夠與Java 9一起運行,但不幸的是其中一個普通的jar依賴項,當它嘗試使用classLoader.getResource(name)加載資源時,它會獲得null值。如何讓自動模塊在Java 9中找到自己的資源?

這當然,在Java 8

工作我宣佈使用模塊文件有問題的模塊的依賴關係,指的是由它的罐子名(可怕的)模塊的名稱,並添加使用--module-path選項按原樣(沒有爲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 

在後一種情況下,錯誤是不同的,但相互關聯:常春藤不能甚至找到一個它試圖從它自己的jar加載的屬性文件!

是否有任何解決方法,這是一個已知的錯誤,或者我做錯了什麼?

+0

你從哪裏得到Java 9?它被釋放? 2017 06 15 –

+2

獲取[SDKMAN](http://sdkman.io/)並使用'sdk install java 9ea167'進行安裝。這是一個EA(Early Access)版本。 – Renato

+0

只是無法得到問題,my.mod.jar與my.mod模塊文件有什麼關係? 你想讓my-mod.jar依賴於ivy-2.4.0.jar嗎? – chebus

回答

2

嘗試向自動模塊'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 
+0

'ALL-UNNAMED'可能只是'my.mod'我猜。我[回答](https://stackoverflow.com/a/46891860/1746118)一個相關的問題,在資源方面做了相反的處理,我已經將[封裝策略](https://docs.oracle .com/javase/9/docs/api/java/lang/Module.html#getResourceAsStream-java.lang.String-)。你也可以使用它。用'dot.separated.path.to.resources'來增加答案的價值。 – nullpointer

相關問題