Respuesta simple: tengo un IDE como Eclipse incorporado target/, y quiero poder construir también desde la línea de comandos sin que los dos procesos se pisen el uno al otro.
john sullivan
Otro caso de uso que encontré para esto: crear pruebas de integración como src/it/my-integration-test-project/pom.xmldesde la línea de comando sin crear un targetdirectorio en el árbol de origen que se copiará cuando las pruebas de integración se ejecuten como parte de la fase de verificación del proyecto contenedor.
Muchas gracias. ¿Por qué no se recomienda la segunda solución?
Igor Mukhin
1
@iimuhin, la primera solución es el uso correcto de las posibilidades dadas por la configuración de maven, la segunda es más un truco para que funcione. Si las opciones -Dproject.build.directoryestaban destinadas a ser utilizadas, serían utilizables; y esta es una solución para el -Dproject.build.directoryproblema. Además, con la primera solución, especifica las rutas de una vez por todas, no puede cometer un error tipográfico en el nombre del directorio cuando inicia la línea de comando, puede usar esta solución fácilmente incluso si trabaja desde un IDE, etc.
Colin Hebert
8
El problema con la solución de perfiles es que muchos de los casos de uso para cambiar el directorio de destino son específicos del usuario (como querer construir en un disco RAM) y no pertenecen al pom. Los perfiles en el archivo settings.xml específico del usuario no pueden contener un elemento de compilación, por lo que no es una opción.
EricS
Me encanta esta respuesta, pero tal vez incluir que puede activar un perfil a través settings.xmlde la línea de comandos en lugar de hacerlo, para una mayor portabilidad.
Rogue
1
Me gusta su "solución no recomendada" ya que me permitió construir en la línea de comandos en directorios alternativos, por lo tanto, sin molestar a Eclipse que apunta al $ {project.basedir} / target predeterminado. Por lo tanto, puedo codificar en Eclipse mientras construyo en la línea de comando al mismo tiempo sin esperar a que Eclipse se actualice / reconstruya
Francois Marot
28
Colin tiene razón en que debería usarse un perfil. Sin embargo, su respuesta codifica el directorio de destino en el perfil. Una solución alternativa sería agregar un perfil como este:
Hacerlo tendría el efecto de cambiar el directorio de compilación a lo que sea dado por la propiedad alt.build.dir, que se puede dar en un POM, en la configuración del usuario o en la línea de comando. Si la propiedad no está presente, la compilación se realizará en el directorio de destino normal.
Perdón por la pregunta n00b, pero ¿cuál es la forma adecuada de establecer la propiedad en el archivo de configuración del usuario para que esto sea ventajoso? Entiendo que la Referencia de configuración establece que las propiedades establecidas en el archivo de configuración no se interpolarán en el archivo de configuración.
Michael Scheper
Además, ¿qué ventaja ofrecería esto? Probablemente me esté perdiendo algo, pero suponiendo que los 'casos' del OP se especifiquen en la línea de comando, ¿no haría esto que el parámetro sea -Dalt.build.dir=~/mytargetequivalente a usar -Dpara alguna otra propiedad?
Michael Scheper
Ah, me acabo de dar cuenta de que todos aquí están hablando de agregar perfiles al POM, y no de settings.xml. Eso haría que mis preguntas fueran al menos tan m00t como n00b. Lo siento por eso.
target/
, y quiero poder construir también desde la línea de comandos sin que los dos procesos se pisen el uno al otro.src/it/my-integration-test-project/pom.xml
desde la línea de comando sin crear untarget
directorio en el árbol de origen que se copiará cuando las pruebas de integración se ejecuten como parte de la fase de verificación del proyecto contenedor.Respuestas:
Deberías usar perfiles.
<profiles> <profile> <id>otherOutputDir</id> <build> <directory>yourDirectory</directory> </build> </profile> </profiles>
Y comienza a maven con tu perfil
mvn compile -PotherOutputDir
Si realmente desea definir su directorio desde la línea de comando, puede hacer algo como esto ( NO recomendado en absoluto ):
<properties> <buildDirectory>${project.basedir}/target</buildDirectory> </properties> <build> <directory>${buildDirectory}</directory> </build>
Y compila así:
mvn compile -DbuildDirectory=test
Eso es porque no puede cambiar el directorio de destino usando
-Dproject.build.directory
fuente
-Dproject.build.directory
estaban destinadas a ser utilizadas, serían utilizables; y esta es una solución para el-Dproject.build.directory
problema. Además, con la primera solución, especifica las rutas de una vez por todas, no puede cometer un error tipográfico en el nombre del directorio cuando inicia la línea de comando, puede usar esta solución fácilmente incluso si trabaja desde un IDE, etc.settings.xml
de la línea de comandos en lugar de hacerlo, para una mayor portabilidad.Colin tiene razón en que debería usarse un perfil. Sin embargo, su respuesta codifica el directorio de destino en el perfil. Una solución alternativa sería agregar un perfil como este:
<profile> <id>alternateBuildDir</id> <activation> <property> <name>alt.build.dir</name> </property> </activation> <build> <directory>${alt.build.dir}</directory> </build> </profile>
Hacerlo tendría el efecto de cambiar el directorio de compilación a lo que sea dado por la propiedad alt.build.dir, que se puede dar en un POM, en la configuración del usuario o en la línea de comando. Si la propiedad no está presente, la compilación se realizará en el directorio de destino normal.
fuente
-Dalt.build.dir=~/mytarget
equivalente a usar-D
para alguna otra propiedad?