5

これまでのところ、ビルド プロセスが完全に ant/shell スクリプトに基づいているプロジェクトを作成しています (それは単語ですか?)。

次の列挙型を検討してください

public enum ResourceType {
    A, B;
}

次の豆:

public ResourceTypeOwner {
    //set get resourceType property
}

そして、次のコード スニペット:

void foo(ResourceTypeOwner rto) {
    ResourceType resourceType = rto.getResourceType();
    switch (resourceType) {
    case A:
        handleA(resourceType); break;
    case B:
        handleB(resourceType); break;
    default:
        throw new RuntimeException("Unsupported resource type");
    }
}

Maven でビルドすると、コンパイル エラーが発生します。

タイプ ResourceType の値をオンにできません。変換可能な int 値または enum 変数のみが許可されます

pom.xml には、コンパイル用の次のプラグイン構成があります。

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.0</version>
        <configuration>
            <compilerId>eclipse</compilerId>
            <compilerVersion>1.6</compilerVersion>
            <source>1.6</source>
            <target>1.6</target>
        </configuration>
        <dependencies>
            <dependency>
                <groupId>org.codehaus.plexus</groupId>
                <artifactId>plexus-compiler-eclipse</artifactId>
                <version>2.2</version>
            </dependency>
        </dependencies>
    </plugin>
...
</plugins>

ant (org.eclipse.jdt.core.JDTCompilerAdapter を使用) と eclipse のビルド/コンパイルは問題ありません。私は明らかに何か間違ったことをしています(報告されていないmaven-compiler-pluginまたはplexus-compiler-eclipseプラグインのバグでない限り、これはややありそうにありませんが、列挙型をオンにすることは悪くもロケット科学でもありません)。誰かアイデアがありますか?

その他の環境の詳細

$mvn -version Apache Maven 3.0.4 (r1232337; 2012-01-17 10:44:56+0200) Maven ホーム: /home/d/dev/tools/apache-maven-3.0.4 Java バージョン: 1.6.0_35 、ベンダー: Sun Microsystems Inc. Java ホーム: /opt/jdk1.6.0_35/jre デフォルトのロケール: en_US、プラットフォームのエンコード: UTF-8 OS 名: "linux"、バージョン: "3.2.0-40-generic"、arch : "amd64"、ファミリー: "unix"

アップデート:

標準の JDK コンパイラは、特定のクラスを正常にコンパイルします。plexus-compiler-eclipse 2.2 の問題のようです。

4

2 に答える 2

4

再現でき、問題が見つかりました。

認識できるようにするには、設定をターゲットバージョンに設定org.eclipse.jdt.core.compiler.complianceする必要があることがわかりましたjava.lang.Enum

targetVersionこの設定は、両方のANDが設定されている場合、plexus-compiler-eclipse によってのみ設定されoptimizeます。[1]

次のように pom を変更すると、動作するはずです。

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version> <!-- or 3.0 -->
    <configuration>
        <compilerId>eclipse</compilerId>
        <source>1.6</source>
        <target>1.6</target>
        <optimize>true</optimize>   <!-- add this line! -->

plexus-compiler-eclipse で、最適化がコンプライアンス レベルに影響を与えると判断された理由がわからないので、これは実際には回避策です。

また、このコードは問題を引き起こすのに十分です:

class Foo {
    static enum MyEnum { A }

    void foo() {
        switch ( MyEnum.A ) { case A: }
    }
}

[1] https://github.com/sonatype/plexus-compiler/blob/master/plexus-compilers/plexus-compiler-eclipse/src/main/java/org/codehaus/plexus/compiler/eclipse/EclipseJavaCompiler.java #L156

于 2013-05-13T19:13:15.343 に答える
0

Maven ビルドで Eclipse コンパイラを使用しないでください。行を省略した場合

    <compilerId>eclipse</compilerId>

これは、これが Eclipse コンパイラーに固有の問題であることを示しています。

于 2013-05-13T12:21:53.000 に答える