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

时间:2015-10-07 11:37:50

标签: java maven java-ee annotations

以下是intellij中的错误显示,但在maven中它是相同的:

enter image description here

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

这导致查找方法,未找到Resource annoation。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

它可能会被Jigsaw模块取代。

不幸的是,似乎没有任何迁移路径,因此您现在必须使用支持的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是唯一仍受支持的版本。所有其他版本都达到End of Life,如果您需要更新错误/安全性,则需要与Oracle签订支持合同。

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