【问题标题】:Maven: javac: source release 1.6 requires target release 1.6Maven:javac:源版本 1.6 需要目标版本 1.6
【发布时间】:2012-01-23 11:30:25
【问题描述】:

注意:这似乎是“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>

在具有 Maven 支持的 Eclipse 3.7 中按预期工作。不幸的是,直接从命令行运行 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 上运行良好。

【问题讨论】:

  • 注意:已编辑问题以阐明我想要什么,并且我仍然需要与 Eclipse 兼容。
  • @ThorbjørnRavnAndersen 那我再给你一次机会。 javactask是如何配置的?根据文档,大多数编译器都会忽略 source 参数:“-source 命令行开关的值;将被 javac1.4 之前的所有实现忽略(或者当 Ant 不在 1.3 VM 中运行时现代) , gcj 和 jikes。”
  • @PeterLiljenberg 用于 ant 任务,而不是 maven 任务。我不知道在 Maven 引擎“外部”编译是否会丢失任何类型的信息或报告。

标签: java maven javac


【解决方案1】:

限制在 javac 中。解决方案是告诉 maven 使用另一个编译器。详情见问题。

【讨论】:

  • 注意:javadoc 字节码解释器在 Eclipse 编译器生成的字节码上崩溃。
  • 这似乎已在较新版本的 Eclipse 编译器中得到修复。
【解决方案2】:

如果你想进行交叉编译,你似乎需要提供几个额外的参数 -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>

【讨论】:

  • 可以针对 Java 6 运行时库进行构建。那不是我的问题。
  • 在一个项目中为我工作。虽然我的项目不需要 fork 和 compilerArguments 目标
【解决方案3】:

我相信您还需要设置-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

【讨论】:

  • 问题不是类错了,而是javac报错不启动。
  • 您修改后的答案与我自己的实验一致。现在,如何让 maven 编译器插件做到这一点,同时仍然与 Eclipse 中的 Maven 插件兼容?
  • 在 jDK 7 上出现冲突错误,javac: 目标版本 1.6 与默认源版本 1.7 冲突。不工作
【解决方案4】:

您正在使用哪些 Java 6 语言特性而 Java 5 中没有这些特性?据我所知,添加到语言中的唯一“功能”是在interfaces 中使用@Override 注释。否则,Java 6 和 Java 5 是源代码兼容的。使用时会发生什么:

<source>1.5</source>
<target>1.5</target>

在您的 Maven 构建文件中?

【讨论】:

  • 接口实现的@Override注解要求正是这里想要的特性。
  • ... 并且 JAX-WS 随 Java 6 一起提供,并且是 Java 5 中的可选下载。我想要在普通 Java 6 下运行但也可以在带有额外库的 Java 5。
【解决方案5】:

我在升级 IntelliJ IDE 时遇到了同样的错误,通过将 1.5 替换为 1.6 来修复,如下所示。

       <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>

【讨论】:

  • OP 需要维护 1.6 java 代码(源 = 1.6),同时为 java 1.5(目标)编译它 - 换句话说 - 使他的 1.6 源在 1.5 JRE 上运行。您的解决方案编译为 1.6 JRE 版本
  • 你将如何使用 Java 9 来做到这一点?
【解决方案6】:

因此,真正的问题是在需要在 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 2014-04-08
    相关资源
    最近更新 更多