2013-05-13 112 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