JDK tools.jar als Maven-Abhängigkeit

77

Ich möchte JDK tools.jar als Kompilierungsabhängigkeit verwenden. Ich habe einige Beispiele gefunden, die darauf hinweisen, die systemPath- Eigenschaft wie folgt zu verwenden:

<dependency>
  <groupId>com.sun</groupId>
  <artifactId>tools</artifactId>
  <scope>system</scope>
  <systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>

Das Problem ist, dass der Pfad für Mac Os X nicht korrekt ist (jedoch für Windows und Linux). Der richtige Pfad lautet dafür $ {java.home} /../ Classes / classes.jar .

Ich suche nach einer Möglichkeit, eine Maven-Eigenschaft so zu definieren, dass, wenn das System als Mac Os X erkannt wird, der Wert auf $ {java.home} /../ Classes / classes.jar gesetzt wird , andernfalls auf $ {java.home} /../ lib / tools.jar (wie es mit ANT möglich ist). Hat jemand eine Idee?

Laurent
quelle
@ user7610 Dies ist kein Duplikat. Diese Frage befasst sich mit der Situation vor Java 9. Das von Ihnen vorgeschlagene Duplikat behandelt die Situation nach Java 9.
Mark Rotteveel

Antworten:

47

Dafür sind Profile gedacht, extrahieren Sie den Pfad zu einer Eigenschaft, richten Sie Profile für Windows, OSX usw. ein und definieren Sie die Eigenschaftswerte entsprechend.

Hier ist die Dokumentseite, auf der Profile für Betriebssysteme erläutert werden: Maven Local Settings Model

Es sollte ungefähr so ​​aussehen:

  <profiles>
    <profile>
      <id>windows_profile</id>
      <activation>
        <os>
          <family>Windows</family>
        </os>
      </activation>
      <properties>
        <toolsjar>${java.home}/../lib/tools.jar</toolsjar>
      </properties>
    </profile>
    <profile>
      <id>osx_profile</id>
      <activation>
        <os>
          <family>mac</family>
        </os>
      </activation>
      <properties>
        <toolsjar>${java.home}/../Classes/classes.jar</toolsjar>
      </properties>
    </profile>
  </profiles>
sblundy
quelle
Ich verwende OS X 10.7 (Lion) und das hat bei mir funktioniert, außer dass ich bereits ein * nix-Profil für Linux-Boxen hatte (<family> unix </ family>). Mit diesen beiden Profilen wurde mein Profil für <family> mac </ family> ignoriert. Also konnte ich entweder den Pfad für den * nix-Profileintrag ändern oder ich musste das Profil für dieses Profil auskommentieren, damit mein Profil für <family> mac </ family> angezeigt wurde
Mark J Miller
3
Wenn Sie unter OS X sowohl Apple Java 6 ( Classes/classes.jar) als auch Oracle Java 7 ( lib/tools.jar) unterstützen müssen, funktioniert dies nicht, die Antwort von @ Laurent jedoch.
Matt McHenry
1
stackoverflow.com/a/29585979 Scheint für mich eine bessere Antwort für JDK 1.7, JDK 1.8 und El Capitan zu sein.
Paul Cunningham
Wie sollte der Pfad und Name dieser Datei lauten?
Vivekanon
40

Vielen Dank, dass Sie mir Maven-Profile vorgestellt haben.

Ich habe das Profil wie oben erwähnt verwendet und ein Profil basierend auf dem Vorhandensein der gewünschten Datei aktiviert:

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

Ich habe diese Antwort gepostet, um einen Fehler im vorherigen Beitrag hervorzuheben: Der Eigenschaftsabschnitt kann nur im Aktivierungsabschnitt verwendet werden, um ein Profil basierend auf dem Vorhandensein der angegebenen Eigenschaft zu aktivieren. Um eine Eigenschaft zu definieren, muss der Eigenschaftenabschnitt wie oben verwendet werden.

Laurent
quelle
Das Gute an der Existenzprüfung von classes.jar ist, dass auf die Verwendung von tools.jar auf der Mac-Plattform zurückgegriffen wird. Dies könnte für zukünftige OpenJDKs wichtig sein, die auf einem Mac veröffentlicht werden ( Link ), da es wahrscheinlich eine tools.jar und keine classes.jar haben würde.
Prunge
+1, weil dies für die tatsächliche Datei testet, nach der wir suchen, und nicht auf der Betriebssystemerkennung beruht (was sowieso nicht notwendig ist)
Stefan Haberl
Näher dran , aber stackoverflow.com/a/29585979 war letztendlich zumindest eine bessere Lösung (für JDK 1.7 / 1.8 und El Capitan).
Paul Cunningham
9

Hallo, ich weiß, ihr seid alle schlau, aber es hat mich ein paar Tage lang veranlasst herauszufinden, dass die Antwort nicht vollständig ist - sowohl das Profil als auch die Abhängigkeit sind notwendig. Ich hoffe, niemand wird wieder Zeit damit verschwenden. Bitte beachten Sie meinen vollständigen Code unten:

<profiles>
    <profile>
        <id>osx_profile</id>
        <activation>
            <activeByDefault>false</activeByDefault>
            <os>
                <family>mac</family>
            </os>
        </activation>
        <properties>
            <toolsjar>${java.home}/../Classes/classes.jar</toolsjar>
        </properties>
        <dependencies>
            <dependency>
                <groupId>com.sun</groupId>
                <artifactId>tools</artifactId>
                <version>1.6.0</version>
                <scope>system</scope>
                <systemPath>${toolsjar}</systemPath>
            </dependency>
        </dependencies>
    </profile>
