web-dev-qa-db-fra.com

JDK tools.jar en tant que dépendance maven

Je voudrais mettre JDK tools.jar comme dépendance à la compilation. J'ai trouvé quelques exemples qui indiquent d'utiliser la propriété systemPath comme ceci:

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

Le problème est que le chemin n'est pas correct pour Mac Os X (mais il est correct pour Windows et Linux). Pour cela, le chemin correct est $ {Java.home} /../ Classes/classes.jar .

Je cherche un moyen de définir une propriété maven telle que, si le système est détecté comme Mac OS X, la valeur est définie sur $ {Java.home} /../ Classes/classes.jar , sinon est défini sur $ {Java.home} /../ lib/tools.jar (comme il est possible de le faire avec ANT). Est-ce que quelqu'un a une idée?

72
Laurent

Merci de m'avoir présenté les profils maven.

J'ai utilisé le profil mentionné ci-dessus et en activant un profil basé sur la présence du fichier souhaité:

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

J'ai posté cette réponse pour mettre en évidence une erreur dans le post précédent: la section de propriété ne peut être utilisée que dans la section d'activation afin d'activer un profil basé sur l'existence de la propriété spécifiée. Pour définir une propriété, la section properties doit être utilisée comme ci-dessus.

39
Laurent

C'est à quoi servent les profils, extrayez le chemin d'accès à une propriété, configurez les profils pour Windows, OSX, etc. et définissez les valeurs de la propriété de manière appropriée. 

Voici la page de documentation qui traite des profils pour les systèmes d'exploitation: Modèle de paramètres locaux Maven

Cela devrait finir par ressembler à quelque chose comme ça:

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

Salut, je sais que vous êtes tous intelligents, mais cela m'a pris quelques jours pour comprendre que la réponse n'est pas complète - le profil et la dépendance sont nécessaires. J'espère que personne ne perdra plus de temps là-dessus. S'il vous plaît voir mon code complet ci-dessous:

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

D'une manière ou d'une autre, Eclipse dans Windows ne parvient pas à récupérer {Java.home}. Je devais donc définir Java_HOME au lieu de Java.home. Java_HOME a été défini dans Exécuter-> Exécuter les configurations-> Environnement. Cela a fonctionné pour moi avec JDK standard (pas 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>
7
Animesh Sharma

Le commentaire de Edward est correct.

Vous avez besoin du profil ET vous avez besoin de dependency en dehors du bloc profiles . Le profil détermine uniquement la valeur que ${toolsjar} va obtenir.

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

J'ai trouvé une solution dans Q: Déclarer la dépendance de maven sur tools.jar pour pouvoir travailler sur JDK 9

Comme la magie maven actuelle est assez élaborée, surprenante pour les nouveaux arrivants et sujette à des améliorations futures, il est préférable de ne pas la copier-coller. Par conséquent, ce module existe pour que vous n'ayez pas à connaître ou à vous soucier des détails. ~~ 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>
1
user7610

Instructions appropriées pour les débutants 

Ajoutez d’abord ce profil au fichier Pom.xml au-dessus de la balise ou ailleurs. 

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

puis corrigez le chemin JRE 

Aller à : 

Windows> Preferecnes> JRE installés

sélectionnez JAL intégré et double-cliquez dessus ou dans le menu de droite, cliquez sur Editer, puis assurez-vous que le chemin JRE Home est dans JDK et ressemble à ceci: 

C:\Program Files\Java\jdk1.8.0_181\jre

si vous aviez installé JRE séparément, Eclipse aurait choisi JRE autonome comme:

C:\Program Files\Java\jre1.8.0_181 \

alors changez-le en JRE qui vient avec JDK: 

C:\Program Files\Java\jdk1.8.0_181\jre

0
user889030