如果我有classpath中相同名稱的多個文件(例如我有多個.jar
與log4j.properties
),什麼是JVM如下,以選擇一個規則?Java:類路徑JVM上的多個資源中的哪一個需要?
回答
它是由在其中的資源(即通常jar文件)使用-classpath
選項指定的順序指定。類路徑中'較早'的資源優先於後面指定的資源。這也可以在應用程序的清單文件中設置,然後您不需要提供-classpath
選項。您可能需要檢查these articles關於如何使用清單文件。
的「類是如何發現」的詳盡的描述可以發現here,其中上JAR類路徑類的部分描述的JAR-文件搜索的邏輯。
ClassLoader確定其中資源將位於(由ClassLoader的JavaDoc的拍攝):
ClassLoader類使用委託模型來搜索類和資源。每個ClassLoader實例都有一個關聯的父類加載器。當要求找到一個類或資源,一個ClassLoader的實例將委託的類或資源於它的父類加載器搜索試圖找到類或資源本身之前。虛擬機內置的類加載器稱爲「引導類加載器」,它本身沒有父類,但可以作爲ClassLoader實例的父類。
因此,無論在你的代碼類的getResource#或#類的getResourceAsStream被調用,發生這種情況(從Class.java拍攝)
public java.net.URL getResource(String name) {
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null) {
// A system class.
return ClassLoader.getSystemResource(name);
}
return cl.getResource(name);
}
ClassLoader.java:
public URL getResource(String name) {
URL url;
if (parent != null) {
url = parent.getResource(name);
} else {
url = getBootstrapResource(name);
}
if (url == null) {
url = findResource(name);
}
return url;
}
其中的ClassLoader實際上#findResource將被ClassLoader實現覆蓋。這意味着行爲是在應用服務器上的不同,一個Tomcat或者如果你是從一個jar文件運行時,它依賴於環境的類加載器實現您目前英寸
Here是一個例子,你可以使用跟蹤你的具體情況下發生了什麼。
確實,它是依賴於類加載器的,但是因爲我正在使用Java SE和標準類加載器,所以另一個答案適用。 –
這應該添加使用通常的URLClassLoader時發生的情況,並使用多個jar /目錄。 –
- 1. 多個資源中的相同路徑
- 2. RestEasy的多個資源路徑華林
- 3. 是否有一個相當於Files.newDirectoryStream資源類路徑上的
- 4. 瓶:調用類,需要一個資源
- 5. 資源類路徑
- 6. 類路徑資源的java.nio.file.Path
- 7. 需要哪個相對路徑
- 8. 澤西資源與多個路徑
- 9. Java的路徑中的src/main /資源
- 10. Java的:當一個類需要在JVM中被加載兩次多?
- 11. Java Mac appbundle資源路徑
- 12. 類路徑中資源的MissingResourceException
- 13. jar中的類路徑資源
- 14. Eclipse:在類路徑上查找資源
- 15. 兩個資源之間的路徑
- 16. java.io.FileNotFoundException:類路徑資源
- 17. 設置類路徑資源
- 18. drools DRL類路徑資源
- 19. 的java + CMD:類路徑的資源文件中未發現
- 20. 只需要多個路徑上的公共節點 - Neo4j Cypher
- 21. 在Java類路徑,澄清需要
- 22. Spring - 類路徑資源中的相對路徑
- 23. 春季類路徑資源中的相對路徑
- 24. 如何將Core Data類路由到多個資源路徑在RestKit中?
- 25. Java獲取資源的相對路徑
- 26. 資源上的多個ReaderWriterLockSlim
- 27. 資源路徑添加到一個UIWebView科爾多瓦IOS
- 28. HHVM定製HDF配置需要完整的資源路徑
- 29. 無法獲取類路徑的資源
- 30. 如何創建一個需要執行java類路徑的安裝程序
如果我使用Maven,這是否意味着它是事實上的隨機的?在測試時設置classpath(MANTIME.MF中的類路徑不起作用)(jar從本地回購中獲取) –
由於Maven 2.0.9,可以像這裏描述的那樣進行處理(http://stackoverflow.com/questions/793054/) Maven的classpath中階的問題)。 – mouser
任何官方文件,確認'資源「早」在classpath中優先於,是經過them.'指定的資源? –