Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.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
Java 日食赢了';无法编译,类文件错误,版本错误_Java_Eclipse - Fatal编程技术网

Java 日食赢了';无法编译,类文件错误,版本错误

Java 日食赢了';无法编译,类文件错误,版本错误,java,eclipse,Java,Eclipse,我正在尝试编译从另一个开发人员那里签出的SVN代码。最近日食给我带来了很多麻烦 以下是我的项目特定设置: 这是我的ant文件的编译部分的内容: <target name="compile" depends="build-common, init" description="Compile files. "> <javac srcdir="${src_dir}" destdir="${build_dir}" debug="true" > <c

我正在尝试编译从另一个开发人员那里签出的SVN代码。最近日食给我带来了很多麻烦

以下是我的项目特定设置:

这是我的ant文件的编译部分的内容:

<target name="compile" depends="build-common, init" description="Compile files. ">
    <javac srcdir="${src_dir}" destdir="${build_dir}" debug="true" >
        <classpath path="${tomcat_home}/lib/servlet-api.jar;" />
    </javac>
</target>
这个错误意味着什么

坏的类文件:C:\ProgramFiles\Java\jre1.6.0\U 07\lib\rt.jar(Java/io/IOException.class)
类文件的版本49.0错误,应为48.0


很明显,所提到的类文件是使用生成49.0版类文件的编译器编译的,而ant则希望使用生成48.0版类文件的编译器编译。由于所讨论的类是JRE的一部分,因此您需要更新
build.xml
中的类路径,以包含包含48.0版类文件的JRE。

您似乎正在使用1.5版java编译器运行Ant,但编译时使用的是1.6版安装的类库(rt.jar)。您应该设置build.xml,以便它能够一致地使用相同java版本的两个(编译器和类库)。

49.0的类文件版本属于java 1.5.x,而48.0的类文件版本属于java 1.4.x版本。由于Java语言规范中引入了一些新特性和更改,类文件结构在1.5中发生了变化

从错误中,可以推断出预期的是Java 1.4类文件,而找到的是Java 1.5类文件。该编译器似乎是Java 1.4编译器,因此您应该尝试验证是否使用了正确的Java编译器版本以及正确的JDK(即JDK home)

附录

Ant倾向于在$JAVA_HOME/bin/javac中查找javac可执行文件。如果JAVA_HOME环境变量设置不正确,比如说设置为JAVA 1.4 HOME,那么即使在Eclipse中也有可能出现所描述的错误

附录2


向PATH环境变量中添加条目可能会改变Ant的搜索类路径行为,可能会导致编译源代码时使用不同的tools.jar。这可能是由于JRE 1.4.2安装中的jvm.dll用于运行Eclipse(因此也包括Ant)。

首先,项目设置与构建脚本无关。项目设置告诉您Eclipse如何构建项目,而不是如何运行ant文件


要查找运行jvm ant的环境,请在Eclipse中用鼠标右键单击构建脚本并选择“运行方式…”。在弹出的对话框中,导航到jvm选项卡并检查哪个jre用于运行脚本。

也许您需要使用JDK jre,它位于C:\Program Files\Java\JDK\jre,而不是public

您可以尝试将
tools.jar
JDK/jre
复制到tomcat的
common/lib


正如所演示的那样,它对我起了作用。

错误消息意味着Ant使用的tool.jar中包含的编译器工具的版本比它试图编译的类的版本旧。
消息“[javac]类文件有错误的版本50.0应该是49.0”意味着类文件需要jdk 6.0,但tool.jar来自jdk 5.0发行版。要在eclipse中切换到正确的tools.jar,请打开窗口>首选项>Ant>运行时>全局条目。

您需要更改Ant的Java版本,因为如果您将运行时环境用作JDK1.8,那么Ant也应该指向相同的版本,或者Ant应该从JDK1.8/lib/tools.jar位置引用tools.jar文件。 要解决此问题,我将打开Eclipse的窗口-->首选项-->Ant-->运行时-->全局项。这里检查并更新tools.jar路径,最新版本如下: C:\ProgramFiles\Java\jdk1.8.0\U 60\lib\tools.jar


然后运行生成脚本问题将得到解决。:)

将eclipse中的tools.jar更改为正确的版本修复了它。
我当时使用的是jre 1.6,不得不将其改为使用1.8来获取52版的类文件。

嗯,Java 6的类文件版本是50.0。@Vinet:嗯,你说得对。我只是在翻译错误信息。但这并不能解释为什么JRE 1.6中的
IOException.class
具有错误消息中所述的49.0版?无论如何,我将我的答案一般化以删除特定的JRE版本。嗯,很有趣……我检查了1.5和1.6 JRE
rt.jar
(包括在1.6中专门更新的类)中的类,它们都有49版。我想知道这是为了什么……这可能是问题所在,我该在哪里具体说明呢?在ant构建中,我是否应该将target=“1.5”source=“1.5”添加到compile命令中?它位于“外部工具配置”中,即每个ant启动器。特别是检查JRE和类路径选项卡。问题可能出在JRE设置中,但您可能已手动将不同版本的rt.jar添加到类路径中。如何检查Ant编译器版本?默认情况下,这往往是JDK home中的编译器版本(Eclipse启动配置可以帮助识别home)。您可以使用javacant任务的executable属性指定不同的编译器:我不明白,我使用的是java1.6jdk。我在帖子中添加了一个截图。这有什么关系呢?您正在使用jdk1.6调用ant,但是ant在一个新的进程中调用了编译器,该进程可能使用不同的JDKJAVA\u HOME被正确设置为C:\Program Files\Java\jdk1.6.0\u 07。然而,Oracle开发套件在我的PATH环境变量中添加了一些jre 1.4值。这有点帮助。没有JVM选项卡,但是JRE选项卡确实正确地使用了jre1.6.0_07。对不起,我没有打开Eclipse,并且给出了错误的选项卡名称。好,接下来我要检查:1。如果您在任何地方安装了jre 1.4。2.如果定义了JAVA_HOME或JRE_HOME,如果是,它们指向何处。3.从命令行运行java-version,查看路径指向哪个java。如果
compile:
    [javac] Compiling 3 source files to H:\MYCOMPANY\portlets\build
    [javac] H:\MYCOMPANY\portlets\src\com\mycompany\portlets\CourseList.java:3: cannot access java.io.IOException
    [javac] bad class file: C:\Program Files\Java\jre1.6.0_07\lib\rt.jar(java/io/IOException.class)
    [javac] class file has wrong version 49.0, should be 48.0
    [javac] Please remove or make sure it appears in the correct subdirectory of the classpath.
    [javac] import java.io.IOException;
    [javac]                ^
    [javac] 1 error