9

我收到错误

线程“主”java.lang.NoClassDefFoundError 中的异常:

当我尝试在 Ubuntu 上运行已编译的类时。我正在使用一个非常简单的 Helloworld 示例,互联网上已经存在的数百万个响应表明我的 CLASSPATH 和 JAVA_HOME 变量设置不正确。

但是,我已将 etc/environment 编辑到正确的文件夹以及当前文件夹:

PATH=".:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"

JAVA_HOME="/usr/lib/jvm/java-1.5.0-sun/"

CLASSPATH=".:/usr/lib/jvm/java-1.5.0-sun/lib"

当我键入 set 命令时它们会出现。无论如何,即使我使用手动设置类路径

须藤 java -cp 。myfirstjavaprog.class

我犯了同样的错误。我还应该去哪里看?这一定是配置问题。

非常感谢

4

8 回答 8

6

你想从最后删除 .class 。只需键入...

java -cp . myfirstjavaprog
于 2009-12-29T17:02:48.203 回答
5

我强烈建议去掉 CLASSPATH 环境变量,或者至少去掉你的 JRE/JDK。

"."除非另有说明,否则隐含在类路径中。从 Java 1.3 开始,Java 已经足够聪明,可以根据 javac/java 可执行文件的执行路径找到自己的运行时和库。从那时起,在类路径上指定那些是多余的,如果不是完全错误的话。当然.../lib是不正确的,因为那里只有罐子,没有类,如果它们没有单独和明确命名,它们就不会从类路径中提取出来。

现代 java 足够聪明,您可以java <classname>在类路径的根目录中输入,它会 Just Work™。

于 2009-12-29T17:26:21.837 回答
1

不,我认为是 CLASSPATH 环境变量被忽略了。

正确的做法是在编译和运行时使用 -classpath 选项。为每个项目设置它。你眼前的证据告诉你确实如此。

为什么忽略 CLASSPATH?几个原因:

  1. 这是一个已经失宠的 Java 1.0 工件。
  2. JVM 无法保证您已将其设置为环境变量。
  3. IDE 有自己的要求,所以他们不依赖它。
  4. Java EE 应用程序服务器有自己的要求,因此它们不依赖它。
  5. 你必须每次都给出完整的路径,因为每个项目都可能不同。一旦您通过“Hello, World”,您会发现自己编写脚本或使用 Ant 和 Maven 等工具来帮助您为项目设置 CLASSPATH。
于 2009-12-29T17:03:11.993 回答
1

你正在混合苹果和橙子。命令行上的原始 java 或 javac 调用需要一个类路径来知道它可以在哪里访问其类。当你跑

java -cp pathelement1:pathelement2... MyClass

您正在为 java 提供查找可运行类的位置列表。除非您告诉它,否则它不会在其他任何地方查找,包括“.”。所以“CLASSPATH”对你没有帮助,除非你跑

java -cp $CLASSPATH MyClass

换句话说,它只是不断重新输入类路径的捷径。

许多程序被配置为使用 JAVA_HOME,但最终运行 java 程序只需要一个配置的类路径和 java 的路径(它们通过 JAVA_HOME 变量找到它,所以你仍然需要它来处理 ant 之类的东西,但它在概念上仍然只是一个快捷方式以及)。

您的 PATH 是系统查找二进制文件的路径。如果 java 不在您的路径上(键入“which java”,它会显示哪个 java 在您的路径上)运行 /full/path/to/java 与仅运行“java”并拥有系统相同在 PATH 变量中找到二进制文件。

于 2009-12-29T17:28:51.100 回答
1

采用

sudo update-java-alternatives -s java-6-openjdk

它设置了很多类路径的东西。

于 2011-05-14T18:58:12.297 回答
0

对于设置 java_home 变量,这里是说明。

http://luckydev07.blogspot.com/2009/08/setting-javahome-in-ubuntu-linux.html

类路径可以类似地设置

于 2009-12-29T17:09:20.980 回答
0

我强烈建议您花一些时间查看 Sun 教程。它会在以后帮助你——类路径是臭名昭著的麻烦制造者。

http://java.sun.com/docs/books/tutorial/getStarted/TOC.html

于 2009-12-29T17:13:39.943 回答
0

好的,我在错误的地方寻找问题。事实证明,Java 很好,我是两个不同问题的相同错误的受害者。

我最初试图运行一个从 Java 网站获得的 swing 示例,但我没有注意到它有一个包定义。我已经设置了正确的文件夹结构,现在它运行良好。

当我尝试运行 HelloWorld 示例时,我不小心包含了 .class 扩展名。

这两个问题都给了我 ClassNotFound 错误。

非常感谢您的帮助。

于 2009-12-29T18:13:49.183 回答