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 值或枚举变量

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 操作系统名称:“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

此设置仅在设置targetVersionAND时由 plexus-compiler-eclipseoptimize设置。[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 回答