2010-06-22 69 views
21

我有一个场景,其中我的项目需要在不同的JDK中编译,并且生成的工件名称应该根据所用的JDK而不同。例如,如果项目名称是MyProject,并且我调用mvn install,那么它需要在JDK 1.4和JDK 1.5中编译,最后我得到两个相同项目的jar(MyProjectJDK14-1.0和MyProjectJDK15-1.0)。是可以做到这一点?在Maven中用不同的artifactid构建相同的项目(基于JDK)

回答

32

Maven的做法不是更改工件的finalName,而是使用分类器。例如:

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-jar-plugin</artifactId> 
     <configuration> 
      <classifier>${envClassifier}</classifier> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
    <profiles> 
    <profile> 
     <id>jdk16</id> 
     <activation> 
     <jdk>1.6</jdk> 
     </activation> 
     <properties> 
     <envClassifier>jdk16</envClassifier> 
     </properties> 
    </profile> 
    <profile> 
     <id>jdk15</id> 
     <activation> 
     <jdk>1.5</jdk> 
     </activation> 
     <properties> 
     <envClassifier>jdk15</envClassifier> 
     </properties> 
    </profile> 
    </profiles> 
</project> 

的JAR构件将被命名为${finalName}-${envClassifier}.jar并使用以下语法包括作为一个依赖:

<dependency> 
    <groupId>com.mycompany</groupId> 
    <artifactId>my-project</artifactId> 
    <version>1.0</version> 
    <classifier>jdk16</classifier> 
</dependency> 

你必须调用Maven构建两次,同时生产瓶(一体面的CI引擎可以做到这一点)。

6

您可以做的是定义两个profiles,每个JDK使用一个。每个配置文件将被激活,关于作为使用JDK:

<profiles> 
    <profile> 
     <id>profile-for-jdk1.4</id> 
     <activation> 
      <activeByDefault>false</activeByDefault> 
      <jdk>1.4</jdk> 
     </activation> 
     <build> 
      <finalName>myBuild-jdk1.4</finalName> 
     </build> 
    </profile> 
    <profile> 
     <id>profile-for-jdk1.5</id> 
     <activation> 
      <activeByDefault>false</activeByDefault> 
      <jdk>1.5</jdk> 
     </activation> 
     <build> 
      <finalName>myBuild-jdk1.5</finalName> 
     </build> 
    </profile> 
</profiles> 

然后,在每个配置文件,您可以定义一个特定<finalName>,这将被用来命名所生成JAR文件。因此,如果您使用JDK 1.4构建应用程序,则生成的JAR将被命名为myBuild-jdk1.4.jar

如果使用装配体构建最终包装,则可以简单地更改配置文件内的<build>块以配置装配体插件(例如到<finalName>)。


关于你的评论:的确,这个过程将需要两个独立的基础上Maven的,因为你改变了JDK版本时重新编译整个项目。 Maven2约定之一就是一个项目=一个工件。你想要的是有一个项目有两个工件。

最终,一种解决方案是使用Hudson来构建您的应用程序,尤其是此工具的matrix feature,它允许您使用各种参数运行多个构建,在您的情况下为JDK。

+0

嗨romaintaz,感谢您的答复。我想这个解决方案将工作,如果我使用不同的JDK调用maven构建两次,我只是想,是否有可能在一个go.ie调用maven install中生成两个jar,并且你得到两个jar作为输出,一个编译使用JDK1.4和其他使用JDK1.5 ...任何想法? – Manoj 2010-06-22 10:45:06

+0

@Manoj,看我的编辑。 – romaintaz 2010-06-22 11:55:46

+0

感谢romaintaz ...我在我的设置中使用Hudson ...我只是在寻找一种方法来单独使用Maven。 Anywayz似乎是HUDSON唯一的出路。 – Manoj 2010-06-22 12:37:56

2

使用Maven Profiles。加入本节您pom.xmlproject标签中:

