我為在 Ubuntu 11.04 伺服器發行版上運行的專案安裝了sun-java6-jdk
和sun-java6-jre
(以及可能的其他相關 java6 軟體包,例如字體)。我們的專案以程式設計方式從正在運行的可執行檔中呼叫 Javadoc。為此,我們顯然需要知道 tools.jar 檔案的位置,該檔案是 JDK 發行版的一部分,而不是 JRE 發行版的一部分。軟體包被安裝到/usr/lib/jvm/java-6-sun-1.6.0.26/
兩個區域(JDK/JRE)下,有 bin 和其他目錄,它們提供各種標準二進位。
每當我們執行 java 程式(透過 java 二進位)時,內部 java.home 變數似乎會覆寫提供的任何 JAVA_HOME 環境變數。我們得出的結論是,二進位檔案從二進位檔案的路徑中派生出其 java.home。 jdk下的java二進位檔案其實是jre版本的連結。因此,無論您「執行」哪一個,您總是會獲得 jre 版本,因此 java.home 目錄被定義為/usr/lib/jvm/java-6-sun-1.6.0.26/jre
.
因此,任何正在運行的可執行文件似乎都無法找到該tools.jar
文件,甚至傳遞該-cp /usr/lib/jvm/java-6-sun-1.6.0.26/jdk/lib/tools.jar
選項也無濟於事。我們希望有人可以幫助闡明我們如何正確存取該tools.jar
文件,使我們能夠正確地呼叫該com.sun.tools.javadoc.Main.execute
方法。
執行範例:
java -cp /usr/lib/jvm/java-6-sun/lib/tools.jar -jar comtor.jar -sourcepath .
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javadoc/Main
at comtor.Comtor.main(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.sun.tools.javadoc.Main
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 1 more
答案1
嗯,這是一個 hack,但我們最終將tools.jar
檔案複製到目錄中jre/lib/ext
,就像我們安裝第 3 方 jar 檔案作為擴充一樣。這似乎是一種不自然的行為,我們應該透過選項-cp
(嘗試過但失敗)或透過環境變數(也嘗試過但也失敗)在命令列上執行某些操作。