一个简单的例子,其中Ent.java
使用注释并使用必要的 jar 依赖项进行编译,然后Includer.java
编译后又导入Ent.java
.
ent.java:
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name="securities")
public class Ent {}
包含程序.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
当然,如果我们添加更多注释,也会发生同样的情况,但只有带参数的注释似乎才会导致这种行为。编译时将第一次编译时的jar依赖添加到classpath中Includer.java
解决了问题,但不遵循我通常认为的依赖关系的处理方式。由于我对注释很陌生,我们需要添加以下依赖项是预期的行为吗?Ent.java
编译时添加到类路径中Includer.java
(可以这么说,添加依赖项的依赖项...)或者这可能是某种错误或其他某种特殊情况...?本测试使用编译器版本 javac 1.8.0_31。
这似乎与这个错误:JDK-6550655 http://bugs.java.com/view_bug.do?bug_id=6550655:
单独编译依赖于另一个类的类时出现编译器错误,该类已编译且依赖于 persistence-api.jar 中的类
另请参阅相关错误JDK-6365854:针对带注释的类进行编译时 javac 崩溃 http://bugs.java.com/view_bug.do?bug_id=6365854.
要回答您的问题,不需要放置依赖类的依赖项(Ent.java
) 到依赖类的类路径 (Includer.java
)。然而,似乎javac
还读取依赖类中的注释。根据引用的错误,这曾经导致编译失败(acom.sun.tools.javac.code.Symbol$CompletionFailure
)。正如评论中提到的,这被修改为仅抛出警告:
修复后,编译器将接受该程序,但会发出
一个警告。理由是缺少注释可能会导致
运行程序时出现问题。
还来自评论:
编译器不应该崩溃,这个问题将首先得到解决。
虽然希望允许编译在没有
注释,我将不得不调查是否允许。例如,
编译器无法确定缺少的注释是否具有
元注释@Inherited。
这可能会给注释处理器带来问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)