javax.annotation classes and Java 11 JDK

36

我正在从Java 8迁移到Java 11并遇到了问题。我应该使用:

  • maven-compiler-plugin 2.5.1与目标1.8(在java8中编译WAR文件)
  • tomcat9
  • Open 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>

请帮忙寻找解决方案!!


3
涉及编译器插件升级的问题。 - Naman
1
如果您正在使用 OpenJDK11,并且接受的答案没有解决您的问题,则可以尝试使用maven <extensions>解决方案。jsr250-api包含在maven库中。这会导致此问题。 - Diablo
5个回答

21

当升级 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>

1
谢谢回复,但并没有帮助到我... 已更新maven-compiler版本至3.8.0,javax.annotations 1.3.2库位于WAR包内的/lib文件夹中。仍然出现NoSuchMethodError错误:javax.annotation.Resource.lookup()Ljava/lang/String; - Sviatlana
@Sviatlana 为了重现这个问题,您能否更新您的问题并提供 MCFE(最小完整可验证示例)? - Mikhail Kholodkov
1
我刚刚找到了解决方案:javax.annotations库和jsr250库之间存在冲突... - Sviatlana

21
我的问题在于两个库之间的冲突:javax.annotations-api^1.3.2和jsr250-api:1.0。在jsr250-api中有一个javax.annotation.@Resource注释,但是没有lookup()方法!在某些运行环境中,jsr250的@Resource会首先被加载,在其他情况下则是javax.annotations-api的。在第一种情况下,我的错误就会发生:

  

合并bean定义的后处理失败;嵌套异常是java.lang.NoSuchMethodError:   javax.annotation.Resource.lookup()Ljava/lang/String;

解决方法:使用maven exclusion摆脱其中一个库。


8

我遇到了同样的问题。

我添加了以下几行代码,成功解决了这个问题:

<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>

只有当您的代码中不使用这些注解时,才会有所帮助。并且它们在项目中也没有被库使用。 - Sviatlana
我在使用OpenJdk11时遇到了同样的问题。这个解决方案对我有效。目前为止,我没有看到其他任何副作用。 - Diablo

6

我正在从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>

-3

我在我的项目中也遇到了JDK11的同样问题。

我的解决方案:

@Autowired
@Qualifier("bean's name")

改为:

@Resourse

3
@Autowired 是 Spring 框架的内容。与此问题无关,只有在您拥有 Spring 应用程序时才有效。 - eis
虽然这句话与问题本身没有直接关系,但它确实帮助了我在我的Spring应用程序中,谢谢。 - Gabe Gates
这将移除 'Caused by: java.lang.NoSuchMethodError: javax.annotation.Resource.lookup()Ljava/lang/String;' 异常,但我会获得另一个异常:' Caused by: java.lang.ClassCastException: class com.sun.proxy.$Proxy88 无法转换为 javax.persistence.EntityManagerFactory 类型(com.sun.proxy.$Proxy88 和 javax.persistence.EntityManagerFactory 在 org.apache.catalina.loader.ParallelWebappClassLoader@612bd450 加载器的未命名模块中) - victorpacheco3107
同意@eis。虽然在某些特定情况下它可能有所帮助,但这并不是与主题问题相关的答案。 - lospejos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接