<profiles> 
    <profile> 
    <activation> 
     <jdk>1.4</jdk> 
    </activation> 
    <build> 
     <finalName>${project.artifactId}-${project.version}-JDK1.4</finalName> 
    </build> 
    </profile> 
    <profile> 
    <activation> 
     <jdk>1.5</jdk> 
    </activation> 
    <build> 
     <finalName>${project.artifactId}-${project.version}-JDK1.5</finalName> 
    </build> 
    </profile> 
</profiles> 

this了解更多有关配置文件。

+0

嗨Abhin4v,谢谢你的回复。我想这个解决方案将工作,如果我使用不同的JDK调用maven构建两次,我只是想,是否有可能在一个go.ie调用maven install中生成两个jar,并且你得到两个jar作为输出,一个编译使用JDK1.4和其他使用JDK1.5 ...任何想法? – Manoj 2010-06-22 10:45:39

0

实际上有一种方法可以生成一个以上的WAR(我猜这也适用于JAR):您可以使用汇编插件和多个执行来处理不同的描述符。

1

一个类似的问题是在不同版本的JDK中使用的JDBC API的不同变体。

我决定这些需要不同的arifactIds而不是分类器。

您可以通过设置在设置的属性,然后在artifactId的标签引用这个实现这一目标:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <artifactId>throwing-jdbc-${jdbc.version}</artifactId> 
    <name>Throwing JDBC</name> 
    <profiles> 
    <profile> 
     <id>jdbc3</id> 
     <activation> 
     <activeByDefault>false</activeByDefault> 
     <jdk>[1.3,1.4,1.5]</jdk> 
     </activation> 
     <properties> 
     <jdbc.version>3.0</jdbc.version> 
     </properties> 
     <build> 
     <plugins> 
      <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>build-helper-maven-plugin</artifactId> 
      <version>1.7</version> 
      <configuration> 
       <sources> 
       <source>src/jdbc3-variants/java</source> 
       </sources> 
      </configuration> 
      <executions> 
       <execution> 
       <goals> 
        <goal>add-source</goal> 
       </goals> 
       </execution> 
      </executions> 
      </plugin> 
     </plugins> 
     </build> 
    </profile> 
    <profile> 
     <id>jdbc4</id> 
     <activation> 
     <activeByDefault>false</activeByDefault> 
     <jdk>1.6</jdk> 
     </activation> 
     <properties> 
     <jdbc.version>4.0</jdbc.version> 
     </properties> 
     <build> 
     <plugins> 
      <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
      </plugin> 
      <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>build-helper-maven-plugin</artifactId> 
      <configuration> 
       <sources> 
       <source>src/jdbc4/java</source> 
       <source>src/jdbc4-variants/java</source> 
       </sources> 
      </configuration> 
      <executions> 
       <execution> 
       <goals> 
        <goal>add-source</goal> 
       </goals> 
       </execution> 
      </executions> 
      </plugin> 
     </plugins> 
     </build> 
    </profile> 
    <profile> 
     <id>jdbc41</id> 
     <activation> 
     <activeByDefault>false</activeByDefault> 
     <jdk>1.7</jdk> 
     </activation> 
     <properties> 
     <jdbc.version>4.1</jdbc.version> 
     </properties> 
     <build> 
     <plugins> 
      <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
      </configuration> 
      </plugin> 
      <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>build-helper-maven-plugin</artifactId> 
      <configuration> 
       <sources> 
       <source>src/jdbc4/java</source> 
       <source>src/jdbc4.1/java</source> 
       <source>src/jdbc4.1-variants/java</source> 
       </sources> 
      </configuration> 
      <executions> 
       <execution> 
       <goals> 
        <goal>add-source</goal> 
       </goals> 
       </execution> 
      </executions> 
      </plugin> 
     </plugins> 
     </build> 
    </profile> 
    </profiles> 
    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 
    <build> 
    <sourceDirectory>src/main/java</sourceDirectory> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-source-plugin</artifactId> 
     <version>2.2.1</version> 
     <executions> 
      <execution> 
      <phase>verify</phase> 
      <goals> 
       <goal>jar</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 
相关问题