Maven compiler plugin error: can't access enum (bad signature, bad class)
Maven compiler plugin error: can't access enum (bad signature, bad class)
我正在使用 maven-compiler-plugin:2.3.2
,每次我在 类 中进行更改时,它在导入中有一个枚举 (ContentType
),我需要进行 clean
,否则它给了我:
ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project wp2: Compilation failure
[ERROR] /home/semyon/development/.../ContentManager.java:[15,46] error: cannot access ContentType
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project wp2: Compilation failure
/home/semyon/development/.../ContentManager.java:[15,46] error: cannot access ContentType
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.MojoExecutor.executeForkedExecutions(MojoExecutor.java:364)
...
ContentType 是 enum
并且看起来像这样:
import org.jetbrains.annotations.NotNull;
public enum ContentType {
...;
private final String title;
private final boolean hasJad;
private final CoreType coreType;
private final String[] searchKeywords;
ContentType(@NotNull String title, CoreType coreType, boolean hasJad, String[] searchKeywords) {
this.title = title;
this.coreType = coreType;
this.hasJad = hasJad;
this.searchKeywords = searchKeywords;
}
@NotNull
public String getTitle() {
return title;
}
@NotNull
public String getName() {
return name();
}
@NotNull
public CoreType getCoreType() {
return coreType;
}
public enum CoreType {
...;
private String title;
CoreType(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
}
}
UPD1,项目结构:
/wp2
/core
/cpe
/widget
/ContentManager.java
/cdr
/entities
/ContentType.java
更新 2:
ContentManager.java:[15,46] 是 import wp2.core.cdr.entities.ContentType;
更新 3:
现代编译器也会显示 bad class
和 bad signature
错误
可能是代码中的错误,它试图确定更改后需要编译哪些 类。
试用最新版本Maven compiler plugin。版本号在 link 后面的页面上,在右侧 header 中,在 Maven 徽标下方(3.2
在撰写本文时)。
终于找到答案了
错误在构造函数中:
ContentType(@NotNull String title...
枚举中的构造函数中不能有注释,因为 javac
有问题。
Javac 为 enum
构造函数存储了不正确的签名(你写的那个,而不是实际使用的那个——我记得它有两个额外的参数)。
当 javac
验证签名时,它会看到 annotated 参数,在我的例子中是 first 参数。但是在 actual 签名中(String name, int ordinal, String title, CoreType coreType, boolean hasJad, String[] searchKeywords
,两个第一个参数是通过 enum -> Enum 翻译添加的)title
只是 third参数和第一个参数是name
,未注释并且javac认为class不正确。
tl;dr 从构造函数中删除注释,javac 有问题
我正在使用 maven-compiler-plugin:2.3.2
,每次我在 类 中进行更改时,它在导入中有一个枚举 (ContentType
),我需要进行 clean
,否则它给了我:
ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project wp2: Compilation failure
[ERROR] /home/semyon/development/.../ContentManager.java:[15,46] error: cannot access ContentType
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project wp2: Compilation failure
/home/semyon/development/.../ContentManager.java:[15,46] error: cannot access ContentType
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.MojoExecutor.executeForkedExecutions(MojoExecutor.java:364)
...
ContentType 是 enum
并且看起来像这样:
import org.jetbrains.annotations.NotNull;
public enum ContentType {
...;
private final String title;
private final boolean hasJad;
private final CoreType coreType;
private final String[] searchKeywords;
ContentType(@NotNull String title, CoreType coreType, boolean hasJad, String[] searchKeywords) {
this.title = title;
this.coreType = coreType;
this.hasJad = hasJad;
this.searchKeywords = searchKeywords;
}
@NotNull
public String getTitle() {
return title;
}
@NotNull
public String getName() {
return name();
}
@NotNull
public CoreType getCoreType() {
return coreType;
}
public enum CoreType {
...;
private String title;
CoreType(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
}
}
UPD1,项目结构:
/wp2
/core
/cpe
/widget
/ContentManager.java
/cdr
/entities
/ContentType.java
更新 2:
ContentManager.java:[15,46] 是 import wp2.core.cdr.entities.ContentType;
更新 3:
现代编译器也会显示 bad class
和 bad signature
错误
可能是代码中的错误,它试图确定更改后需要编译哪些 类。
试用最新版本Maven compiler plugin。版本号在 link 后面的页面上,在右侧 header 中,在 Maven 徽标下方(3.2
在撰写本文时)。
终于找到答案了
错误在构造函数中:
ContentType(@NotNull String title...
枚举中的构造函数中不能有注释,因为 javac
有问题。
Javac 为 enum
构造函数存储了不正确的签名(你写的那个,而不是实际使用的那个——我记得它有两个额外的参数)。
当 javac
验证签名时,它会看到 annotated 参数,在我的例子中是 first 参数。但是在 actual 签名中(String name, int ordinal, String title, CoreType coreType, boolean hasJad, String[] searchKeywords
,两个第一个参数是通过 enum -> Enum 翻译添加的)title
只是 third参数和第一个参数是name
,未注释并且javac认为class不正确。
tl;dr 从构造函数中删除注释,javac 有问题