我有一个场景,其中我的项目需要在不同的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