Debian 上的 Java 庫應該如何工作?
我剛剛在 Debian Wheezy 上安裝 activemq 經歷了很多痛苦。
apt-get install activemq
安裝了很多包 - openjdk-jre + 大量庫,據我所知,所有這些都以 /usr/share/java 結尾。有了一個完全基本的配置,activemq 就可以正常啟動,但是一旦我將任何身份驗證或授權部分添加到我的配置中,它就會出現 NoClassDefFound 錯誤org.objectweb.asm.commons.EmptyVisitor
。這個類肯定是由 /usr/share/java/asm3-all.jar 提供的,它很高興地安裝在我的系統上,大概是由於在 activemq 包中指定的依賴關係。那麼給了什麼?經過更多的探勘,事實證明,執行 activemq 所需的大多數 jar也直接安裝在
/usr/share/activemq/lib
- 包括 asm3.jar 中,但至關重要的是,不是 asm3-all.jar,其中包含有問題的類。作為一個實驗,我將 jar 從 /usr/share/java/ 複製到了 activemq lib 目錄……一切都很好。所以我的問題是:如果 activemq 包實際上不使用其中任何一個,為什麼要在/usr/share/java 中安裝 150+MB 的 jar?在我作為一名 Java 程序員的日子裡,我會假設一個 Java 應用程序只需要捆綁其所有依賴項並完成它,但是 activemq 將所有這些庫作為依賴包拉入這一事實似乎表明有人不這麼認為…或者這只是一個球?
這就是我認為我將開始在 Java 上稱為“Linux 效應”的東西。當您為 Java 和基於 Java 的應用程序使用包安裝程序時,這些應用程序是根據通用 Linux 標準安裝的:/etc 用於配置,/usr 用於二進製文件,/bin 用於執行檔等。它將位分散到這樣的程度我從來沒有飛躍理解它是如何組織的。作為一名同時使用 RHEL 和 Ubuntu 的 Java 開發人員,我從未將包安裝程序用於任何 JDK 或 Java 應用程序——尤其是從那時起,我必須記住兩個發行版中的內容。正如您所說,大多數 Java 應用程序都是一個簡單的“下載並解壓到…”來讓它們執行。然後,這一切都在一個地方,毫無疑問在哪裡尋找東西。