【问题标题】:Maven compiler plugin error: can't access enum (bad signature, bad class)Maven 编译器插件错误:无法访问枚举(错误的签名,错误的类)
【发布时间】:2015-01-26 14:47:16
【问题描述】:

我正在使用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 错误

【问题讨论】:

  • 发布您的pom.xml 并向我们展示您的目录结构。
  • @carlspring pom 太大而无法发布(约 4000 行),所以也许你能告诉我什么是重要的?
  • 只需将其发布在 pastebin 或 gist 上
  • 我也对 ContentManager.java:[15,46] 那个文件感兴趣
  • @Mysterion 我终于找到答案了,我贴出来了

标签: java maven enums javac


【解决方案1】:

终于找到答案了

错误在构造函数中:

ContentType(@NotNull String title...

枚举中的构造函数中不能有注释,因为javac 是错误的。 Javac 为 enum 构造函数存储了不正确的签名(您编写的签名,而不是实际使用的签名 - 我记得它有两个额外的参数)。 当javac 验证签名时,它会看到 annotated 参数,在我的例子中是 first 参数。但是在 actual 签名中(String name, int ordinal, String title, CoreType coreType, boolean hasJad, String[] searchKeywords,两个第一个参数由 enum 添加 -> 枚举翻译)title 只是 第三个 参数和 first 参数是name,它未注释,javac 认为该类不正确。

tl;dr 从构造函数中删除注释,javac 有问题

【讨论】:

  • 那是哪个版本的 Java? Java 8 还会发生这种情况吗?注意:您可以使用 Java 8 为 Java 6 VM/运行时编译代码。
  • 我使用 6 和 7 java 编译,没有尝试使用 8(我想问题仍然存在,因为 this bug 仍未解决。
【解决方案2】:

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

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

【讨论】:

  • 在 3.2 版中,即使只更改了一个类,它也会简单地重新编译所有类。
  • 这可能是一个新错误,但它可以解决您的问题。据我记得,“更改后重新编译最小文件集”仍然是一个实验性功能。
  • 这就解释了一切。我将尝试在调试模式下构建和运行 maven,以查看 MojoExecutor 中究竟发生了什么以及为什么它无法访问该类。
  • 异常是从javac抛出的,所以我觉得我在那里做不了多少:(
  • 问题是为什么 Maven 编译器插件没有注意到它也必须重新编译枚举。但我不知道如何调试确定哪些文件已更改以及哪些文件取决于这些文件的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多