在Child中忽略的Parent Pom中定义的project.build.sourceEncoding

时间:2016-09-19 18:45:35

标签: maven encoding

鉴于父pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.acme</groupId>
    <artifactId>acme-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <properties>
        <java-version>1.8</java-version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <com.acme.dynamite-version>0.0.1-SNAPSHOT</com.acme.dynamite-version>
    // etc
    </properties>
</project>

和孩子pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.acme</groupId>
    <artifactId>child</artifactId>
    <version>dev-SNAPSHOT</version>
    <packaging>jar</packaging>
    <parent>
        <groupId>com.acme</groupId>
        <artifactId>acme-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>com.acme</groupId>
            <artifactId>dynamite</artifactId>
            <version>${com.acme.dynamite-version}</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

已解析在子pom中显式引用的属性com.acme.dynamite-version,但忽略project.build.sourceEncoding。 Jenkins构建的“mvn clean install&#39;发出警告:

  

[警告]使用平台编码(实际上是UTF-8)来复制过滤后的资源,即构建依赖于平台!

有没有办法让孩子pom识别project.build.sourceEncoding?这不是一个多模块项目,我只想在一个地方整合属性

2 个答案:

答案 0 :(得分:6)

在父POM are inherited in the child POM中定义的属性...但是为此,需要在构建子项之前安装定义这些属性的父POM。这就是问题所在:

  1. 您的父级版本为0.0.1-SNAPSHOT,右侧完全声明属性<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>。但是,定义此属性的父版本未安装在本地存储库中。
  2. 在尝试构建子项目时,Maven将在您的本地仓库中查找任何依赖项和父POM。它将找到没有该属性的父的版本并继续构建。然后,maven-resources-plugin将发出此警告,因为尚未设置编码。 (设置project.build.sourceEncoding默认设置为encoding used by this plugin)。
  3. 解决方案是首先构建父级。

    在多模块Maven项目中,您只需要构建父项:Maven将以这样的方式对反应堆进行排序,即首先构建依赖项目;所以在这种情况下,首先构建父代,然后构建子代(或者在这种情况下为模块),从而确保子代中可以访问父代中定义的所有属性。

    在多模块Maven项目之外,这个想法仍然是相同的,但是你需要执行两个不同的构建:首先是父版本将正确的版本安装到本地存储库,然后是子代。请注意,当这些父项不被用作aggregator projects时,更多的是作为构建块整合子项继承的公共属性时,最好有一个独特的发布周期:考虑释放你的父项,这样每个孩子都可以继承那个特定的版本。

答案 1 :(得分:-2)

您需要添加maven-resources-plugin才能激活过滤,例如:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-resources-plugin</artifactId>
      <version>3.0.1</version>
      <configuration>
        ...
        <encoding>UTF-8</encoding>
        ...
      </configuration>
    </plugin>
  </plugins>
  ...
</build>