2013-05-13 183 views
5

我是一個項目,其構建過程迄今爲止完全基於ant/shell腳本進行了編譯(這是一個單詞嗎?開啓枚舉時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)和蝕下面插件配置編譯/編譯好。我明顯在做一些錯誤的事情(除非它是一個未報告的maven-compiler-plugin或plexus-compiler-eclipse插件錯誤,這在某種程度上不太可能,開啓枚舉既不壞也不是火箭科學)。有人有想法嗎?

附加環境細節

$ MVN -version阿帕奇的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 操作系統名稱:「 Linux的」版本: 「3.2.0-40-通用」,拱: 「AMD64」 家庭: 「UNIX」

更新:

標準JDK編譯器成功編譯特定的類。看起來像是一個plexus-compiler-eclipse 2.2問題。

+1

檢查您是否在類路徑中(包括依賴)只有一個'ResourceType'。我相信你還有另一個(常規)同名的班級。 – AlexR 2013-05-13 11:32:45

+1

我剛剛搜索了整個mvn存儲庫中具有相同名稱的類。沒有了。此外,它發生在兩個不同的枚舉(這是在整個項目中打開一個枚舉的唯一情況)。最後將枚舉重命名爲ResourceType123456(使用eclipse重構)。同樣的問題。 Thx雖然。 – dkateros 2013-05-13 11:46:53

+1

你必須使用eclipse編譯器嗎? jdk最新怎麼了? – radai 2013-05-13 11:48:11

回答

4

我能夠重現並發現問題。

原來,設置org.eclipse.jdt.core.compiler.compliance需要設置爲目標版本,以便它 能夠識別java.lang.Enum

此設置僅在設置targetVersionoptimize時由plexus-compiler-eclipse設置。[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! --> 

我不知道爲什麼它在叢中編譯月食決定優化會影響合規水平,所以這是實際上是一種解決方法。

而且,這個代碼是足以引發問題:

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

+0

[github問題](https://github.com/sonatype/plexus-compiler/issues/16) – Kenney 2013-05-13 19:35:28

+0

明天早上回到工作後會測試並確認這一點,但它看起來像一個早期的謝謝你是爲了。 – dkateros 2013-05-13 21:31:30

+0

已接受。再次謝謝你。 – dkateros 2013-05-14 08:45:30

0

不要在Maven構建中使用eclipse編譯器。如果你省略這一行

<compilerId>eclipse</compilerId> 

一切正常,這表明這是一個特定於eclipse編譯器的問題。

+0

我的maven配置使用eclipse編譯器。 Java7不是一個選項。我不明白爲什麼rt1 == rt2只有當enum是做這個開關的類的內部類。普通的JDK編譯特定的類,它看起來像plexus-compiler-eclipse插件的bug。 – dkateros 2013-05-13 12:40:06

+0

@dkateros:對不起,我完全改變了我的答案,因爲我發現我被帶到了一個錯誤的方向。但正如我所說的,當不使用eclipse編譯器時會很好。還是有一個特殊的原因,你使用它而不是常規的JDK?人們應該總是試圖讓Maven構建IDE不可知論者。 – 2013-05-13 12:42:08

+0

感謝您的回答。不幸的是,如果沒有eclipse編譯器,構建會失敗,並帶來許多問題:/我將問題發佈到plexus用戶郵件列表中。 – dkateros 2013-05-13 12:59:06