Tengo un escenario en el que mi proyecto debe compilarse en diferentes JDK y el nombre del artefacto resultante debe ser diferente según el JDK utilizado. Por ejemplo, si el nombre del proyecto es MyProject y llamo a mvn install, entonces necesita compilarse en JDK 1.4 así como en JDK 1.5, y finalmente obtengo dos jar del mismo proyecto (MyProjectJDK14-1.0 y MyProjectJDK15-1.0). ¿Es posible lograr esto?Creando el mismo proyecto en Maven con diferentes artefactos (basado en JDK)
Respuesta
La forma Maven de hacer esto no es cambiar el finalName
del artefacto sino usar un clasificador . Por ejemplo:
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<classifier>${envClassifier}</classifier>
</configuration>
</plugin>
</plugins>
</build>
...
<profiles>
<profile>
<id>jdk16</id>
<activation>
<jdk>1.6</jdk>
</activation>
<properties>
<envClassifier>jdk16</envClassifier>
</properties>
</profile>
<profile>
<id>jdk15</id>
<activation>
<jdk>1.5</jdk>
</activation>
<properties>
<envClassifier>jdk15</envClassifier>
</properties>
</profile>
</profiles>
</project>
El artefacto JAR será nombrado ${finalName}-${envClassifier}.jar
e incluyó como una dependencia con la siguiente sintaxis:
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>my-project</artifactId>
<version>1.0</version>
<classifier>jdk16</classifier>
</dependency>
Vas a tener que llamar a la Maven construir dos veces para producir dos frascos (una motor decente de CI puede hacer eso).
Lo que puede hacer es definir dos profiles, uno por JDK utilizado. Cada perfil se activará Con respecto a la cual se utiliza JDK:
<profiles>
<profile>
<id>profile-for-jdk1.4</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.4</jdk>
</activation>
<build>
<finalName>myBuild-jdk1.4</finalName>
</build>
</profile>
<profile>
<id>profile-for-jdk1.5</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.5</jdk>
</activation>
<build>
<finalName>myBuild-jdk1.5</finalName>
</build>
</profile>
</profiles>
Luego, en cada perfil, se define una específica <finalName>
, que será utilizado para nombrar el archivo JAR generado.
Por lo tanto, si construye su aplicación utilizando JDK 1.4, el JAR generado se llamará myBuild-jdk1.4.jar
.
Si su paquete final se construye utilizando un conjunto, puede simplemente cambiar el <build>
dentro de los perfiles del bloque para configurar el complemento de ensamblaje (por ejemplo, <finalName>
).
En cuanto a su comentario: De hecho, habrá que este procedimiento se basa en dos por separado Maven, ya que tienes que volver a compilar todo el proyecto cuando se cambia la versión del JDK. Una de las convenciones de Maven2 es que un proyecto = un artefacto. Lo que quieres es tener un proyecto con dos artefactos.
Finalmente, una solución es usar Hudson para compilar su aplicación, y especialmente el matrix feature de esta herramienta, que le permite ejecutar varias compilaciones con varios parámetros, en su caso el JDK.
Usar perfiles de Maven. Añadir esta sección dentro de la etiqueta de su project
pom.xml
:
<profiles>
<profile>
<activation>
<jdk>1.4</jdk>
</activation>
<build>
<finalName>${project.artifactId}-${project.version}-JDK1.4</finalName>
</build>
</profile>
<profile>
<activation>
<jdk>1.5</jdk>
</activation>
<build>
<finalName>${project.artifactId}-${project.version}-JDK1.5</finalName>
</build>
</profile>
</profiles>
Ver this saber más acerca de los perfiles.
Hola Abhin4v, gracias por la respuesta. Supongo que esta solución funcionará si llamo a la construcción maven dos veces usando diferentes JDK, solo estaba pensando si es posible generar los dos tarros en una sola llamada. Llama a maven install, y obtienes dos jarras como salida, una compilado usando JDK1.4 y el otro usando JDK1.5 ... ¿Alguna idea? – Manoj
En realidad, hay una manera de producir más de un WAR con una compilación (supongo que esto también funciona con los JAR): puede usar el complemento de ensamblaje con varias ejecuciones para diferentes descriptores.
Un problema similar son las diferentes variantes de la api JDBC utilizadas en diferentes versiones del JDK.
Decidí que necesitaban arifactIds diferentes en lugar de clasificadores.
se puede lograr esto mediante la creación de una propiedad en la configuración y luego hacer referencia a esto en la etiqueta artifactId:
<project>
<modelVersion>4.0.0</modelVersion>
<artifactId>throwing-jdbc-${jdbc.version}</artifactId>
<name>Throwing JDBC</name>
<profiles>
<profile>
<id>jdbc3</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>[1.3,1.4,1.5]</jdk>
</activation>
<properties>
<jdbc.version>3.0</jdbc.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<sources>
<source>src/jdbc3-variants/java</source>
</sources>
</configuration>
<executions>
<execution>
<goals>
<goal>add-source</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>jdbc4</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.6</jdk>
</activation>
<properties>
<jdbc.version>4.0</jdbc.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<configuration>
<sources>
<source>src/jdbc4/java</source>
<source>src/jdbc4-variants/java</source>
</sources>
</configuration>
<executions>
<execution>
<goals>
<goal>add-source</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>jdbc41</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.7</jdk>
</activation>
<properties>
<jdbc.version>4.1</jdbc.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<configuration>
<sources>
<source>src/jdbc4/java</source>
<source>src/jdbc4.1/java</source>
<source>src/jdbc4.1-variants/java</source>
</sources>
</configuration>
<executions>
<execution>
<goals>
<goal>add-source</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
- 1. proyecto Maven (EJB) con artefactos de cliente y servidor
- 2. Dependencia del proyecto Maven contra JDK versión
- 3. Creando documentación con maven
- 4. Maven: Adjuntar múltiples artefactos
- 5. m2eclipse suele descargar artefactos Maven
- 6. Crear artefactos múltiples con diferentes clasificadores a la vez
- 7. ¿Cómo incluir dos carpetas diferentes en el mismo proyecto git?
- 8. Xcode - Importación de diferentes archivos de encabezado con el mismo nombre basado en Target
- 9. Encontrar artefactos de Maven perdidos
- 10. Creando una versión fuente independiente con Maven
- 11. ¿Por qué maven busca artefactos en el repositorio incorrecto?
- 12. ¿Cómo ensamblar el proyecto maven multimodular en un WAR?
- 13. ¿Instalando diferentes versiones del mismo proyecto de iPhone?
- 14. Maven: incluye un archivo de recursos basado en el perfil
- 15. ¿Configura Maven para usar diferentes JDK para diferentes versiones de J2SE?
- 16. Diseño de proyecto Maven - compartiendo un proyecto en común
- 17. Carga de artefactos a Nexus, sin Maven
- 18. ¿Las diferentes actualizaciones JDK producen diferentes códigos de bytes Java?
- 19. Diferentes versiones de la misma dependencia en Maven
- 20. Maven: cómo filtrar el mismo recurso varias veces con diferentes valores de propiedad?
- 21. Diferentes VirtualHosts con el mismo puerto
- 22. Recopilación RequireJS en el proyecto Maven con dependencias JS externas
- 23. Creando un jar ejecutable con Maven 2
- 24. aplicación JavaFX en el proyecto Maven
- 25. método con el mismo nombre y diferentes parámetros en Ruby
- 26. Maven creando conjunto de cremallera plana
- 27. el ensamblaje de maven ignora finalName para artefactos dependientes
- 28. Especifique JDK para que Maven use
- 29. Maven: instalar artefactos en un repositorio local en el área de trabajo
- 30. Instalar artefactos de Maven en un repositorio local programáticamente
Hola romaintaz, gracias por la respuesta. Supongo que esta solución funcionará si llamo a la construcción maven dos veces usando diferentes JDK, solo estaba pensando si es posible generar los dos tarros en una sola llamada. Llama a maven install, y obtienes dos jarras como salida, una compilado usando JDK1.4 y el otro usando JDK1.5 ... ¿Alguna idea? – Manoj
@Manoj, ver mi edición. – romaintaz
Gracias romaintaz ... Utilizo Hudson en mi configuración ... Solo estaba buscando una forma de hacerlo con Maven solo. De todos modos parece que HUdson es el único camino a seguir. – Manoj