2

概括

Java 环境变量设置正确,从 echo-ing 中可以看出。但是,只有在 javac 命令中显式包含 jar 时才能看到 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 中设置环境变量,请参阅Java 安装的环境变量):

>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”,Mush.java是一个通过导入 java-OpenGL 库显示简单 3D 蘑菇的程序;具体来说,它导入“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;
                         ^

为了确定这是否是类路径问题,我运行了:

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

由于缺少相关类(例如由Mush.java实例化并位于同一项目文件夹中的 MushScene.java )而导致错误,但在查找 javax.media.opengl 时没有问题所以问题一定是环境变量问题!

这意味着,尽管根据 echo %classpath% 正确设置了类路径,但 java 不同意。我做错了什么?

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

注意 2:我有多个 jar,如果我最终在 jar 文件夹中使用 N 个 jar,我希望能够包含该文件夹,而不是专门命名每个 jar =)

4

3 回答 3

4

jogl-all.jar 不在您的 CLASSPATH 环境变量中。很明显,javac如果您没有在-cp选项中明确包含它,则无法从此 jar 中找到任何类。jar 本身必须在 CLASSPATH 中,而不是包含它的目录。就像在-cp选项中一样。

无论如何,我都不会使用全局 CLASSPATH 环境变量,而只会使用-cp选项。当您编译或运行另一个具有不同依赖项的 Java 项目时,这将使一切变得更容易。

于 2013-02-02T11:53:28.367 回答
1

使用环境变量执行此操作的解决方案。(警告 - 可能不是最佳做法,请参阅接受的答案)

类路径环境变量:

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

路径环境变量:

...;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\*”。这会添加该文件夹中的所有 jar。

至于路径变量,以及 sdk 的 bin 文件夹,您还需要 sdk 的 lib 文件夹,以及 jar 期望使用的任何 lib 文件夹。

然后你可以javac Mush.javajava Mush并观察一切正常 =)

于 2013-02-02T17:34:37.653 回答
1

注意不要在变量中使用分号,因为它会破坏所有方便的路径,例如: 。正如您在上面写的那样,它会导致:这显然是错误的。JAVA_HOME%JAVA_HOME%\binC:\Java\jdk1.7.0_13;\bin

于 2014-02-25T14:45:57.097 回答