2010-06-20 8 views
69

Je voudrais mettre JDK tools.jar en tant que dépendance de compilation. J'ai trouvé quelques exemples qui indiquent d'utiliser le systemPath propriété comme ce qui suit:JDK tools.jar en tant que dépendance maven

<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 est incorrect pour Mac OS X (mais il est correct pour Windows et Linux). Pour cela, le chemin correct est $ {java.home} /../ Classes/classes.jar.

Je suis à la recherche d'un moyen pour définir une propriété Maven de telle sorte que si le système est détecté comme Mac Os X, la valeur est définie à $ {} java.home /../ Classes/classes.jar, sinon, il est défini sur $ {java.home} /../lib/outils.jar (comme c'est possible avec ANT). Est-ce que quelqu'un a une idée?

Répondre

43

C'est ce que sont les profils, extraire le chemin d'accès à une propriété, configurer les profils pour Windows, OSX, etc, et définir les valeurs de propriété de manière appropriée.

est ici la page doc que la discussion des profils pour les systèmes d'exploitation: Maven Local Settings Model

Il devrait endup regarder quelque chose comme ceci:

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

Je suis sous OS X 10.7 (Lion) et cela a fonctionné pour moi, si la chose drôle est que j'avais déjà un profil * nix pour les boîtes de linux ( unix). Avec ces deux profils, il ignorait mon profil pour mac. Donc, je pouvais soit changer le chemin pour l'entrée de profil * nix ou je devais commenter le profil pour ce profil afin qu'il verrait mon profil pour mac

+3

Si vous devez supporter Apple Java 6 ('Classes/classes. jar') et Oracle Java 7 ('lib/tools.jar') sur OS X, cela ne marchera pas, mais la réponse de Laurent le fera. –

+1

http://stackoverflow.com/a/29585979 Semble être une meilleure réponse pour JDK 1.7, JDK 1.8, et El Capitan pour moi. –

36

Merci de me présenter aux profils Maven.

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

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

+0

La bonne chose à propos de la vérification de l'existence de classes.jar est qu'il revient à l'aide de tools.jar sur la plate-forme Mac. Cela pourrait être important pour OpenJDK ultérieur publié sur Mac ([link] (http://openjdk.java.net/projects/macosx-port/)) car il aurait probablement un tools.jar et pas classes.jar. – prunge

+0

+1 parce que cela teste le fichier réel que nous recherchons et ne dépend pas de la détection du système d'exploitation (ce qui n'est pas nécessaire de toute façon) –

+0

Plus proche, mais http://stackoverflow.com/a/29585979 était finalement une meilleure solution (pour JDK 1.7/1.8 et El Capitan) au moins. –

-11

ma solution:

  1. mis aux $JAVA_HOME/lib
  2. faire un lien symbolique dans le $JAVA_HOME/.. nommé lib où la cible de tools.jar du Soleil sera $JAVA_HOME/lib
+8

Ce n'est pas une bonne solution car cela implique d'effectuer des actions sur chaque machine où le fichier JAR doit être placé dans le classpath. – Laurent

+0

J'ai essayé ceci et les variations de ceci basées sur des solutions que j'ai trouvées ailleurs et n'ai pas obtenu les résultats que j'attendais. –

9

Salut Je sais que les gars vous êtes tout intelligent, mais il m'a fallu quelques jours pour comprendre la réponse n'est pas complète - à la fois le profil et la dépendance est nécessaire. J'espère que personne ne perdra du temps à ce sujet. 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> 
+2

La section 'dependencies' à l'intérieur du profil n'est pas nécessaire. Il suffit d'avoir déclaré ceci, une fois, en dehors du profil et ensuite les profils déterminent la valeur correcte pour la propriété 'toolsjar'. –

+1

Cette dépendance est seulement nécessaire pour mac, mieux vaut seulement déclarer à l'intérieur de ce profil – Jianyu

+0

Ne devrait pas la ligne ' $ {java.home} /../ Classes/classes.jar' plutôt être ' $ {java.home } /../ lib/tools.jar '? – Jens

8

D'une certaine façon, l'éclipse dans les fenêtres ne ramasser {} java.home. Donc, j'ai dû mettre JAVA_HOME au lieu de java.home. JAVA_HOME a été défini dans Run-> Run Configurations-> Environment. 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> 
+1

C'est une vieille question posée à plusieurs endroits. Parce que nous sommes en 2016 et que j'utilise El Capitan avec JDK 1.7 et JDK 1.8 installés, je pense que c'est le moyen le plus simple et le plus propre de résoudre ce problème à la fois dans STS (Eclipse) et Maven (ligne de commande) sans avoir à créer liens symboliques ou en quelque sorte médecin le système installé. Cela a fonctionné la première fois pour moi. :) :) :) –

1

Le commentaire de Edward est correct.

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

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