一个简单的例子,其中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用于此测试。
答案 0 :(得分:2)
单独编译一个依赖于另一个类的类时的编译器错误,该类已经编译并且依赖于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。 这可能会导致注释处理器出现问题。