2013-02-02 74 views
2

摘要Java環境變量設置正確,但Java沒有找到罐子

Java環境變量設置正確,從回聲-ING他們看到。但是,只有在明確包含在javac命令中時纔會看到jar。

詳細

這是不具體涉及到圖形和OpenGL,某些問題涉及到類路徑,即第三方JAR文件的進口。

使用Windows XP SP3,JDK 1.7.0_13

在Windows XP中,系統環境變量PATH/JAVA_HOME/CLASSPATH已經設置/添加到包括這些目錄:

C:\Documents and Settings\Administrator\My Documents\project\jar; 
C:\Java\jdk1.7.0_13; 
C:\Java\jdk1.7.0_13\bin; 
C:\Java\jdk1.7.0_13\lib; 

有沒有用戶定義的變量可能有衝突。從終端 保證(這是我改變環境變量,這樣它會被更新,以設置在Windows XP中的環境變量後重新啓動,看Environment variables for java installation):

>echo %classpath% 
    C:\Documents and Settings\Administrator\My Documents\project\jar;C:\Java\jdk1.7.0_13;C:\Java\jdk1.7.0_13\bin;C:\Java\jdk1.7.0_13\lib; 

>echo %java_home% 
    C:\Documents and Settings\Administrator\My Documents\project\jar;C:\Java\jdk1.7.0_13;C:\Java\jdk1.7.0_13\bin;C:\Java\jdk1.7.0_13\lib; 

>echo %path% 
    C:\WINDOWS\System32;... ...C:\Java\jdk1.7.0_13;C:\Java\jdk1.7.0_13\bin;C:\Java\jdk1.7.0_13\lib;C:\Documents and Settings\Administrator\My Documents\project\jar; 

矯枉過正,是的......當我的作品「會適當修剪,

相關文件:

C:\Documents and Settings\Administrator\My Documents\project\jar\jogl-all.jar 
C:\Documents and Settings\Administrator\My Documents\project\Mush.java 

C:\Documents and Settings\Administrator\My Documents\project\JarDir.java 

JOGL-all.jar在包含 「javax.media.opengl.GL2」,玉米粥。 java是一個通過導入java-OpenGL庫顯示簡單的三維蘑菇的程序;特別是它導入「javax.media.opengl.GL2」。

JarDir.java是我在http://www.java2s.com/Code/Java/File-Input-Output/Listfilesinajarfile.htm找到的程序,它顯示了jar中的類,我用它來證明jar內容。它也表明編譯可能在機器上。

JarDir.java如下:

import java.io.*; 
    import java.util.*; 
    import java.util.jar.*; 

    public class JarDir { 
    public static void main (String args[]) 
     throws IOException { 

     JarFile jarFile = new JarFile("C:\\Documents and Settings\\Administrator\\My Documents\\project\\jar\\jogl-all.jar"); 
     Enumeration enumy = jarFile.entries(); 
     while (enumy.hasMoreElements()) { 
     process(enumy.nextElement()); 
     } 
    } 

    private static void process(Object obj) { 
     JarEntry entry = (JarEntry)obj; 
     String name = entry.getName(); 
     long size = entry.getSize(); 
     long compressedSize = entry.getCompressedSize(); 
     System.out.println(
      name + "\t" + size + "\t" + compressedSize); 
    } 
    } 

並給出輸出:

>javac JarDir.java 

>java JarDir 
... (lots of stuff) 
javax/media/opengl/GL2.class 94123 28513 
... (lots of stuff) 

其證明成功的編譯和類的jar文件內的存在。試圖運行Mush.java給出了許多錯誤,顯著第一個:

>javac Mush.java 
Mush.java:21: error: package javax.media.opengl does not exist: 
import javax.media.opengl.GL2; 
         ^

要確定這是否是一個classpath的問題,我跑:

>javac Mush.java -cp ./jar/jogl-all.jar 

基於缺乏這給了錯誤相關類的存在(如MushScene.java這是由Mush.java實例化和生活在同一個項目文件夾中...)但找到javax.media.opengl沒有問題!所以這個問題一定是一個環境變量問題!

這就意味着,雖然根據echo%classpath%類路徑設置正確,但java不同意。我做錯了什麼?

注意:Mush.java程序已經在Linux上進行了演示。

注2:我有多個罐,如果我最終使用jar文件夾內的N個廣口瓶,我想能夠包括的文件夾,而不是專門命名每個罐子=)

+1

爲什麼不在類路徑'C:\ Documents and Settings \ Administrator \ My Documents \ project \ jar \ jogl-all.jar'中添加完整的jar路徑。檢查完整路徑 – Subin

+0

請參閱當您執行'> javac Mush.java -cp。/ jar/jogl-all.jar'時,請提供完整路徑 – Subin

+0

感謝JB Nizet和Subin。儘管jar文件夾位於類路徑中,但jar文件的內容不是,它的jar文件夾就是它們自己的文件夾。 接下來的問題就是,我們如何遞歸地添加一個文件夾,以便所有子文件夾(和jar內容)都被添加到Classpath(程序看起來)?這個問題是單獨的,並已在這裏問:http://stackoverflow.com/questions/402330/is-it-possible-to-add-to-classpath-dynamically-in-java – xxjjnn

回答

4

JOGL-所有.jar不在您的CLASSPATH環境變量中。顯然,如果javac沒有在-cp選項中明確包含它,則無法從此jar中找到任何類。 jar本身必須位於CLASSPATH中,而不是包含它的目錄。就像在-cp選項中一樣。

反正我不會使用全局CLASSPATH環境變量,但只有-cp選項。當你編譯或運行另一個具有不同依賴關係的Java項目時,它會使所有事情變得更加容易。

+0

如果我有多個罐子?另外,當我使用-cp選項時,它不再「看到」項目文件夾中的其他文件... – xxjjnn

+0

設置CLASSPATH或使用-cp選項傳遞類路徑不會更改必須在類路徑中的內容。如果你有幾個罐子,你需要把它們都包含在classpath中,無論你選擇什麼選項。這些jar應該用*:nix上的':'和Windows上的';'分開:-cp c:\ path \ to \ first.jar; c:\ path \ to \ second.jar。類路徑必須包含您的項目的jar文件或classes目錄,以及代碼依賴的所有jar文件。 –

1

使用環境變量進行解決方案。 (警告 - 可能不是最好的做法,請參閱接受的答案)

CLASSPATH環境變量:

C:\Documents and Settings\Administrator\My Documents\project\jar\*; 

Path環境變量:

...;C:\Documents and Settings\Administrator\My Documents\project\jar;C:\Java\jdk1.7.0_13;C:\Java\jdk1.7.0_13\bin;C:\Java\jdk1.7.0_13\lib;C:\Documents and Settings\Administrator\My Documents\project\lib; 

注意添加的jar文件夾是錯誤的 - 你需要反斜槓和星號:「jar \ *」在你的類路徑變量中。這添加了該文件夾中的所有罐子。

至於路徑變量以及sdk的bin文件夾,還需要sdk的lib文件夾,以及您的罐子打算使用的lib文件夾。

然後你就可以的javac Mush.javajava的玉米粥,看着一切完美=)

1

小心不要使用分號在JAVA_HOME變量,因爲這會毀了一切方便的路徑如:%JAVA_HOME%\bin。正如你在上面寫的那樣,它會導致:C:\Java\jdk1.7.0_13;\bin這顯然是錯誤的。