Jakarta ee 在JavaEE应用程序中使用isAnnotationPresent时返回false

Jakarta ee 在JavaEE应用程序中使用isAnnotationPresent时返回false,jakarta-ee,reflection,annotations,Jakarta Ee,Reflection,Annotations,创建Java EE web应用程序归档后,调用下面的代码时,方法isAnnotationPresent()返回false,而在普通Java SE中工作正常。该方法应查找一个类中的所有测试。以下方法在单独的组件中 for (Method m : clazz.getDeclaredMethods()) { // only method with @Test if (m.isAnnotationPresent(Test.class)) { 我试着用完整的类名来做,结果是一样的。 当我通过

创建Java EE web应用程序归档后,调用下面的代码时,方法
isAnnotationPresent()
返回
false
,而在普通Java SE中工作正常。该方法应查找一个类中的所有测试。以下方法在单独的组件中

for (Method m : clazz.getDeclaredMethods()) {
   // only method with @Test
   if (m.isAnnotationPresent(Test.class)) {
我试着用完整的类名来做,结果是一样的。 当我通过
m.getAnnotations()
迭代所有
注释
并打印它时,
注释
就出现了


这可能是类加载器的问题吗?

我刚刚遇到了同样的问题。在一个简单的.jar或.war中,一切都可以正常工作,但一旦打包到.ear中,它就会开始工作。正如@BalusC在他的评论中所说的,问题在于注释类存在于多个位置,在我的例子中,注释类位于.ear/lib和.ear/.war/WEB-INF/lib中,因为依赖关系是在父pom.xml中声明的。一旦我确定依赖项在.war和.jar模块中提供了
,它将只打包在.ear/lib中,并且它将再次正常工作。在我的例子中.ear/lib是正确的位置,因为库是在.ear中的模块之间共享的,但在您的例子中,其他位置可能是正确的位置,这取决于实际需要此类的模块。在任何一种情况下,都要确保类(或包含该类的.jar)在最终工件和部署环境中只存在一次。

“这可能是类加载器问题吗?”。此问题可能是由于运行时类路径中物理上有多个
Test.class
文件引起的,通常是由错误/脏的生成引起的。例如,在/WEB-INF/classes中有一个,在/WEB-INF/lib和/或服务器/lib中有一个在JAR中,等等。根据问题中迄今为止提供的稀疏信息,至少不能准确指出这一点。它不包含关于正在使用的构建过程的任何线索。我正在使用Maven进行构建过程。用于查找测试的组件是web应用程序项目中的依赖项。测试注释来自TestNG,它也是作为依赖项提供的。TestNG依赖项的范围是什么?TestNG的范围是运行时。