javax.annotation 类和 Java 11 JDK
Posted
技术标签:
【中文标题】javax.annotation 类和 Java 11 JDK【英文标题】:javax.annotation classes and Java 11 JDK 【发布时间】:2019-11-13 06:30:16 【问题描述】:我正在从 Java 8 迁移到 Java 11 并遇到了问题。 我应该使用:
maven-compiler-plugin 2.5.1 与目标 1.8(在 java8 中编译 WAR) tomcat9 打开 JDK 11但在启动时不断出现错误:
合并 bean 定义的后处理失败;嵌套异常是 java.lang.NoSuchMethodError: javax.annotation.Resource.lookup()Ljava/lang/String;
我找到了多种解决方法。尝试添加依赖:
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
尝试添加扩展:
<extensions>
<extension>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</extension>
</extensions>
这些都没有帮助。
这是 maven-compiler-plugin 配置:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
请帮忙寻找解决办法!!
【问题讨论】:
与compiler plugin upgrade相关 如果您使用OpenJDK11
并且接受的答案没有解决您的问题,请尝试使用maven <extensions>
解决方案。 jsr250-api
包含在 maven 库中。这导致了这个问题。
【参考方案1】:
当提前迁移 3 个 Java 版本时,首先应该考虑更新所有主要依赖项。
maven-compiler-plugin
-> 当前版本为3.8.1
,
2.5.1 是 7 岁。
尝试以下方法解决此错误:
java.lang.NoSuchMethodError: javax.annotation.Resource.lookup()Ljava/lang/String;
保持依赖:
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.1</version>
</dependency>
并将其显式添加为模块:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>11</release>
<compilerArgs>
<arg>--add-modules</arg>
<arg>java.xml.ws.annotation</arg>
</compilerArgs>
</configuration>
</plugin>
【讨论】:
感谢您的回复,但没有帮助...将 maven-compiler 版本更新为 3.8.0,库 javax.annotations 1.3.2 存在于 WAR 内的 /lib 文件夹中。仍然收到错误 NoSuchMethodError: javax.annotation.Resource.lookup()Ljava/lang/String; @Sviatlana 为了重现该问题,您能否使用 MCFE 更新您的问题(最小完整可验证示例)? 刚刚找到解决办法:javax.annotations库和jsr250库有冲突...【参考方案2】:对我来说,问题在于库之间的冲突:javax.annotations-api^1.3.2 和 jsr250-api:1.0。 jsr250-api 中有一个 javax.annotation.@Resource 注解,没有 lookup() 方法!在某些运行环境中,首先加载 jsr250 的 @Resorse,在其他环境中加载 - javax.annotations-api。在第一种情况下,我的错误发生了:
合并 bean 定义的后处理失败;嵌套异常是 java.lang.NoSuchMethodError: javax.annotation.Resource.lookup()Ljava/lang/String;
解决:使用 maven 排除删除其中一个库。
【讨论】:
【参考方案3】:我遇到了同样的问题。
我成功添加了这些行:
<build>
...
<extensions>
<!-- Prevents this error, with JDK 13: -->
<!-- NoSuchMethodError: 'java.lang.String javax.annotation.Resource.lookup()' -->
<extension>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</extension>
<extension>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</extension>
</extensions>
</build>
【讨论】:
这仅在您不在代码中使用这些注释时才有帮助。而且项目中的库不使用它们。 我对@987654322@ 有同样的问题。这个解决方案对我有用。到目前为止,我没有看到其他方面的影响。【参考方案4】:我正在从 jdk 8 迁移到 jdk 13。我遇到了类似的问题。但问题是自从 jdk 11 以来,打包的 javax 已被弃用并被 jakarta 库取代。我正在使用 maven 3.8.4 和 jdk 13。
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.2</version>
</dependency>
【讨论】:
【参考方案5】:我在项目中使用 JDK11 时遇到了同样的问题。
我的解决方案:
@Autowired
@Qualifier("bean's name")
代替:
@Resourse
【讨论】:
Autowired 是 Spring 的东西。与此问题无关,仅在您拥有 Spring 应用程序时才有效。以上是关于javax.annotation 类和 Java 11 JDK的主要内容,如果未能解决你的问题,请参考以下文章
如何解决 java.lang.NoClassDefFoundError: javax/annotation/Generated?
Java 11 升级缺少 javax.annotation.security
import javax.annotation.* 无法在 Eclipse 的 Java 10 编译器中解析
websphere启动报错: java.lang.TypeNotPresentException: Type javax.annotation.Resource not present