假设你有一个类库,或者一个项目,它针对不同的平台有不同的输出。即使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>

