注意:这似乎是“javac”程序的限制。
我需要为Java 5 JVM构建Java 6代码。我之前使用javac ant目标(使用JDK编译器和ecj)的工作使我相信它只是设置javac的源和目标。因此这个pom.xml片段:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.5</target>
</configuration>
</plugin>
在Eclipse 3.7中使用Maven支持,可以正常工作。不幸的是,直接从命令行运行Maven给我
javac: source release 1.6 requires target release 1.6
与javac -source 1.6 -target 1.5
生成的相同。为了澄清,这是Ubuntu的官方OpenJDK 6
x@JENKINS:~$ javac -version
javac 1.6.0_20
x@JENKINS:~$ javac -source 1.6 -target 1.5
javac: source release 1.6 requires target release 1.6
x@JENKINS:~$
适用于Windows的官方Oracle Java 7 JDK显示了相同的行为。
注意:我不想构建Java 5库或任何东西。只是活动的javac生成Java 5 兼容的字节码。
如何在与Eclipse Maven插件兼容的同时获得我想要的内容?
(编辑:除了@Override我还希望在使用时针对Java 6中的JAX-WS库进行编译,但仍然生成Java 5字节代码 - 然后我可以在Web中故意添加JAX-WS库部署到Java 5安装时的容器)
编辑:事实证明maven-compiler-plugin可以被告知使用另一个编译器,Eclipse编译器可以这样做:
<plugin>
<!-- Using the eclipse compiler allows for different source and target,
which is a good thing (outweighing that this is a rarely used combination,
and most people use javac) This should also allow us to run maven builds
on a JRE and not a JDK. -->
<!-- Note that initial experiments with an earlier version of maven-compiler-plugin
showed that the eclipse compiler bundled with that gave incorrect lines in
the debug information. By using a newer version of the plexus-compiler-eclipse
plugin this is hopefully less of an issue. If not we must also bundle a newer
version of the eclipse compiler itself. -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.6</source>
<target>1.5</target>
<debug>true</debug>
<optimize>false</optimize>
<fork>true</fork>
<compilerId>eclipse</compilerId>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-compiler-eclipse</artifactId>
<version>2.1</version>
</dependency>
</dependencies>
</plugin>
将类编译为Java 1.5字节码而不抱怨。对于Eclipse Java EE 4.2.2的m2e,它也支持“开箱即用”。
编辑:我发现 javadoc 工具不喜欢Eclipse编译器的输出。
编辑2015-06-28:我最近做了一个快速测试,最新的ecj(对应于Eclipse 4.4)与javadoc一起运行良好。答案 0 :(得分:13)
限制在javac中。解决方案是告诉maven使用另一个编译器。有关详细信息,请参阅问题。
答案 1 :(得分:8)
看来如果你想进行交叉编译,你需要提供一些额外的参数 -bootclasspath 和 -extdirs ,虽然我相信你只需要第一个。对于使用Javac和示例,可以找到here,并附加选项here的说明(交叉编译选项部分)。
然后,您需要为maven-compiler-plugin配置这些选项。根据我的理解,你需要设置插件到fork,以便它将使用编译器参数而不是内置编译器。您可以找到所有选项here
的列表 <build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.5</target>
<fork>true</fork>
<compilerArguments>
<bootclasspath>${1.5.0jdk}\lib\rt.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
....
</plugins>
</build>
答案 2 :(得分:2)
我相信您还需要设置-bootclasspath
以便javac
编译JDK 1.5引导类。
尝试:
javac -source 1.6 -target 1.5 -bootclasspath /path/to/jdk1.5/lib/rt.jar -extdirs "" Foo.java
<强>更新强>
尝试删除-source
选项,但保留-target
选项。
我刚试了一下:
# no source, only target => COMPILES to 1.5
$ javac -target 1.5 Foo.java
$ javap -v Foo | grep version
minor version: 0
major version: 49
# no source, no target => COMPILES to 1.6
$ javac Foo.java
$ javap -v Foo | grep version
minor version: 0
major version: 50
# both source and target => ERROR
$ javac -source 1.6 -target 1.5 Foo.java
javac: source release 1.6 requires target release 1.6
$ javac -version
javac 1.6.0_21
答案 3 :(得分:1)
Java 5中没有使用哪些Java 6语言功能?据我所知,该语言中唯一添加的“功能”是在@Override
中使用interface
注释。否则,Java 6和Java 5是源兼容的。使用时会发生什么:
<source>1.5</source>
<target>1.5</target>
你的Maven构建文件中的?
答案 4 :(得分:1)
当我升级IntelliJ IDE时遇到了同样的错误,修复后用1.5替换1.5,如下所示。
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
答案 5 :(得分:-1)
因此,真正的问题是在需要在Java 1.5类文件中编译的源文件中使用@Override
。
javac -source 1.5 -target 1.5 aFileWithOverride.java
会做到这一点。在jdk 7中,这将导致警告
[options] bootstrap class path not set in conjunction with -source 1.5
在jdk 6中没有。
要消除此警告,可以通过将java 6(或更高版本)java.lang.annotation
包添加到java 5 rt.jar
来创建特殊的启动类jar。