【问题标题】:Java environment variables set correctly, but java is not finding the jarsJava 环境变量设置正确,但 java 找不到 jars
【发布时间】:2023-03-19 21:35:02
【问题描述】:

总结

Java 环境变量设置正确,从 echo-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”,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 =)

【问题讨论】:

  • 为什么不在类路径 C:\Documents and Settings\Administrator\My Documents\project\jar\jogl-all.jar 中添加完整的 jar 路径。检查完整路径
  • 看到>javac Mush.java -cp ./jar/jogl-all.jar你提供完整路径
  • 感谢 JB Nizet 和 Subin。虽然 jar 文件夹在类路径中,但 jar 的内容不在,它的类似 jar 是它们自己的文件夹。那么问题就变成了,我们如何递归地添加一个文件夹,以便将所有子文件夹(和 jar 内容)添加到 Classpath(程序将在哪里查看)?这个问题是单独的,已经在这里问过:stackoverflow.com/questions/402330/…

标签: java path classpath environment-variables java-home


【解决方案1】:

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

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

【讨论】:

  • 如果我有多个罐子怎么办?此外,当我使用 -cp 选项时,它不再“看到”项目文件夹中的其他文件...
  • 设置 CLASSPATH 或使用 -cp 选项传递类路径不会更改类路径中必须包含的内容。如果您有多个 jar,则需要将它们全部包含在类路径中,无论您选择什么选项。 jar 应在 *nix 上由 : 分隔,在 Windows 上由 ; 分隔:-cp c:\path\to\first.jar;c:\path\to\second.jar。类路径必须包含您项目的 jar 文件或类目录,以及您的代码所依赖的所有 jar 文件。
【解决方案2】:

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

类路径环境变量:

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 并观察一切正常运行 =)

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-06-02
      • 1970-01-01
      • 2018-01-18
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多