11.7.3. 平台分类器

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