Java 如何配置Maven来构建工件的两个版本,每个版本针对不同的目标JRE

Java 如何配置Maven来构建工件的两个版本,每个版本针对不同的目标JRE,java,maven,target,Java,Maven,Target,我有一个maven模块,需要在J2ME客户端和EJB服务器中使用。在客户机中,我需要为目标1.1编译它,在服务器中为目标1.6编译它 我还需要将1.6版本部署到Nexus存储库中,这样服务器项目的成员就可以包含此依赖项,而无需下载源代码 我曾经读到,使用个人资料并不是最好的方法,但作者没有说什么是最好的方法 以下是我的pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.or

我有一个maven模块,需要在J2ME客户端和EJB服务器中使用。在客户机中,我需要为目标1.1编译它,在服务器中为目标1.6编译它

我还需要将1.6版本部署到Nexus存储库中,这样服务器项目的成员就可以包含此依赖项,而无需下载源代码

我曾经读到,使用个人资料并不是最好的方法,但作者没有说什么是最好的方法

以下是我的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>

4.0.0
项目母公司
br.com.comp.proj
0.0.4-快照
项目加密库
项目库
br.com.comp
comp-proj移动消息
0.0.2-快照
maven编译器插件
2.3.2
1.3
1.1
真的

您可以通过Maven编译器插件进行配置

请看下面的图片

例如,您可以通过不同的配置文件启用此功能

如果你只想有不同的目标版本,你可以简单地使用一个可变的目标。大概是这样的:

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

maven编译器插件
2.3.2
1.3
${TARGET_VERSION}
真的
补充我对wjans回答的评论,因为您要求提供更多详细信息

下面将让编译器插件执行两次,以生成两组不同的类文件,这些类文件由所谓的
分类器识别(基本上,是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>

maven编译器插件
2.5
1.3
1.5
真的
jdk5
1.3
1.6
真的
jdk6

请注意,人们有时不喜欢使用
分类器,因为他们喜欢使用
概要文件,因为这可能意味着您的项目应该被分为多个项目,或者您正在损害构建的可移植性。

正如Haylem所建议的,您需要分两步完成,一个用于编译,一个用于JAR

对于编译器

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

maven编译器插件
2.5
1.3
1.5
真的
${project.build.outputDirectory}\u jdk5
1.3
1.6
真的
${project.build.outputDirectory}\u jdk6
然后是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>

org.apache.maven.plugins
maven jar插件
2.3.1
罐子
${project.build.outputDirectory}\u jdk5
jdk5
罐子
${project.build.outputDirectory}\u jdk6
jdk6
然后,您可以通过向依赖项添加
元素来引用所需的jar。e、 g

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

br.com.comp.proj
项目加密库
0.0.4-快照
jdk5

如果我理解了这一点,我将能够使用两个不同版本的javac。这不是我想要的。我希望这个模块在客户端项目中使用时使用目标1.1进行编译,在服务器项目中使用时使用目标1.6进行编译。我们试图用概要文件来实现这一点,但我已经读到使用概要文件来构建两个不同的工件不是一个好的实践。更新了我的答案。不确定为什么使用配置文件会是一种不好的做法?您可能需要补充一点,即如果您打算同时构建打包的归档文件/可交付文件,则需要使用分类器为其指定备用名称。我也不知道为什么,所以我将使用配置文件@海勒姆:分类器?@AlexOliveira:我补充了一个答案,其中有一些细节。关于概要文件,它们经常被人们所反对,因为它们不可能是一个设计糟糕的构建的标志,在这个构建中,您往往会使用概要文件来修复问题,并损害构建的可移植性。我想说,如果你想并且需要它为你工作,没有人会在意。但是,如果这是一个需要大量不同设置和环境的人支持和构建的项目,那么你应该小心。为什么服务器需要target 1.6?@PhilippeMarschall:我不知道。我在处理客户端,其他在服务器上工作的成员说他们真的需要它。这没有什么意义。使用目标1.1编译的代码在Java6VM中运行良好。答案很好!唯一能正确回答问题的是IMHO。