web-dev-qa-db-ja.com

Maven:javac:ソースリリース1.6にはターゲットリリース1.6が必要

注:これは、「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:~$

公式のOracle Java 7 JDK for Windowsは同じ動作を示します。

注:Java 5ライブラリまたはその他に対してビルドする必要はありません。アクティブなjavacがJava 5 compatibleバイトコードを生成するだけです。

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でうまく機能しました。

制限はjavacにあります。解決策は、別のコンパイラを使用するようにMavenに指示することです。詳細については質問をご覧ください。

クロスコンパイルをしたい場合は、いくつかの追加の引数-bootclasspath-extdirsを指定する必要があるようです。ただし、最初のものだけが必要だと思います。 Javacの使用例については、 here に追加オプションの説明があります here (Cross-Compilation Optionsセクション)。

次に、maven-compiler-pluginに対してこれらのオプションを構成する必要があります。私が理解していることから、プラグインをフォークに設定して、組み込みのコンパイラではなくコンパイラの引数を使用する必要があります。すべてのオプションのリストを見つけることができます 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>
8
Kingamajick

javacがJDK 1.5 bootstrap=クラスに対してコンパイルされるように、-bootclasspathも設定する必要があると思います。

試してください:

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

IntelliJ IDEをアップグレードしたときに同じエラーが発生しました。以下のように1.5を1.6に置き換えることで修正されました。

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

Java 6の言語機能を使用していますが、Java 5?に存在しませんか?言語はinterfacesの@Overrideアノテーションの使用です。それ以外の場合、Java 6およびJava 5はソース互換です。使用するとどうなりますか:

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

あなたのMavenビルドファイルに?

1
Jonathan