【问题标题】:Setting up java classpath and java_home correctly in Ubuntu在 Ubuntu 中正确设置 java 类路径和 java_home
【发布时间】:2010-12-30 20:19:56
【问题描述】:

我收到了错误

线程“主”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 。我的第一个javaprog.class

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

非常感谢

【问题讨论】:

标签: java ubuntu path classpath java-home


【解决方案1】:

使用

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这将是一个坏主意..因为每次他都必须给出完整的路径
    • 为什么classpath环境变量会被忽略?
    • @lakshamanan - 错了。他必须学习如何以适合未来项目的方式进行操作,这些项​​目不太可能在命令行上编译和运行。
    • 这个答案就像金子一样。但是- DOS 人被搞砸了。 255 个字符的命令行。再次感谢比尔!
    • 关键是,一旦他们通过了“Hello, World”和教程,没有人会使用命令 shell 来编译或运行任何有意义的东西。这几乎不是您要解决的问题。桌面应用程序使用脚本和 Ant;部署的应用程序使用内置的约定。如果这是一件大事,Java 早在几年前就会消亡了。
    【解决方案3】:

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

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

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

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

    非常感谢您的帮助。

    【讨论】:

      【解决方案4】:

      您正在混合苹果和橙子。 命令行上的原始 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 变量中找到二进制文件。

      【讨论】:

        【解决方案5】:

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

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

        现代 java 足够聪明,您只需站在类路径的根目录中输入java <classname>,它就会工作™。

        【讨论】:

        • 你说得对,事实证明问题是当我尝试编译任何导入摆动组件的东西时,它会给出完全相同的错误。而 HelloWorld.java 的例子很好......这看起来很奇怪。
        • 哦...请注意,Windows 默认附带一个严重受损的 Java,可执行文件位于 Windows 系统类路径中。请在 DOS 提示符下执行“java -version”,看看您正在运行的 Java 版本是否是您想要的版本!
        • Ubuntu 也可以这样说;因为它附带 GNU java(至少我见过的几个 Ubuntu 系统),而不是 Sun 的 java。 'k,它不是“严重瘫痪”——但它不是 Sun 的 java。
        • 我赞成 b/c 在谷歌上没有太多关于“设置 java CLASSPATH”的内容。我误以为您仍然需要设置 CLASSPATH……但我错了。
        • JAVA_HOME 怎么样...你还需要设置那个路径变量吗?
        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

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

          类路径也可以类似设置

          【讨论】:

          • 这些变量已设置,但由于某种原因它们被忽略了。我一定有某种语法问题。
          【解决方案8】:

          您想从末尾删除 .class。只需输入...

          java -cp . myfirstjavaprog
          

          【讨论】:

          • 我很沮丧,我没有发现这个。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-01-31
          • 1970-01-01
          • 2014-07-26
          • 2020-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多