【问题标题】:Do annotations in Java result in compile-time transitive dependencies?Java中的注释会导致编译时传递依赖吗?
【发布时间】:2015-03-25 15:44:49
【问题描述】:

一个简单的例子,Ent.java 使用注解并使用必要的 jar 依赖项进行编译,然后编译 Includer.java,然后导入 Ent.java

Ent.java:

import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name="securities")
public class Ent {}

Includer.java:

public class Includer {

    public void f() {
        Ent s = new Ent();
    }
}

用...编译它

javac -cp C:/apache-tomcat-7.0.59/lib/javax.persistence_2.1.0.v201304241213.jar Ent.java
javac Includer.java

...编译Includer.java时产生以下警告:

.\Ent.class: warning: Cannot find annotation method 'name()' in type 'Table': class file for javax.persistence.Table not found

如果我们添加更多注释当然会发生同样的情况,但似乎只有带参数的注释才会导致这种行为。在编译Includer.java 时将第一次编译的jar 依赖添加到类路径可以解决问题,但不遵循我通常认为的依赖处理方式。由于我对注释很陌生,因此在编译 Includer.java 时,我们需要将 Ent.java 的依赖项添加到类路径中是预期的行为吗(可以说是添加依赖项的依赖项......)或者这可能是一些某种错误或其他某种特殊情况......?本次测试使用编译器版本 javac 1.8.0_31。

【问题讨论】:

    标签: java annotations persistence javac


    【解决方案1】:

    这似乎与this bug: JDK-6550655有关:

    单独编译一个依赖于另一个类的类时出现编译器错误,该类已经编译并且依赖于persistence-api.jar中的一个类

    另见相关错误JDK-6365854: javac crashes when compiling against an annotated class

    要回答您的问题,不需要将依赖类 (Ent.java) 的依赖项放置到依赖类 (Includer.java) 的类路径中。但是,javac 似乎也读取了依赖类中的注释。根据引用的错误,这曾经导致编译失败(com.sun.tools.javac.code.Symbol$CompletionFailure)。如 cmets 中所述,已将其修改为仅引发警告:

    修复后,编译器将接受程序但发出 一个警告。理由是缺少注释可能导致 运行程序时出现问题。

    也来自 cmets:

    编译器应该不会崩溃,这个问题会先解决。

    虽然希望允许编译在没有 注释,我将不得不调查它是否允许。例如, 编译器无法确定缺少的注释是否具有 元注释@Inherited。 这可能会导致注释处理器出现问题。

    【讨论】:

    • 你的链接都不适合我。另外,为了超级清楚,您说预期的行为是我们不需要添加依赖项的依赖项,然后您说 javac 必须看到注解,那么最后这句话是什么意思?我们仍然不必区别对待注解和对待类依赖关系的方式,对吧?此外,知道他们为什么不在持久性库中永久解决这个问题会很有趣......
    • ...所有提供者或特别是 Eclipselink 是否都相同?因为它确实是一个错误(实际上是两个错误;首先,编译器崩溃(已修复),其次,我们需要在这种特殊情况下采取这种方式(w 持久性库(IES?))。跨度>
    • @fast-reflexes 第二个链接(我现在也无法打开它们,但昨天它们工作了......)表明它不仅与这个持久性库有关。你仍然不需要像我提到的那样添加传递依赖,所以我的意思是你可以忽略编译器警告。
    • @fast-reflexes 我发现这两个链接指向相同的错误:bugs.openjdk.java.net/browse/JDK-6365854bugs.openjdk.java.net/browse/JDK-6550655
    • 再次感谢!我想将此标记为已接受的答案,但我仍然不太明白...其中一个错误报告主要与编译器崩溃以及它在修复崩溃后发出警告似乎是期望的行为...这是否意味着这是所有注释类的行为(即使我们可以忽略它)还是持久性 jar 中的错误?
    猜你喜欢
    • 1970-01-01
    • 2015-10-03
    • 2019-12-05
    • 2011-11-11
    • 2015-12-28
    • 2018-09-18
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多