Javac 版本 1.7 无法构建目标版本 1.7。

3

我正在尝试在Linux Mint系统上使用Sun Java JDK 1.7.0_17编译Java代码,但是遇到了以下问题。

$ javac  -version -target 1.7 
javac 1.7.0_17
javac: invalid target release: 1.7

-target 1.6也不起作用。目标1.5可以工作,但我会遇到版本问题,如下所示:

$ javac  -version -target 1.5 HelloWorld.java 
javac 1.7.0_17
HelloWorld.java:2: cannot access java.lang.Object
bad class file: /usr/lib/jvm/jdk1.7.0_17/jre/lib/rt.jar(java/lang/Object.class)
class file has wrong version 51.0, should be 49.0
Please remove or make sure it appears in the correct subdirectory of the classpath.
class HelloWorldApp {
^
1 error

除了Sun Java目录之外,是否有其他可用的Java目标列表?

我没有指定ClassPath或Javahome,并且设置它们也没有帮助。jcontrol也没有帮助。我还尝试过1.7.0_15版本,结果类似。


which javac 的输出是什么? - madth3
which javac 通过 /etc/alternatives 解析为 /usr/lib/jvm/jdk1.7.0_17/bin/javac - Serge Ivanoff
4个回答

5

我追踪了一个涉及Ubuntu、Netbeans和两个JDK的类似问题:openJDK和oracleJDK。问题出在 "/usr/java/packages" 目录下的旧且无关的文件,将其删除后问题得以解决。

我一直收到以下错误信息:

# javac -version hello.java
javac 1.7.0_21
hello.java:3: cannot access java.lang.Object
bad class file: /usr/lib/jvm/java-7-oracle/jre/lib/rt.jar(java/lang/Object.class)
class file has wrong version 51.0, should be 49.0
Please remove or make sure it appears in the correct subdirectory of the classpath.
public class hello {
       ^
1 error

更重要的是,我通过以下代码找到了有问题的文件: ``` locate 文件名 ```
# javac -verbose -version hello.java

-verbose选项列出了类文件的搜索路径。
在我的调查过程中,还探索了以下领域:
- 使用#echo $JAVA_HOME命令检查环境变量JAVA_HOME的值。 - 使用#echo $PATH命令检查环境变量PATH的值。 - 使用#echo $CLASSPATH命令检查环境变量CLASSPATH的值。 - 使用#update-alternatives --config javac命令更新备选项。 - 使用#galternatives命令更新备选项。 - 在/usr/local/netbeans-7.3/etc/netbeans.conf中使用netbeans_jdkhome=开关设置Netbeans使用的JDK。请注意,此开关将覆盖update-alternatives的设置。

哦,但那真是太接近了。正如你所预测的那样,我发现一些旧的jar文件被从_/usr/java/packages/lib/ext_目录中加载。通过删除它们,它们从**-verbose**列表中消失了,但除此之外没有任何影响。我仍然会收到错误的版本错误。 - Serge Ivanoff
我想知道versioncheck是否可以帮助您追踪有问题的jar包? - nhoj
我刚试了一下VersionChecker,似乎并没有什么帮助,除了1.7 Java兼容性为空白之外,“Major.Minor Version: 51.0 JAVA compatibility:”。由于网页只涉及到1.6,我猜测它还没有为jdk7重新构建,而不是我的问题。 - Serge Ivanoff
非常感谢!我遇到了同样的问题,影响了 javah 和 ant,浪费了很多时间寻找解决方案。在将所有文件移出 /usr/java/packages/lib/ext 之后,编译一个简单的文件就可以正常工作了。这个目录里装着安装 Australian Business Govt 应用程序时生成的各种文件。 - pt123

0

更新:我重新安装了Mint,问题解决了。不过这并不是我的首选方案。

我还没有比较这些系统之间的差异。

有人能想到为什么1.7编译器不能构建1.7代码吗?


0

诊断:

您可以通过运行“mvn --version”来查看Maven使用的Java版本。

Debian的解决方案:

mvn脚本通过查找javac(which javac)来内部设置JAVA_HOME环境变量。因此,如果您同时安装了多个Java版本,例如JDK 6和JDK 7,并使用Debian Alternatives系统在它们之间进行选择,即使您将“java”的替代项更改为JDK 7,mvn仍将使用JDK 6。您还需要更改“javac”的替代项。例如:

# update-alternatives --set javac /usr/lib/jvm/java-7-openjdk-amd64/bin/javac

0

我成功地编译了一个文件。我进入了该文件所在的目录,然后运行了

javac -version -target 1.7 App.java 

(App.java是文件名)。

我成功运行了javac -version,并收到以下回复:

javac 1.7.0_17

所以很明显它知道我正在使用哪个版本的Java。

如果我运行你所做的:

javac -version -target 1.7

如果我只运行javac -version,我会得到完全相同的消息:

javac 1.7.0_17

看起来运行-version和-target 1.7意味着-target 1.7被忽略了。

我已经指定了JAVA_HOME。

为什么你需要指定-target 1.7呢?如果你正在使用1.7,那应该是默认值。

在你的第一个源代码帖子中,你是想说"javac HelloWorld.java"吗?因为我认为这应该是你想要运行的命令。而不是"javac -version -target 1.7"。


我不需要指定(好的,不应该需要)。如果我不指定,它默认使用1.5,这会导致“错误版本”。 - Serge Ivanoff
一些Linux系统是否预装了Java版本?也许那个Java版本正在覆盖你安装的版本? - CorayThan
我也是这么想的。最初,Mint安装了OpenJDK 1.7和1.6。从未安装过1.5(无论是JDK还是JRE)。我将它们全部删除并安装了Sun 1.7.0_15和现在的_17版本。但两者都无法工作。 - Serge Ivanoff
恐怕我不是Linux专家,而且听起来问题并不在于您向编译器发出的命令。抱歉! - CorayThan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接