2013-05-13 8 views
5

これまでのところ、ビルドプロセスが完全にant/shellスクリプトに基づいているプロジェクトです。enumを有効にするとMavenのコンパイルに失敗する

は、以下の列挙に考えてみましょう

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 値または列挙変数は変換許可され

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

両方(org.eclipse.jdt.core.JDTCompilerAdapter付き)アリおよびEclipseをコンパイルするため、以下のプラグインの設定ビルド/コンパイルは正常です。私は明らかに何か間違ったことをしています(報告されていないmaven-compiler-pluginまたはplexus-compiler-eclipseプラグインのバグではない、enumの切り替えは悪くない、ロケット科学でもない)。誰かがアイデアを持っていますか?

追加の環境の詳細

$ MVN -versionのApache Mavenの3.0.4(r1232337; 2012-01-17 10:44:56 + 0200) Mavenのホーム:/ホーム/ Dの/ dev /ツール/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-ジェネリックAMD64"、家族: "UNIX"

UPDATE:

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

+1

チェック。私はあなたが同じ名前の別の(普通の)クラスを持っていると信じています。 – AlexR

+1

私は、mvnリポジトリ全体を同じ名前のクラスで検索しました。誰もいません。また、2つの異なる列挙型で発生します(これらは列挙型がプロジェクト全体で切り替わる唯一のケースです)。最後に、列挙型をResourceType123456(eclipseリファクタを使用)に変更しました。同じ問題。しかし、Thx。 – dkateros

+1

eclipseコンパイラを使用する必要がありますか? JDKのものは何ですか? – radai

答えて

4

問題を再現できました。

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

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

は、このようなあなたのポンポンを変更し、それが動作するはずです:

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

は、私はそれが叢-コンパイラ日食その最適化に決めた理由準拠レベルに影響を与えるかわからないので、これはあります実際は回避策です。

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

class Foo { 
    static enum MyEnum { A } 

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

[1]あなたが(依存関係を含む)あなたのクラスパスに一つだけ `ResourceType`を持っているかどうかをhttps://github.com/sonatype/plexus-compiler/blob/master/plexus-compilers/plexus-compiler-eclipse/src/main/java/org/codehaus/plexus/compiler/eclipse/EclipseJavaCompiler.java#L156

+0

[github issue](https://github.com/sonatype/plexus-compiler/issues/16) – Kenney

+0

明日の朝にこれをテストして確認しますが、作業中に戻ってきますが、それは早めのようです。 – dkateros

+0

受け入れました。再びありがとう。 – dkateros

0

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

<compilerId>eclipse</compilerId> 

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

+0

私の設定はEclipseコンパイラを使用しています。 Java7はオプションではありません。なぜrt1 == rt2が列挙型がスイッチを実行するクラスの内部クラスであるかだけはわかりません。通常のJDKは特定のクラスをコンパイルしますが、これはplexus-compiler-eclipseプラグインのバグです。 – dkateros

+0

@dkateros:申し訳ありませんが、私は間違った方向に導かれたことを感知して私の答えを完全に変えました。しかし、私が言ったように、それはeclipseコンパイラを使用していないときは問題ありません。あるいは、通常のJDKではなく特別な理由がありますか? 1つは、常にIDEに依存しないようにすることです。 –

+0

答えをありがとう。残念ながら、ビルドはEclipseコンパイラがないと多くの問題で失敗するでしょう:/私はこの問題を叢書ユーザーのメーリングリストに投稿しました。 – dkateros