2017-03-21 63 views
0

因此,我編寫了自己的後端並將其轉換爲工件(依賴項)。該依賴包含三個.json文件。它的目錄樹如下:無法找到依賴項中的Json文件

/resources/ 
/com/ 
/META-INF/ 

現在,當我試圖依賴作爲一個庫添加到另一個項目(訪問方法等)被拋出此消息:

java.io.FileNotFoundException: C:\Users\Yasin\Desktop\LeagueLookup\data\deps\resources\masteries.json (The system can not find the path specified) 
    at java.io.FileInputStream.open0(Native Method) 
    at java.io.FileInputStream.open(FileInputStream.java:195) 
    at java.io.FileInputStream.<init>(FileInputStream.java:138) 

這是依賴內部的代碼:

public static String PROJECT_ROOT_DIR = new File(Config.class.getProtectionDomain().getCodeSource().getLocation().getPath()).getParent(); 

public static String RESOURCES = PROJECT_ROOT_DIR + "/resources/"; 

public static File MASTERIES = new File(RESOURCES + "masteries.json"); 

這是結局,當我SYSOUT依賴內PROJECT_ROOT_DIR路徑

C:\Users\Yasin\Desktop\Riot-API\out\production 

當我在後端創建一個類並在其上運行代碼時,一切正常,但當我嘗試將該依賴項用於另一個項目時,所有事情都會混淆。

我也有它與它一起工作的真正路徑

它看起來是這樣的:

C:\Users\Yasin\Desktop\LeagueLookup\data\deps\main.jar\resources\masteries.json 

但沒有藏漢工作(我讀的地方使用一個InputStream,試過了,但它總是給我空,儘管路徑是完美的) 我的目標: 我想使API使用它自己的數據,我不想從另一個來源獲取數據,但我自己的來源。

希望你能幫助我

+0

沒有人能幫助我嗎? – Sh0ck

+0

有時需要時間讓其他人瞭解您的問題;)我們沒有得到我們的幫助支付 – FibreFoX

+0

是的,我忘了xD謝謝 – Sh0ck

回答

1

你可能誤解了java應用程序是如何構建的。

編寫java應用程序(主要是)會導致擁有JAR文件,這些文件會在任何地方執行。如果您需要訪問存儲在您生成的JAR文件內的某個文件(請使用諸如maven或gradle之類的東西),則可以使用一些InputStream。您通過Config.class.getProtectionDomain().getCodeSource().getLocation().getPath()進行處理是錯誤的,因爲有關源代碼的信息可能會從已編譯的.class-文件中刪除,特別是在共享/發送應用程序時會有所不同。

對於有你的JAR文件裏面的一些存儲文件的某些InputStream的,你必須這樣做:

ClassLoader.getSystemClassLoader().getResourceAsStream("resources/masteries.json") 

爲「資源」是的罐子裏面沒有默認結構,你可能需要雙精度檢查你的jar文件裏面是什麼。

+0

這就是我所需要的。我總是有點理解它,我認爲我只是使用了錯誤的類加載器(看起來像ClassLoader#getSystemClassLoader支持在根目錄中搜索資源)。所以我在其他嘗試中犯的錯誤是使用了錯誤的類。非常感謝你的親切先生。 – Sh0ck

+0

當使用'Config.class.getClassLoader()。getResourceAsStream(「masteries.json」)'時,文件應該與Config-class在同一個包中。我經常忘記這個;) – FibreFoX

+0

我有點知道它,但我不知道如何編輯路徑,以便它通向jar中的根目錄。謝謝你! – Sh0ck

相關問題