繁体   English   中英

maven构建使用jdk home \\ src.zip!\\ javax \\ annotation \\ Resource.java不依赖

[英]maven build uses jdk home\src.zip!\javax\annotation\Resource.java not dependency

这是intellij中的错误显示,但在maven中是相同的:

在此处输入图片说明

[34,14] cannot find symbol
[ERROR] symbol  : method lookup()
[ERROR] location: @interface javax.annotation.Resource
[ERROR] -> [Help 1]

我的pom具有这样的礼貌:

<dependency>
  <groupId>javax</groupId>
  <artifactId>javaee-api</artifactId>
  <version>6.0</version>
</dependency>

这导致找不到资源注释的查找方法。

我认为这是一个类加载问题。 JDK类将在类路径中的其他任何对象之前首先加载。 如果要覆盖它,则有标准的认可lib机制。 尝试将API JAR复制到您的JDK主页中的/lib/endorsed

Java EE具有JDK附带的一些不同版本的API。

为了克服此问题,存在“认可的API”的概念。

Java SE 7列出了“ Java平台的通用注释”作为认可的API: http : //docs.oracle.com/javase/7/docs/technotes/guides/standards/

由于某些原因,Java SE 8不再将“ Java平台的通用注释”作为认可的API列出,但是AFAIK仍受支持(文档错误?): http : //docs.oracle.com/javase/8 / docs / technotes / guides / standards /

但是请注意,认可的API概念已被弃用,可能不再适用于Java SE 9: https//www.java.com/en/download/faq/release_changes.xml

它可能会被拼图模块取代。

不幸的是,似乎没有任何迁移路径,因此,即使已弃用,您现在也必须使用认可的API概念。

这是NetBeans生成的内容(稍作修改):

<properties>
    <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
    ...
</properties>

 <dependencies>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
...
</dependencies>

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <compilerArguments>
                        <endorseddirs>${endorsed.dir}</endorseddirs>
                    </compilerArguments>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${endorsed.dir}</outputDirectory>
                            <silent>true</silent>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>javax</groupId>
                                    <artifactId>javaee-endorsed-api</artifactId>
                                    <version>7.0</version>
                                    <type>jar</type>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        ...
        </plugins>
        ...
    </build>

当然,您的应用程序服务器还需要指定背书的目录,但是对于大多数应用程序服务器,通常应直接对其进行配置。

 [34,14] cannot find symbol [ERROR] symbol : method lookup() [ERROR] location: @interface javax.annotation.Resource [ERROR] -> [Help 1] 

就是说,自Java SE 7起,JDK版本就支持Resource#lookup() ,所以我想您使用的是较小的JDK版本。

请注意,如果您使用的是Oracle的JDK / JRE版本,则仍然唯一支持Java SE 8。 所有其他版本均已终止生命,并且如果您要进行错误/安全更新,则需要与Oracle签订支持合同。

如果是这种情况,我强烈建议您尽可能升级到Java SE 8。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM