假设你有一个类库,或者一个项目,它针对不同的平台有不同的输出。即使Java是平台无关的,但还是有一些时候,你会需要编写一些代码调用平台项目的本地代码。另一个可能性就是你编写了一些使用Maven
Native插件编译的C代码,并且要基于构建平台生成已修饰的构件。你可以通过Maven Assembly插件或者Maven
Jar插件设置一个分类器。以下的pom.xml
使用了由操作系统参数激活的profile来生成已修饰的构件。要了解更多的关于Maven
Assembly插件的信息,请参考Chapter 12, Maven套件。
Example 11.12. 使用由平台激活的Profile修饰构件
<project> ... <profiles> <profile> <id>windows</id> <activation> <os> <family>windows</family> </os> </activation> <build> <plugins> <plugin <artifactId>maven-jar-plugin</artifactId> <configuration> <classifier>win</classifier> </configuration> </plugin> </plugins> </build> </profile> <profile> <id>linux</id> <activation> <os> <family>unix</family> </os> </activation> <build> <plugins> <plugin> <artifactId>maven-jar-plugin</artifactId> <configuration> <classifier>linux</classifier> </configuration> </plugin> </plugins> </build> </profile> </profiles> </project>
如果操作系统是Windows家族,该pom.xml
就使用"-win"修饰这个JAR构建。如果操作系统是Unix家族,该构件就由"-linux"修饰。pom.xml
成功的给构件添加修饰符,但是由于在两个profile中的Maven
Jar插件的冗余配置,该文件变得有些累赘了。该样例可以被重写,如下,使用变量替换来减少冗余:
Example 11.13. 使用由平台激活的Profile和变量替换修饰构件
<project> ... <build> <plugins> <plugin> <artifactId>maven-jar-plugin</artifactId> <configuration> <classifier>${envClassifier}</classifier> </configuration> </plugin> </plugins> </build> ... <profiles> <profile> <id>windows</id> <activation> <os> <family>windows</family> </os> </activation> <properties> <envClassifier>win</envClassifier> </properties> </profile> <profile> <id>linux</id> <activation> <os> <family>unix</family> </os> </activation> <properties> <envClassifier>linux</envClassifier> </properties> </profile> </profiles> </project>
在这个pom.xml
中,每个profile不需要包含一个build
元素来配置Jar插件。每个profile通过操作系统家族参数激活,并且设置envClassifier
属性为win
或者linux
。这个envClassifier
属性由缺省pom.xml
的build
元素引用,以为项目的JAR构建添加分类器。JAR构件将会被命名为${finalName}-${envClassifier}.jar
,并且需要按如下的依赖语法引用。
Example 11.14. 依赖于一个已修饰的构件
<dependency> <groupId>com.mycompany</groupId> <artifactId>my-project</artifactId> <version>1.0</version> <classifier>linux</classifier> </dependency>