Maven编译器插件错误:无法访问枚举(错误签名,坏类)

时间:2015-01-26 14:47:17

标签: java maven enums 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

UPD 2:

ContentManager.java:[15,46]是import wp2.core.cdr.entities.ContentType;

UPD 3: 现代编译器还会显示bad classbad signature错误

2 个答案:

答案 0 :(得分:11)

我终于找到了答案

错误在costructor中:

ContentType(@NotNull String title...

枚举中的构造函数不得包含注释,因为javac会被置号。 Javac存储了enum构造函数的错误签名(你编写的那个,而不是实际使用的那个 - 我记得它有两个额外的参数)。 当javac验证签名时,它会看到带注释的参数,在我的情况下,它是第一个参数。但是在实际签名(String name, int ordinal, String title, CoreType coreType, boolean hasJad, String[] searchKeywords中,两个第一个参数由枚举添加 - &gt;枚举翻译)title第三个参数和< strong> first 参数为name 未注释,javac认为该类不正确。

tl; dr 从构造函数中删除注释,javac是错误的

答案 1 :(得分:1)

可能是代码中的一个错误,它试图确定在更改后需要编译哪些类。

试用最新版本的Maven compiler plugin。版本号位于链接后面的页面上,右侧标题中,Maven徽标下方(撰写本文时为3.2)。