2014-10-17 38 views
5

我收到一個奇怪的問題,並在我的pom.xml中獲取編譯時異常,當我試圖添加依賴關係工具。罐子顯示如下(缺少神器的com.sun:工具:罐子:1.6.0Maven:缺少工件com.sun:工具:jar:1.6.0在POM.xml中編譯時間異常

Issue

我已經設置我的JAVA_HOME變量如下:

JAVA_HOME:C:\ Program Files \ Java \ jdk1.6.0_34

當我把它硬編碼到JDK1.6的實際路徑時,我沒有發現任何錯誤,如下所示。

<dependency> 
    <groupId>com.sun</groupId> 
    <artifactId>tools</artifactId> 
    <version>1.6.0</version> 
    <scope>system</scope> 
    <systemPath>C:\Program Files\Java\jdk1.6.0_34\lib\tools.jar</systemPath> 
</dependency> 

但我知道它不是很好的做法。請求解決此錯誤的指導。

+0

Maven將使用JAVA_HOME env變量來確定要使用的JDK。檢查一個設置是否正確。 – 2014-10-17 09:45:44

+0

@Shirish,你在運行maven命令行還是從IDE運行? – 2014-10-17 09:50:23

+0

@StijnGeukens:我通過命令提示符運行它,但已將它與我的eclipse集成。 – sTg 2014-10-17 09:52:42

回答

13

java.home是一般指向jre目錄系統屬性和你y出現錯誤你指出了一個不存在的罐子。

如果您想在您的pom文件中引用環境變量,請使用以下語法。

${env.variable_name} 

在你的情況下,它應該是${env.JAVA_HOME}所看到如下

<dependency> 
    <groupId>com.sun</groupId> 
    <artifactId>tools</artifactId> 
    <version>1.6.0</version> 
    <scope>system</scope> 
    <systemPath>${env.JAVA_HOME}/lib/tools.jar</systemPath> 
</dependency> 

更新:作爲lexicore已經提到的,這與MAC不會工作作爲MAC JDK有不同的文件結構。

+0

這不適用於Mac。 – lexicore 2014-10-18 12:13:32

+0

感謝您指出,我已經更新了答案中的相同內容。 – coderplus 2014-10-18 16:39:49

+0

是的,我看到了,做得很好。但它畢竟似乎是重複的。 http://stackoverflow.com/questions/3080437/jdk-tools-jar-as-maven-dependency/3080695#3080695 – lexicore 2014-10-18 16:42:11

2

在Maven中,$ {java.home}指向JDK使用的JRE目錄,而不是JDK本身。請參閱此問題:

Java_home in Maven

所以不是

${java.home}/lib/tools.jar 

它假定你應該使用

${java.home}/../lib/tools.jar 

但是JDK目錄,這只是解決方案的一半。問題是在Mac下,目錄結構不同。您必須使用用戶配置文件才能使您的構建可靠性跨平臺工作。

請參閱此問題:

JDK tools.jar as maven dependency

而且,specificaly,this answer(這是正確的答案,而不是一個由OP那裏接受)。

這是甲骨文如何處理它在one of their POMs

<!-- JDK dependencies --> 
<dependency> 
    <groupId>com.sun</groupId> 
    <artifactId>tools</artifactId> 
    <version>1.6</version> 
    <scope>system</scope> 
    <systemPath>${tools.jar}</systemPath> 
</dependency> 

然後在profiles

<profile> 
    <id>default-tools.jar</id> 
    <activation> 
    <file> 
     <exists>${java.home}/../lib/tools.jar</exists> 
    </file> 
    </activation> 
    <properties> 
    <tools.jar>${java.home}/../lib/tools.jar</tools.jar> 
    </properties> 
</profile> 
<profile> 
    <id>default-tools.jar-mac</id> 
    <activation> 
    <file> 
     <exists>${java.home}/../Classes/classes.jar</exists> 
    </file> 
    </activation> 
    <properties> 
    <tools.jar>${java.home}/../Classes/classes.jar</tools.jar> 
    </properties> 
</profile> 

在Mac JDK有不同的文件結構。這就是爲什麼你必須定義這些配置文件。

另請參見以下職位:

+0

注意這裏的區別 - 它們使用'$ {java.home} /../ lib'而不是'$ {java.home}/lib',這表明'$ {java.home}'指向'jre 'JDK內的目錄而不是JDK本身。 – 2014-10-17 10:23:09

+0

@IanRoberts有趣。我想知道它爲什麼會起作用。這可能也是我面臨的另一個問題的原因:http://stackoverflow.com/questions/26393332/getting-the-pom-for-name-is-invalid-transitive-dependencies-if-any-will-沒有 我會問他們。 – lexicore 2014-10-17 10:46:11

+0

@IanRoberts我重新檢查了這一點。在Maven中,$ {java.home}指向jre目錄。所以上面的配置是正確的。請參閱http://stackoverflow.com/questions/15279586/java-home-in-maven – lexicore 2014-10-18 15:48:18