2012-06-06 37 views
8

我有一個需要在J2ME客戶端和EJB服務器中使用的Maven模塊。在客戶端中,我需要針對目標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 VM中運行良好。 –

回答

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 S,因爲他們使用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> 

再來說Jar插件

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

那麼你可以參考所需的jar通過添加<classifier>元素,你的依賴。例如

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

很好的答案!唯一正確回答恕我直言的問題。 –

相關問題