2010-06-20 23 views
69

Me gustaría poner JDK tools.jar como compilación de dependencia. He encontrado algunos ejemplos que indican cómo usar la propiedadsystemPath como la siguiente:JDK tools.jar como dependencia de maven

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

El problema es que el camino no es correcto para Mac OS X (sin embargo, es adecuado para Windows y Linux). Para ello, la ruta correcta es $ {java.home} /../ Classes/classes.jar.

Estoy buscando una forma de definir una propiedad maven de modo que si el sistema se detecta como Mac Os X, el valor se establece en $ {java.home} /../ Classes/classes.jar, de lo contrario, se establece en $ {java.home} /../ lib/tools.jar (como se puede hacer con ANT). ¿Alguien tiene una idea?

Respuesta

43

Para eso están los perfiles, extrae la ruta a una propiedad, configura los perfiles para Windows, OSX, etc. y define los valores de las propiedades de forma adecuada.

Aquí está la página de documento que discutir los perfiles de sistemas operativos: Maven Local Settings Model

Debe endup buscando algo como esto:

<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

estoy corriendo OS X 10.7 (Lion) y esta trabajado para mí, excepto lo curioso era que ya tenía un perfil de * nix para las cajas de Linux (Unix ). Con ambos perfiles allí, estaba ignorando mi perfil para mac. Así que podría cambiar la ruta para la entrada de perfil * nix o tuve que comentar el perfil de ese perfil para que mi perfil aparezca en mac –

+3

Si necesita admitir Apple Java 6 ('Clases/clases. jar') y Oracle Java 7 ('lib/tools.jar') en OS X, esto no funcionará, pero la respuesta de @Ladynt sí lo hará. –

+1

http://stackoverflow.com/a/29585979 Parece ser una mejor respuesta para JDK 1.7, JDK 1.8 y El Capitan para mí. –

36

Gracias por presentarme perfiles de Maven.

He utilizado el perfil como se mencionó anteriormente y mediante la activación de un perfil basado en la presencia del archivo deseado:

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

He publicado esta respuesta para resaltar un error en el post anterior: la sección propiedad puede ser solamente ser utilizado en la sección de activación para activar un perfil basado en la existencia de la propiedad especificada. Para definir una propiedad, la sección de propiedades debe usarse como arriba.

+0

Lo bueno de la comprobación de existencia de classes.jar es que vuelve a utilizar tools.jar en la plataforma Mac. Esto podría ser importante para el futuro OpenJDK lanzado en Mac ([link] (http://openjdk.java.net/projects/macosx-port/)) ya que probablemente tendría un tools.jar y no classes.jar. – prunge

+0

+1 porque esto prueba el archivo real que buscamos y no se basa en la detección del sistema operativo (que de todos modos no es necesario) –

+0

Más cerca, pero http://stackoverflow.com/a/29585979 fue una mejor solución en última instancia (para JDK 1.7/1.8 y El Capitán) al menos. –

-11

mi solución:

  1. poner tools.jar del Sol a la $JAVA_HOME/lib
  2. hacer un enlace simbólico en el $JAVA_HOME/.. llamado lib donde objetivo será $JAVA_HOME/lib
+8

No es una buena solución porque implica realizar algunas acciones en cada máquina donde el archivo JAR debe colocarse en la ruta de clases. – Laurent

+0

Intenté esto y variaciones de esto basadas en soluciones que encontré en otro lugar y no obtuve los resultados que esperaba. –

9

Hola Yo sé que ustedes están todo fue inteligente, pero me llevó un par de días darme cuenta de que la respuesta no estaba completa: tanto el perfil como la dependencia son necesarios. Espero que nadie pierda el tiempo en esto de nuevo. Por favor, consulte mi código completo a continuación:

<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 sección 'dependencias' dentro del perfil no es necesaria. Es suficiente con declarar esto, una vez, fuera del perfil y luego hacer que los perfiles determinen el valor correcto para la propiedad 'toolsjar'. –

+1

Esta dependencia solo es necesaria para mac, mejor solo para declarar dentro de este perfil – Jianyu

+0

No debería la línea ' $ {java.home} /../ Classes/classes.jar' más bien sea ' $ {java.home } /../ lib/tools.jar '? – Jens

8

De alguna manera, el eclipse en Windows no puede recoger {java.home}. Entonces, tuve que configurar JAVA_HOME en lugar de java.home. JAVA_HOME se configuró en Ejecutar-> Configuraciones de ejecución-> Entorno. Esto funcionó para mí con JDK estándar (no 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

Esta es una vieja pregunta que se hace en muchos lugares. Debido a que este es 2016 y estoy usando El Capitan con JDK 1.7 y JDK 1.8 ambos instalados, es mi opinión que esta es la forma más simple y limpia de resolver este problema en STS (Eclipse) y Maven (línea de comando) sin tener que crear enlaces simbólicos o de alguna manera médico el sistema instalado. Funcionó la primera vez para mí. :) :) :) –

1

El comentario de Edward es correcto.

Necesita el perfil Y necesita el dependency fuera del bloque profiles. El perfil simplemente determina qué valor va a obtener ${toolsjar}.

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