2012-06-06 22 views
8

Ho un modulo Maven che devo usare nel client J2ME e nel server EJB. Nel client ho bisogno di compilarlo per target 1.1 e nel server per target 1.6.Come configurare Maven per creare due versioni di un artefatto, ognuna per un obiettivo diverso JRE

Devo anche distribuire la versione 1.6 a un repository Nexus, in modo che i membri che lavorano al progetto server possano includere questa dipendenza senza dover scaricare il codice sorgente.

Ho letto allo http://java.dzone.com/articles/maven-profile-best-practices che usare i profili non è il modo migliore per farlo, ma l'autore non ha detto qual è il modo migliore.

Ecco il mio 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

Perché è necessario il target 1.6 per il server? –

+0

@PhilippeMarschall: non lo so. Sto lavorando al cliente, gli altri membri che stanno lavorando sul server hanno detto che ne hanno davvero bisogno. –

+0

Questo non ha molto senso. Il codice compilato con l'obiettivo 1.1 funziona bene in una VM Java 6. –

risposta

5

È possibile configurare questo tramite il plugin compilatore Maven.

Dai uno sguardo allo Maven compiler plugin documentation.

È possibile abilitare questo tramite diversi profili, ad esempio.

Se si desidera avere solo versioni di destinazione diverse, è sufficiente utilizzare una destinazione variabile. Qualcosa di simile a questo:

<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

Se ho capito, usando questo sarò in grado di utilizzare due diverse versioni di javac. Questo non è quello che vuoi. Voglio che questo modulo venga compilato con l'obiettivo 1.1 quando viene utilizzato nel progetto client e con target 1.6 quando viene utilizzato nel progetto server. Stavamo cercando di farlo con i profili, ma ho letto che usare i profili per creare due artefatti diversi non è una buona pratica. –

+0

Sì, è corretto, dovresti utilizzare due diverse versioni di javac. Aggiornato la mia risposta. Non sei sicuro del motivo per cui utilizzare i profili sarebbe una cattiva pratica? – wjans

+3

È possibile aggiungere che è necessario utilizzare classificatori per specificare nomi alternativi all'archivio/deliverable pacchettizzato, se si intende creare entrambi contemporaneamente. – haylem

1

Per completare il mio commento alla risposta wjans', avete chiesto maggiori dettagli.

Di seguito avrebbe il plugin compilatore eseguito due volte per la produzione di due diversi insiemi di classfiles, identificati da quello che viene chiamato un classifier (in pratica, un marcatore per Maven di sapere cosa vi fa riferimento a quando un singolo progetto in grado di produrre più artefatti).

Approssimativamente, qualcosa di simile a:

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

Nota che le persone a volte cipiglio sull'uso classifier s, in quanto sull'uso profiles, in quanto possono significare che il progetto dovrebbe essere scinded in più progetti o che sei danneggiare la portabilità della tua build.

3

Come suggerisce Haylem, è necessario farlo in due passaggi, uno per la compilazione e uno per i vasi.

Per il compilatore

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

E poi per il plugin vaso

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

si può quindi fare riferimento al barattolo richiesto con l'aggiunta di un elemento <classifier> alla vostra dipendenza. per esempio.

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

Ottima risposta! L'unico che risponde correttamente alla domanda IMHO. –

Problemi correlati