2010-06-22 105 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> 
相關問題