javax.annotation类和Java 11 JDK

时间:2019-07-02 15:04:11

标签: java maven java-11 maven-compiler-plugin

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

  • 目标为1.8的maven-compiler-plugin 2.5.1(在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>

请帮助找到解决方案!

4 个答案:

答案 0 :(得分:3)

在迁移Java的3个发行版之前,首先要考虑的是更新所有主要依赖项。

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 :(得分:2)

我有同样的问题。

我成功添加了以下几行:

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

答案 2 :(得分:1)

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

我的解决方案:

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

代替:

@Resourse

答案 3 :(得分:0)

对我来说,问题出在库之间冲突: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排除方法摆脱一个库。