Java中的注释会导致编译时传递依赖吗?

时间:2015-03-25 15:44:49

标签: java annotations persistence javac

一个简单的例子,其中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依赖项添加到类路径中可以解决问题,但并不遵循我通常认为处理依赖项的方式。由于我对注释很新,是否需要在编译Ent.java时将Includer.java的依赖关系添加到类路径中(可以说添加依赖项的依赖关系......) )或者这可能是某种错误或其他一些特殊情况......?编译器版本javac 1.8.0_31用于此测试。

1 个答案:

答案 0 :(得分:2)

这似乎与this bug: JDK-6550655

有关
  

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

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

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

  

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

同样来自评论:

  

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

     

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