</profiles>
Jianyu
quelle
2
Der dependenciesAbschnitt innerhalb des Profils ist nicht erforderlich. Es reicht aus, dies einmal außerhalb des Profils deklarieren zu lassen und dann die Profile den richtigen Wert für die toolsjarEigenschaft bestimmen zu lassen .
Edward Samson
1
Diese Abhängigkeit wird nur für Mac benötigt, besser nur innerhalb dieses Profils zu deklarieren
Jianyu
Sollte die Linie nicht <toolsjar>${java.home}/../Classes/classes.jar</toolsjar>lieber sein <toolsjar>${java.home}/../lib/tools.jar</toolsjar>?
Jens
7

Irgendwie kann die Sonnenfinsternis in Windows {java.home} nicht erfassen. Also musste ich JAVA_HOME anstelle von java.home setzen. JAVA_HOME wurde unter Run-> Run Configurations-> Environment festgelegt. Dies funktionierte bei mir mit Standard-JDK (nicht Apple JDK).

<profiles>
        <profile>
            <id>windows-profile</id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <file>
                    <exists>${JAVA_HOME}/lib/tools.jar</exists>
                </file>
            </activation>
            <properties>
                <toolsjar>${JAVA_HOME}/lib/tools.jar</toolsjar>
            </properties>
        </profile>
        <profile>
            <id>mac-profile</id>
            <activation>
                <activeByDefault>false</activeByDefault>
                <file>
                    <exists>${java.home}/../lib/tools.jar</exists>
                </file>
            </activation>
            <properties>
                <toolsjar>${java.home}/../lib/tools.jar</toolsjar>
            </properties>
        </profile>
    </profiles>


    <dependencies>
        <dependency>
                <groupId>jdk.tools</groupId>
                <artifactId>jdk.tools</artifactId>
                <version>jdk1.8.0</version>
                <scope>system</scope>
                <systemPath>${toolsjar}</systemPath>
            </dependency>
        </dependencies>
Animesh Sharma
quelle
1
Dies ist eine alte Frage, die an vielen Stellen gestellt wird. Da dies 2016 ist und ich El Capitan mit JDK 1.7 und JDK 1.8 verwende, ist dies meiner Meinung nach der einfachste und sauberste Weg, um dieses Problem sowohl in STS (Eclipse) als auch in Maven (Befehlszeile) zu lösen, ohne es erstellen zu müssen Symlinks oder irgendwie das installierte System behandeln. Es hat das erste Mal für mich funktioniert. :) :) :)
Paul Cunningham
5

Ich habe eine Lösung in F gefunden: Deklarieren Sie die Maven-Abhängigkeit von tools.jar, um mit JDK 9 zu arbeiten

Da die eigentliche Maven-Zauberei ziemlich aufwendig ist, für Neulinge überraschend ist und Gegenstand zukünftiger Verbesserungen ist, ist es besser, sie nicht gemeinsam zu kopieren und einzufügen. Daher ist dieses Modul vorhanden, sodass Sie die Details nicht kennen oder sich nicht darum kümmern müssen. ~~ https://github.com/olivergondza/maven-jdk-tools-wrapper

<dependency>
  <groupId>com.github.olivergondza</groupId>
  <artifactId>maven-jdk-tools-wrapper</artifactId>
  <version>0.1</version>
</dependency>
user7610
quelle
1

Der Kommentar von Edward ist richtig.

Sie benötigen das Profil UND Sie benötigen die dependencyAußenseite des profilesBlocks. Das Profil bestimmt nur, welcher Wert ${toolsjar}erhalten wird.

<dependencies>
    <dependency>
        <groupId>jdk.tools</groupId>
        <artifactId>jdk.tools</artifactId>
        <version>jdk1.8.0</version>
        <scope>system</scope>
        <systemPath>${toolsjar}</systemPath>
    </dependency>
</dependencies>
Marty
quelle
0

Richtige Anleitung für Anfänger

Fügen Sie dieses Profil zuerst zur Pom.xml-Datei über dem Tag oder an einer anderen Stelle darin hinzu.

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

dann JRE-Pfad korrigieren

Gehe zu :

Windows> Preferecnes> Installierte JREs

Wählen Sie die installierte JRE aus und doppelklicken Sie darauf oder klicken Sie im rechten Menü auf Bearbeiten. Stellen Sie dann sicher, dass sich der JRE-Startpfad in JDK befindet.

C: \ Programme \ Java \ jdk1.8.0_181 \ jre

Wenn Sie JRE separat installiert haben, hätte Eclipse eine eigenständige JRE ausgewählt, wie:

C: \ Programme \ Java \ jre1.8.0_181 \

Ändern Sie es in JRE, das mit JDK geliefert wird:

C: \ Programme \ Java \ jdk1.8.0_181 \ jre

user889030
quelle
-11

meine Lösung:

  1. Legen Sie die Werkzeuge der Sonne $JAVA_HOME/lib
  2. Erstellen Sie einen Symlink in der $JAVA_HOME/..benannten Bibliothek, in der sich das Ziel befindet$JAVA_HOME/lib
Totem
quelle
8
Dies ist keine gute Lösung, da auf jedem Computer, auf dem die JAR-Datei im Klassenpfad abgelegt werden muss, einige Aktionen ausgeführt werden müssen.
Laurent
Ich habe dies und Variationen davon versucht, basierend auf Lösungen, die ich an anderer Stelle gefunden habe, und habe nicht die erwarteten Ergebnisse erzielt.
Paul Cunningham