Java 打开枚举时Maven编译失败
我正在开发(这是一个词吗?)一个项目,到目前为止,它的构建过程完全基于ant/shell脚本 考虑以下枚举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
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: }
}
}