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