Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ant失败:线程中出现异常“;主&x201D;java.lang.NoClassDefFoundError org/apache/tools/ant/launch/Launcher_Java_Linux_Ant_Fedora_Openjdk - Fatal编程技术网

Ant失败:线程中出现异常“;主&x201D;java.lang.NoClassDefFoundError org/apache/tools/ant/launch/Launcher

Ant失败:线程中出现异常“;主&x201D;java.lang.NoClassDefFoundError org/apache/tools/ant/launch/Launcher,java,linux,ant,fedora,openjdk,Java,Linux,Ant,Fedora,Openjdk,我戴着Fedora 17。我正在尝试编译一个带有ant构建文件的项目,该文件与Java7不兼容。所以我决定安装OpenJDK 6。不幸的是,JDK 6已从yum存储库中删除,我认为手动安装它会很容易。我了解到没有JAVA_HOME变量,而是使用替代系统。因此,我下载了OpenJDK二进制文件(如果有必要,可以从OSG下载),并使用alternations--install命令安装了java&javac&javaws。检查java--version和javac--version证明它是成功的。但奇

我戴着Fedora 17。我正在尝试编译一个带有ant构建文件的项目,该文件与Java7不兼容。所以我决定安装OpenJDK 6。不幸的是,JDK 6已从yum存储库中删除,我认为手动安装它会很容易。我了解到没有JAVA_HOME变量,而是使用替代系统。因此,我下载了OpenJDK二进制文件(如果有必要,可以从OSG下载),并使用
alternations--install
命令安装了java&javac&javaws。检查
java--version
javac--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变量。但即使在安装Java6之前,也没有一个ANT_主页,因为它工作正常。Ant安装在路径中已有的/usr/bin/Ant下

更新:我知道也有类似的问题。但都没有解决我的问题。例如,添加ANT_HOME=/usr/bin会恶化这种情况,因为ANT甚至不能与JDK 7一起工作!由于我不熟悉备选方案系统,我完全删除了与java相关的备选方案,添加了java_HOME,并修改了PATH。同样,java和javac工作正常,java-version返回正确的版本,但ant返回相同的错误。正如
--execdebug
告诉我们的,JVM_LIBDIR没有指向正确的位置。我假设该值是在java.conf文件中设置的,所以我将其粘贴到这里(我已经在/usr/lib/jvm上安装了JDK 6和7):

#系统范围Java配置文件-*-sh-*-
#
#JPackage项目
#jar文件在系统上的位置
JAVA_LIBDIR=/usr/share/JAVA
#特定于arch的jar文件在系统上的位置
JNI_LIBDIR=/usr/lib64/java
#使用arch specifics jar文件的noarch jar文件的位置
JAVAJNI_LIBDIR=/usr/share/JAVAJNI
#所有JVM安装的根目录
JVM\u ROOT=/usr/lib/JVM
#如果不使用
#默认的一个。
#
#如果您安装了基本JRE软件包
#(例如java-1.6.0-openjdk):
#JAVA_HOME=$JVM_ROOT/jre
#
#如果您安装了一个develjdk包
#(例如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
#传递给java解释器的选项
JAVACMD_选项=
通过在java.conf中注释和取消注释相应的行,可以看出ant在7中工作正常,而在6中工作失败。当我回显ant shell中
java
命令之前的JVM_LIBDIR时,我收到了java.conf中所述的
user/share/java
。但是
ant--execdebug
返回了一些奇怪的东西:
JVM_LIBDIR/usr/lib/JVM exports/openjdk-6.0.24
。这是什么?我该如何修复它

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


非常感谢您的帮助。

您在类路径上丢失了一个jar。确保在lib文件夹中有所有必需的库,ant从中提取依赖项


勾选这个

我只能回答最后一个问题

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

我们在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包,将其解压缩到另一个文件夹(例如
/opt/jdk_1.7.0_15
),删除旧的符号链接(指向
/opt/jdk_1.7.0_09
),并创建一个指向新文件夹的新链接(例如,
/opt/default_jdk->/opt/jdk_1.7.0_15


同样的方法也适用于32位和64位JDK、不同版本的Ant、Maven、Gradle等。

您的Java安装似乎有问题。请参考稍后解决的类似问题。

我没有Java\u和Ant\u主页可以吗?替代系统是否可以完全消除对这些变量的需要?我不确定如何解决你已经设置好了,但我会把它们放在那里,因为它们不仅仅用于你的应用程序。谢谢,伙计,我如何检查ant调用的类路径?它在哪里?不,不,我知道如何在ant构建文件中设置类路径。在我看来,ant本身是一个java类,它被加载以理解build.xml文件。正如你所建议的类加载了错误的类路径,因此找不到主类。所以我的问题是,在哪里设置了运行ant的类路径?ant类路径是您安装ant的路径?您可能希望将其设置到安装的bin文件夹中…不仅仅是java、javac、javaws、jar等。它们都在java_主页中。我认为一定有更好的方法呃,你说的“切换Java版本”是什么意思?在我们的日常使用中,它的意思是“使用另一个版本的JDK”。我们在系统中设置的关于JDK的唯一内容是
JAVA_HOME
并将
$JAVA_HOME/bin
添加到PATH。我们从不使用Linux发行版的替代系统,因为我们总是使用Oracle JDK并保留其tar.gz包。每当您想要在版本之间切换时,您必须在ac之间切换所有这些符号链接实际和符号jar、java、javac、javaw、javadoc等等。如果我是对的,我认为这不是一种整洁的方式。我们所做的只是创建一个指向jdk文件夹的符号链接,并将java_指向
# 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=