Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 打开枚举时Maven编译失败_Java_Maven 3_Maven Compiler Plugin - Fatal编程技术网

Java 打开枚举时Maven编译失败

Java 打开枚举时Maven编译失败,java,maven-3,maven-compiler-plugin,Java,Maven 3,Maven Compiler Plugin,我正在开发(这是一个词吗?)一个项目,到目前为止,它的构建过程完全基于ant/shell脚本 考虑以下枚举 public enum ResourceType { A, B; } 以下bean: public ResourceTypeOwner { //set get resourceType property } 以及以下代码段: void foo(ResourceTypeOwner rto) { ResourceType resourceType = rto.get

我正在开发(这是一个词吗?)一个项目,到目前为止,它的构建过程完全基于ant/shell脚本

考虑以下枚举

public enum ResourceType {
    A, B;
}
以下bean:

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类型的值。仅可转换整数 允许使用值或枚举变量

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.apache.maven.plugins
maven编译器插件
3
日食
1.6
1.6
1.6
org.codehaus.plexus
plexus编译器eclipse
2.2
...
ant(带有org.eclipse.jdt.core.JDTCompilerAdapter)和eclipse构建/编译都很好。我显然做错了什么(除非是未报告的maven编译器插件或plexus编译器eclipse插件错误,这是不太可能的,打开Enum既不坏也不科学)。有人有主意吗

其他环境详细信息

$mvn-版本ApacheMaven 3.0.4(r1232337;2012-01-17 10:44:56+0200) Maven home:/home/d/dev/tools/apache-Maven-3.0.4 Java版本: 1.6.0_35,供应商:Sun Microsystems Inc.Java home:/opt/jdk1.6.0_35/jre默认语言环境:en_US,平台编码:UTF-8 操作系统名称:“linux”,版本:“3.2.0-40-generic”,拱门:“amd64”,系列: “unix”

更新:


标准JDK编译器成功编译特定类。看起来像是plexus编译器eclipse 2.2的问题。

不要在Maven构建中使用eclipse编译器。如果你省略了这一行

    <compilerId>eclipse</compilerId>
日食
一切正常,这表明这是eclipse编译器特有的问题。

我能够重现并发现问题

事实证明,需要将设置
org.eclipse.jdt.core.compiler.compliance
设置为目标版本才能实现 能够识别
java.lang.Enum

只有同时设置了
targetVersion
optimize
时,plexus编译器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! -->

[1]

检查类路径(包括依赖项)中是否只有一个
ResourceType
。我相信您还有另一个同名的(常规)类,我只是在整个mvn存储库中搜索同名的类。没有。此外,它发生在两个不同的枚举上(这是在整个项目上切换枚举的唯一情况)。最后将枚举重命名为ResourceType123456(使用eclipse重构)。同样的问题。Thx。你必须使用eclipse编译器吗?jdk one有什么问题?有一些泛型推断的情况,大多数情况下javac不允许,ecj允许。在方法体中考虑FoE()和Bar()和Fo调用bar。Javac还强制您向foo添加第二个参数。我不是建议foo应该只有一个类型参数,但我没有编写整个代码库;)我也有同样的问题。它特定于eclipse编译器。我的maven配置使用eclipse编译器。Java7不是一个选项。我不明白为什么只有当枚举是执行切换的类的内部类时,rt1==rt2。普通的JDK编译特定的类,它看起来像plexus编译器eclipse插件的一个bug。@dkateros:对不起,我完全改变了我的答案,因为我发现我被引入了一个错误的方向。但正如我所说的,不使用eclipse编译器也可以。或者您使用它而不是普通的JDK有什么特殊的原因吗?我们应该始终尝试让maven构建IDE不可知。谢谢你的回答。不幸的是,如果没有eclipse编译器,构建将失败,出现许多问题:/I我在plexus用户邮件列表上发布了这个问题。eclipse编译器可以读取java 6源代码并生成java 5字节代码。这与我们有关。dkateros:你能提供到plexus用户邮件列表的链接吗?以及你的问题?在中,您还可以找到档案的死链接。明天早上回到工作岗位后,我们将对此进行测试和确认,但看起来应该提前向您表示感谢。呜!这里是荣誉奖!
class Foo {
    static enum MyEnum { A }

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