2012-06-06 14 views
8

Tengo un módulo maven que necesito usar en el cliente J2ME y en el servidor EJB. En el cliente, necesito compilarlo para el objetivo 1.1 y en el servidor para el objetivo 1.6.Cómo configurar Maven para compilar dos versiones de un artefacto, cada una para un objetivo diferente JRE

También necesito implementar la versión 1.6 en un repositorio de Nexus, por lo que los miembros que trabajan en el proyecto de servidor pueden incluir esta dependencia sin necesidad de descargar el código fuente.

He leído en http://java.dzone.com/articles/maven-profile-best-practices que usar perfiles no es la mejor manera de hacerlo, pero el autor no dijo cuál es la mejor manera.

Aquí es mi pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <artifactId>proj-parent</artifactId> 
     <groupId>br.com.comp.proj</groupId> 
     <version>0.0.4-SNAPSHOT</version> 
    </parent> 

    <artifactId>proj-cryptolib</artifactId> 
    <name>proj - Cryto Lib</name> 

    <dependencies> 
     <dependency> 
      <groupId>br.com.comp</groupId> 
      <artifactId>comp-proj-mobile-messages</artifactId> 
      <version>0.0.2-SNAPSHOT</version> 
     </dependency> 
    </dependencies> 

    <build> 

     <plugins> 

      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.3.2</version> 
       <configuration> 
        <source>1.3</source> 
        <target>1.1</target> 
        <fork>true</fork> 
       </configuration> 
      </plugin> 

     </plugins> 

    </build> 

</project> 
+0

¿Por qué necesita el objetivo 1.6 para el servidor? –

+0

@PhilippeMarschall: No lo sé. Estoy trabajando en el cliente, los otros miembros que están trabajando en el servidor dijeron que realmente lo necesitan. –

+0

Eso realmente no tiene sentido. El código compilado con el objetivo 1.1 funciona bien en una VM Java 6. –

Respuesta

5

Esto se puede configurar mediante el plugin de Maven compilador.

Eche un vistazo al Maven compiler plugin documentation.

Puede habilitar esto a través de diferentes perfiles, por ejemplo.

Si solo desea tener diferentes versiones de destino, simplemente puede usar un objetivo variable. Algo como esto:

<plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>2.3.2</version> 
    <configuration> 
     <source>1.3</source> 
     <target>${TARGET_VERSION}</target> 
     <fork>true</fork> 
    </configuration> 
</plugin> 
+0

Si entendí, al usar esto podré usar dos versiones diferentes de javac. Esto no es lo que quieres. Quiero que este módulo se compile con el objetivo 1.1 cuando se usa en el proyecto del cliente y con el objetivo 1.6 cuando se usa en el proyecto del servidor. Intentamos hacer esto con los perfiles, pero he leído que usar perfiles para construir dos artefactos diferentes no es una buena práctica. –

+0

Sí, eso es correcto, estarías usando dos versiones diferentes de javac. Actualizado mi respuesta. ¿No estoy seguro de por qué usar perfiles sería una mala práctica? – wjans

+3

Es posible que desee agregar que necesitará utilizar clasificadores para especificar nombres alternativos para su archivo empaquetado/entregable, si tiene la intención de compilar ambos a la vez. – haylem

1

Para complementar mi comentario a la respuesta wjans', como usted pidió más detalles.

El siguiente tendría el plugin compilador ejecuta dos veces para producir dos conjuntos diferentes de archivos de clase, identificados por lo que se llama un classifier (básicamente, un marcador de Maven para saber lo que refiere a cuando un solo proyecto puede producir artefactos múltiples).

A grandes rasgos, algo así como:

<plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>2.5</version> 
    <executions> 
     <execution> 
     <configuration> 
      <source>1.3</source> 
      <target>1.5</target> 
      <fork>true</fork> 
      <classifier>jdk5</classifier> 
     </configuration> 
     </execution> 
     <execution> 
     <configuration> 
      <source>1.3</source> 
      <target>1.6</target> 
      <fork>true</fork> 
      <classifier>jdk6</classifier> 
     </configuration> 
     </execution> 
    </executions> 
</plugin> 

Tenga en cuenta que a veces las personas con buenos ojos el uso de classifier s, ya que en el uso de profiles, ya que posiblemente puede significar que su proyecto debe ser scinded en múltiples proyectos o que son Dañando la portabilidad de su construcción.

3

Como Haylem sugiere pensó que necesitaría hacerlo en dos pasos, uno para la compilación y otro para los frascos.

Para el compilador

<plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>2.5</version> 
    <executions> 
     <execution> 
     <configuration> 
      <source>1.3</source> 
      <target>1.5</target> 
      <fork>true</fork> 
      <outputDirectory>${project.build.outputDirectory}_jdk5</outputDirectory> 
     </configuration> 
     </execution> 
     <execution> 
     <configuration> 
      <source>1.3</source> 
      <target>1.6</target> 
      <fork>true</fork> 
      <outputDirectory>${project.build.outputDirectory}_jdk6</outputDirectory> 
     </configuration> 
     </execution> 
    </executions> 
</plugin> 

Y luego para el plugin frasco

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.3.1</version> 
     <executions> 
      <execution> 
      <goals> 
       <goal>jar</goal> 
      </goals> 
      <configuration> 
       <classesDirectory>${project.build.outputDirectory}_jdk5</classesDirectory> 
       <classifier>jdk5</classifier> 
      </configuration> 
      </execution> 
      <execution> 
      <goals> 
       <goal>jar</goal> 
      </goals> 
      <configuration> 
       <classesDirectory>${project.build.outputDirectory}_jdk6</classesDirectory> 
       <classifier>jdk6</classifier> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 

a continuación, puede hacer referencia a la jarra requerida mediante la adición de un elemento <classifier> a su dependencia. p.ej.

<dependency> 
    <groupId>br.com.comp.proj</groupId> 
    <artifactId>proj-cryptolib</artifactId> 
    <version>0.0.4-SNAPSHOT</version> 
    <classifier>jdk5</classifier> 
</dependency> 
+0

¡Gran respuesta! El único que responde correctamente la pregunta en mi humilde opinión. –

Cuestiones relacionadas