2014-10-17 9 views
5

Ich bekomme ein komisches Problem und bekomme eine Kompilierzeit Ausnahme in meiner pom.xml, wenn ich versuche, Abhängigkeit hinzuzufügen Werkzeuge. jar angezeigt, wie unten (Fehlende Artefakt com.sun: Werkzeuge: jar: 1.6.0)Maven: Fehlendes Artefakt com.sun: tools: jar: 1.6.0 Kompilierzeit Ausnahme in POM.xml

Issue

Ich habe meine JAVA_HOME Variable wie folgt:

JAVA_HOME: C: \ Programmdateien \ Java \ jdk1.6.0_34

Wenn ich es auf den tatsächlichen Pfad von JDK1.6 hartcodiere, finde ich keinen Fehler als unten.

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

aber ich weiß, es ist nicht gute Praxis. Fordern Sie eine Anleitung zum Beheben dieses Fehlers an.

+0

Maven verwendet die Variable JAVA_HOME env, um das zu verwendende JDK zu bestimmen. Überprüfen Sie, ob dieser richtig eingestellt ist. –

+0

@Shirish, laufen Sie maven Kommandozeile oder von einer IDE? –

+0

@StijnGeukens: Ich führe es durch meine Eingabeaufforderung, aber habe es mit meiner Eclipse integriert. – sTg

Antwort

13

java.home ist eine Systemeigenschaft, die auf das Verzeichnis jre im Allgemeinen Punkte und Sie sind einen Fehler als y erhalten Du hast auf ein Glas hingewiesen, das es nicht gibt.

Wenn Sie auf eine Umgebungsvariable innerhalb Ihrer Pom-Datei verweisen möchten, verwenden Sie die folgende Syntax.

${env.variable_name} 

In Ihrem Fall sollte es ${env.JAVA_HOME} sein, wie unten

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

-Update gesehen: Als lexicore, mit MAC als MAC JDK dies nicht funktionieren erwähnt hat eine andere Struktur-Datei.

+0

Dies funktioniert nicht auf Mac. – lexicore

+0

danke für das hinweisen, ich habe das gleiche in der Antwort aktualisiert. – coderplus

+0

Ja, ich sah, gut gemacht. Aber es scheint doch ein Duplikat zu sein. http://stackoverflow.com/questions/3080437/jdk-tools-jar-as-maven-dependency/3080695#3080695 – lexicore

2

In Maven verweist $ {java.home} auf das vom JDK verwendete JRE-Verzeichnis und nicht auf JDK selbst. Bitte beachten Sie diese Frage:

Java_home in Maven

Also statt

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

, die das JDK Verzeichnis vorausgesetzt, dass Sie verwendet haben, sollten

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

Dies ist jedoch nur eine Hälfte der Lösung . Das Problem ist, dass unter Mac die Verzeichnisstruktur anders ist. Sie müssen Benutzerprofile erstellen, damit Ihre Build-relibaly plattformübergreifend funktioniert.

Bitte sehen Sie diese Frage:

JDK tools.jar as maven dependency

Und specificaly, this answer (das ist die richtige Antwort und nicht das vom OP dort akzeptiert). Diese

ist, wie Oracle behandelt sie in 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> 

Und dann in 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> 

Auf Mac JDK hat eine andere Dateistruktur. Aus diesem Grund müssen Sie diese Profile definieren.

Siehe auch die folgenden Beiträge:

+0

Beachten Sie den Unterschied hier - sie benutzen '$ {java.home} /../ lib' anstelle von' {java.home}/lib', was darauf hindeutet, dass '{java.home}' auf 'jre verweist 'Verzeichnis im JDK und nicht im JDK selbst. –

+0

@IanRoberts Interessant. Ich frage mich, warum es dann funktioniert. Und das könnte auch die Ursache für ein anderes Problem sein, dem ich gegenüberstand: http://stackoverflow.com/questions/26393332/getting-the-pom-for-name-isinvalid-transitive-abhängigkeiten-if-any-will- nein Ich werde sie fragen. – lexicore

+0

@IanRoberts Ich habe das nochmal überprüft. In Maven zeigt $ {java.home} auf das jre-Verzeichnis. Die obige Konfiguration ist also korrekt. Siehe auch http://StackOverflow.com/questions/15279586/java-home-in-maven – lexicore