簡體   English   中英

為什么我不在類路徑中使用通配符?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM