【问题标题】:Ant failure: Exception in thread “main” java.lang.NoClassDefFoundError org/apache/tools/ant/launch/LauncherAnt 失败:线程“主”java.lang.NoClassDefFoundError org/apache/tools/ant/launch/Launcher 中的异常
【发布时间】:2013-02-28 11:42:46
【问题描述】:

我在 Fedora 17 上。我正在尝试使用与 Java 7 不兼容的 ant 构建文件编译项目。所以我决定安装 OpenJDK 6。不幸的是,JDK 6 已从 yum 存储库中删除,我想手动安装很容易。我了解到没有 JAVA_HOME 变量,而是使用了替代系统。所以我下载了 OpenJDK 二进制文件(如果重要的话,从 OSG 下载)并使用alternatives --install 命令安装了 java & javac & javaws。检查java --versionjavac --version 证明它是成功的。但奇怪的是,蚂蚁不再工作了!当我输入 ant --execdebug 时,我会收到以下消息:

exec "/usr/lib/jvm/openjdk-6.0.24/bin/java" -classpath "/usr/bin/build-classpath: 
error: JVM_LIBDIR /usr/lib/jvm-exports/openjdk-6.0.24 does not exist or is not a 
directory:/usr/bin/build-classpath: error: JVM_LIBDIR /usr/lib/jvm-exports/openjdk-6.0.24 
does not exist or is not a directory:/usr/lib/jvm/openjdk-6.0.24/lib/tools.jar"
-Dant.home="/usr/share/ant" -Dant.library.dir="/usr/share/ant/lib" 
org.apache.tools.ant.launch.Launcher -cp ""
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/tools/ant/launch/Launcher
Caused by: java.lang.ClassNotFoundException: org.apache.tools.ant.launch.Launcher
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: org.apache.tools.ant.launch.Launcher. Program will exit.

与 java 一样,也没有 ANT_HOME 变量。但是,即使在安装 java 6 之前它工作正常,也没有 ANT_HOME。 Ant 安装在已经在 PATH 中的 /usr/bin/ant 下。

更新:我知道有类似的问题qustion 1question 2。但都没有解决我的问题。例如,添加 ANT_HOME=/usr/bin 会使情况恶化,因为即使使用 JDK 7,ant 也无法正常工作!由于我对替代系统不熟悉,我完全删除了与 java 相关的替代方案,添加了 JAVA_HOME,并改为修改了 PATH。同样,java & javac 工作正常,java --version 返回正确的版本,但 ant 返回相同的错误。正如--execdebug 告诉我们的那样,JVM_LIBDIR 没有指向正确的位置。我想该值是在 java.conf 文件中设置的,所以我将它粘贴在这里(我已经在 /usr/lib/jvm 上安装了 JDK 6 和 7):

# System-wide Java configuration file                                -*- sh -*-
#
# JPackage Project <http://www.jpackage.org/>

# Location of jar files on the system
JAVA_LIBDIR=/usr/share/java

# Location of arch-specific jar files on the system
JNI_LIBDIR=/usr/lib64/java

# Location for noarch jar files using arch-specifics jar files
JAVAJNI_LIBDIR=/usr/share/java-jni

# Root of all JVM installations
JVM_ROOT=/usr/lib/jvm

# You can define a system-wide JVM root here if you're not using the
# default one.
#
# If you have the a base JRE package installed
# (e.g. java-1.6.0-openjdk):
#JAVA_HOME=$JVM_ROOT/jre
#
# If you have the a devel JDK package installed
# (e.g. java-1.6.0-openjdk-devel):
#JAVA_HOME=$JVM_ROOT/java-1.7.0-openjdk-1.7.0.9.x86_64
JAVA_HOME=$JVM_ROOT/openjdk-6.0.24

# Options to pass to the java interpreter
JAVACMD_OPTS=

只需在 java.conf 中注释和取消注释相应的行,就会发现 ant 在 7 下工作正常,在 6 下失败。当我在 ant shell 中的 java 命令之前回显 JVM_LIBDIR 时,我收到 user/share/java如 java.conf 中所述。但是ant --execdebug 却返回了一些奇怪的东西:JVM_LIBDIR /usr/lib/jvm-exports/openjdk-6.0.24。那是什么,我该如何解决?

