Ant失败:线程“main”中的异常java.lang.NoClassDefFoundError org / apache / tools / ant / launch / Launcher

时间:2013-02-28 11:42:46

标签: java linux ant fedora openjdk

我在使用Fedora 17.我正在尝试使用与Java 7不兼容的ant构建文件编译项目。所以我决定安装OpenJDK 6.不幸的是,JDK 6从yum存储库中删除了,我想手动安装很容易。我了解到没有JAVA_HOME变量,而是使用替代系统。所以我下载了OpenJDK二进制文件(如果重要的话来自OSG)并安装了java& javac& javaws使用alternatives --install命令。检查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时,我收到{ {1}}如java.conf中所述。但是user/share/java已经返回了一些奇怪的内容:ant --execdebug。那是什么,我该如何解决?

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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:6)

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

选中此similar question.

答案 1 :(得分:2)

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

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

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

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

同样适用于32位和64位jdk,不同版本的Ant,Maven,Gradle等。

答案 2 :(得分:1)

您的Java安装看起来有问题。请参阅此http://www.linuxforums.org/forum/red-hat-fedora-linux/151698-problems-tomcat.html,其中包含稍后已解决的类似问题。