Maven:javac:源代码版本 1.6 需要目标版本 1.6

2022-09-01 16:08:54

注意:这似乎是“javac”程序中的限制。

我有Java 6代码需要为Java 5 JVM构建。我以前使用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

这与 生成的相同。为了澄清,这是Ubuntu的官方OpenJDK 6javac -source 1.6 -target 1.5

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:~$

官方的Oracle Java 7 JDK for Windows也表现出相同的行为。

注意:我不想针对Java 5库或任何东西进行构建。只是活动的javac生成Java 5兼容的字节码。

我如何获得我想要的东西,同时仍然与Eclipse Maven插件兼容?

(编辑:除了@Override我还想在使用Java 6中的JAX-WS库进行编译,但仍然生成Java 5字节代码 - 然后我可以在部署到Java 5安装时故意在Web容器中添加JAX-WS库)


编辑:事实证明,可以告诉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 上工作正常。


答案 1

限制在javac中。解决方案是告诉 maven 使用另一个编译器。有关详细信息,请参阅问题。


答案 2

似乎如果你想进行交叉编译,你需要提供一些额外的参数 - bootclasspath-extdirs,尽管我相信你只需要第一个。有关使用Javac和示例,可以在此处找到,并在此处找到其他选项的说明(交叉编译选项部分)。

然后,您需要为 maven-compiler-plugin 配置这些选项。据我所知,您需要将插件设置为分叉,以便它将使用编译器参数而不是内置编译器。您可以在此处找到所有选项的列表

 <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>

推荐