如果你不能在这里说出问题,那么安装多个版本的JDK,可以轻松切换的最简洁和最安全的方法是什么?

非常感谢任何帮助。

【问题讨论】:

    标签: java linux ant fedora openjdk


    【解决方案1】:

    您在类路径上缺少一个 jar。确保在 ant 从中获取依赖项的 lib 文件夹中拥有所有必需的库。

    查看similar question.

    【讨论】:

    • 我没有 JAVA_ & ANT_HOME 可以吗?替代系统能否完全消除对这些变量的需求?
    • 我不确定您是如何设置的,但我会将它们留在那里,因为它们不仅仅用于您的应用程序。
    • 谢谢伙计,我如何检查类路径中的蚂蚁调用?它在哪里?
    • 不不,我知道如何在 ant 构建文件中设置类路径。在我看来,ant 本身就是一个 java 类,它被加载以理解 build.xml 文件。正如您所建议的,该类加载了错误的类路径,因此找不到主类。所以我的问题是在哪里设置运行 ant 的类路径?
    • ant classpath是你安装ant的路径?您可能希望将其设置为安装的 bin 文件夹...
    【解决方案2】:

    我只能回答最后一个问题。

    我们不使用替代系统,而是手动管理它。

    我们在 Ubuntu 和 CentOS 中所做的是,我们总是使用 Oracle JDK 网站上的 tar.gz,将其解压缩到 /opt 中的子文件夹(如 /opt/jdk_1.7.0_09),创建指向该文件夹的符号链接(如 @ 987654322@),并将我们指向 JAVA_HOME 的环境变量设置为符号链接而不是实际文件夹 (JAVA_HOME=/opt/default_jdk)。

    这样,如果我们想要更改或更新 jdk(例如从 JDK 7 upadte 9 到 JDK 7 upadte 15),我们只需下载 tar.gz 包,将其解压缩到另一个文件夹(例如 /opt/jdk_1.7.0_15) ,删除旧符号链接(指向/opt/jdk_1.7.0_09)并创建一个指向新文件夹的新符号链接(例如/opt/default_jdk -&gt; /opt/jdk_1.7.0_15)。

    同样的方式适用于 32 位和 64 位 jdks,不同版本的 Ant、Maven、Gradle 等。

    【讨论】:

    • 不只是java,javac,javaws,jar等,它们都在JAVA_HOME中。我认为一定有更好的方法。
    • “切换Java版本”是什么意思?在我们的日常使用中,它的意思是“使用另一个版本的 JDK”。我们在系统中设置的关于 JDK 的唯一内容是 JAVA_HOME 并将 $JAVA_HOME/bin 添加到 PATH。我们从不使用 Linux 发行版的替代系统,因为我们始终使用 Oracle JDK 并保留其 tar.gz 包。
    • 每当你想在版本之间切换时,你必须在实际和符号 jar、java、javac、javaw、javadoc 等之间切换所有这些符号链接。如果我是对的,那不是一个整洁的我想的方式。
    • 我们所做的只是创建一个指向 jdk 文件夹的符号链接,并将 JAVA_HOME 指向符号链接而不是实际文件夹。我们从不为可执行文件创建符号链接。
    • 即使你想在像/usr/bin这样的地方创建一些符号链接以使某些可执行文件在SSH中可用(SSH不读取~/.profile),你只需指向符号链接像/opt/default_jdk/bin/java这样的路径——当你在不同版本之间切换时,你仍然只需要删除default_jdk符号链接并创建一个新的。不用担心,系统足够智能,可以跟踪多个级别的符号链接。
    【解决方案3】:

    您的 Java 安装似乎有问题。参考这个http://www.linuxforums.org/forum/red-hat-fedora-linux/151698-problems-tomcat.html 有类似的问题,后来得到解决。

    【讨论】:

      猜你喜欢
      • 2011-05-12
      • 2018-12-16
      • 2015-03-14
      • 2011-02-10
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      • 2013-03-19
      相关资源
      最近更新 更多