[英]Why do wildcard import statements use classpath jar class instead of jdk classes?
[英]Why would I not use a wildcard in my classpath?
在我的類路徑中使用Java 6通配符有什么缺點嗎? 例如
C:> set CLASSPATH=.\lib\*
我可以看到,如果有兩個罐子都包含一個具有相同路徑的類,那么使用通配符可能會導致難以追蹤的結果。
但除此之外,還有什么需要注意的嗎?
如果這是你想要做的,那就去做吧。 只要你知道后果。 請記住,如果其他人必須維護項目,他們可能會將一堆罐子復制到該文件夾中,而不會意識到默認情況下它們會被鏈接。 但是,不應該花太多時間才能看到發生了什么。
我通常會盡量減少我使用的jar文件的數量,並手動將它們全部鏈接起來。 我意識到這是個人偏好。
您可以通過這樣做加載不需要的類,如果同一個庫有兩個版本; 好吧,kaboom。
顯式類路徑可以作為應用程序所依賴的庫(以及可能的版本!)的文檔。
如果您使用通配符,則會丟失此信息 - 如果沒有在其他地方記錄,那么如果有人獲得沒有lib
文件夾的應用程序副本(或者您意外刪除它),他們將很難通過重復跟蹤所有依賴項運行應用程序,查看ClassNotFoundError
並希望所有庫都使用合理的包名稱。
你可能會給JVM提供很多搜索的地方,這可能會在加載類時帶來一些開銷 - 我想一個聰明的JVM會有效地做到這一點。
我的第一反應是不使用env.CLASSPATH ,但在第二個想法,並在思考為什么不應該這樣做時,我開始喜歡這個想法,至少對於本地開發和測試環境(至少有一段時間)
這種方法的優點是你可以保留一個包含所有公共庫的本地文件夾(log4j,dom4j,joda time,google collections,apache commons zoo,...)。 因此,您可以從shell編譯和執行所有應用程序,而不必浪費時間鍵入長類路徑參數。
並且您仍可以自由使用-cp
參數,因為它取代了全局CLASSPATH
設置。
我永遠不會在生產系統上使用它。 有人改變該文件夾或CLASSPATH
變量的內容並且我的應用程序不再起作用的風險很高。
因此,對於生產,類路徑字符串中沒有全局“CLASSPATH”且沒有通配符。
在上述環境中使用通配符路徑的缺點 :一段時間后,太多項目依賴於單個庫文件夾。 您不知道更新庫或刪除舊庫的副作用。 對於大型應用程序,可能很難找到池中哪些庫真正需要。 您最終可能會將未使用的庫添加到產品中,因為您不確定應用程序是否在沒有該庫的情況下運行。
所以我的結論 - 開發,測試,原型設計的一個很好的捷徑,但生產風險很大。 對於生產,我更喜歡(自動生成)沒有通配符的類路徑字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.