2012-06-06 1 views
8

У меня есть модуль maven, который мне нужно использовать в клиенте J2ME и на сервере EJB. В клиенте мне нужно скомпилировать его для цели 1.1 и на сервере для целевого 1.6.Как настроить Maven для создания двух версий артефакта, каждый для другой цели JRE

Мне также нужно развернуть версию 1.6 в репозитории Nexus, поэтому члены, работающие над проектом сервера, могут включать эту зависимость, не загружая исходный код.

Я читал в http://java.dzone.com/articles/maven-profile-best-practices, что использование профилей - не лучший способ сделать это, но автор не сказал, что является лучшим способом.

Вот мой 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

Для чего вам нужна цель 1.6 для сервера? –

+0

@PhilippeMarschall: Не знаю. Я работаю над клиентом, другие участники, работающие на сервере, сказали, что им это действительно нужно. –

+0

Это не имеет смысла. Код, скомпилированный с целевым 1.1, отлично работает в виртуальной машине Java 6. –

ответ

5

Вы можете настроить это с помощью компилятора плагин Maven.

Посмотрите на Maven compiler plugin documentation.

Вы можете включить это с помощью различных профилей, например.

Если вы хотите иметь разные целевые версии, вы можете просто использовать переменную цель. Что-то вроде этого:

<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

Если я понял, используя это, я смогу использовать две разные версии javac. Это не то, что нужно. Я хочу, чтобы этот модуль был скомпилирован с целью 1.1, когда он используется в проекте клиента и с целевым значением 1.6 при использовании в проекте сервера. Мы пытались сделать это с помощью профилей, но я читал, что использование профилей для создания двух разных артефактов не является хорошей практикой. –

+0

Да, это правильно, вы бы использовали две разные версии javac. Обновлен мой ответ. Не знаете, почему использование профилей будет плохой практикой? – wjans

+3

Возможно, вы захотите добавить, что вам нужно будет использовать классификаторы для указания альтернативных имен для вашего упакованного архива/доставки, если вы собираетесь строить оба сразу. – haylem

1

Чтобы дополнить свой комментарий к ответу wjans', как вы просили больше деталей.

Ниже будет иметь плагин компилятор выполняется дважды для получения двух различных наборов файлы классов, определенных тем, что называется classifier (в основном, маркер для Maven, чтобы знать, что вы имеете в виду, когда один проект может производить несколько артефактов).

Грубо говоря, что-то вроде:

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

Обратите внимание, что иногда люди хмурятся на использовании classifier с, как и они на использовании profiles, так как они могут, возможно, означает, что ваш проект должен быть scinded в нескольких проектах или что вы нанося ущерб мобильности вашей сборки.

3

Как Haylem предлагает подумать, что вам нужно сделать это в два этапа: один для компиляции и один для банок.

Для компилятора

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

А потом фляги плагин

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

вы можете обратиться к необходимой банку путем добавления <classifier> элемента к вашей зависимости. например

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

Отличный ответ! Единственное, что правильно отвечает на вопрос ИМХО. –