我有一個場景,其中我的項目需要在不同的JDK中編譯,並且生成的工件名稱應該根據所用的JDK而不同。例如,如果項目名稱是MyProject,並且我調用mvn install,那麼它需要在JDK 1.4和JDK 1.5中編譯,最後我得到兩個相同項目的jar(MyProjectJDK14-1.0和MyProjectJDK15-1.0)。是可以做到這一點?在Maven中用不同的artifactid構建相同的項目(基於JDK)
回答
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引擎可以做到這一點)。
您可以做的是定義兩個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。
使用Maven Profiles。加入本節您pom.xml
的project
標籤中:
<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瞭解更多有關配置文件。
嗨Abhin4v,謝謝你的回覆。我想這個解決方案將工作,如果我使用不同的JDK調用maven構建兩次,我只是想,是否有可能在一個go.ie調用maven install中生成兩個jar,並且你得到兩個jar作爲輸出,一個編譯使用JDK1.4和其他使用JDK1.5 ...任何想法? – Manoj 2010-06-22 10:45:39
實際上有一種方法可以生成一個以上的WAR(我猜這也適用於JAR):您可以使用匯編插件和多個執行來處理不同的描述符。
一個類似的問題是在不同版本的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>
- 1. 使用maven將1個項目構建爲不同的項目
- 2. java用不同的JDK版本構建:相同的工件?
- 3. 在TeamCity中構建相同解決方案的不同項目
- 4. 不同的maven構建在相同的pom文件中。
- 5. MSBuild使用兩個不同的項目構建相同的DLL
- 6. 如何在maven pom.xml下使用具有相同groupId和artifactId的不同版本構建和打包兩個jar。
- 7. Eclipse maven項目JDK構建路徑
- 8. maven和eclipse的構建方式不同,同一個項目
- 9. 在Eclipse中使用jdk 1.6和jdk 1.7用於不同的項目
- 10. Maven:構建包含不同模塊相關性的相同項目的不同WAR文件
- 11. 用不同的選項爲不同的目標構建相同的文件
- 12. 不能使用不同的配置文件構建maven項目
- 13. 想要不同的maven項目結構
- 14. 如何在eclipse中構建基於maven java的項目
- 15. 通過Maven構建具有不同JDK版本的JAR
- 16. 如何使用SVN和不同的相關構建目標來構建項目
- 17. Maven使不同的依賴相同的項目
- 18. 在Maven子項目中需要不同版本的相同依賴項
- 19. 使用LINQ返回與基於屬性的相關項目不同的項目。
- 20. Maven,Jenkins - 如何構建項目到不同的測試環境?
- 21. Maven的EAR插件 - 兩個庫與相同的artifactId
- 22. 重用相同的規則來構建不同的目標
- 23. 在pom.xml中使用maven構建java項目的基本標記
- 24. 基於Maven構建
- 25. 如何使用maven構建同一項目的2個版本
- 26. maven package(構建錯誤),同時構建項目
- 27. 依賴項目中的不同包 - Maven
- 28. 爲不同的容器構建不同的Maven構件
- 29. 在不同的項目中使用相同的java包
- 30. 基於多模塊項目的maven構建多個rpms
嗨romaintaz,感謝您的答覆。我想這個解決方案將工作,如果我使用不同的JDK調用maven構建兩次,我只是想,是否有可能在一個go.ie調用maven install中生成兩個jar,並且你得到兩個jar作爲輸出,一個編譯使用JDK1.4和其他使用JDK1.5 ...任何想法? – Manoj 2010-06-22 10:45:06
@Manoj,看我的編輯。 – romaintaz 2010-06-22 11:55:46
感謝romaintaz ...我在我的設置中使用Hudson ...我只是在尋找一種方法來單獨使用Maven。 Anywayz似乎是HUDSON唯一的出路。 – Manoj 2010-06-22 12:37:56