2012-06-06 36 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

很好的答案!唯一正确回答恕我直言的问题。 –

相关问题