来自父POM的Maven插件管理变量绑定

4

你能帮我理解为什么我不能将<pluginMangement>配置放在我的父POM上吗?

我有这个<pluginMangement>配置。当它在父POM中时,我的构建失败,因为<pluginArtifact>错误地解析为:

io.grpc:protoc-gen-grpc-java:1.23.0:exe:linux-x86_64

当它在我的POM中时,<pluginArtifact>会正确解析为:
io.grpc:protoc-gen-grpc-java:1.23.0:exe:osx-x86_64

在我的本地POM中,我使用了这个构建扩展程序:
<build>
    <extensions>
        <extension>
            <groupId>kr.motd.maven</groupId>
            <artifactId>os-maven-plugin</artifactId>
            <version>1.5.0.Final</version>
        </extension>
    </extensions>

<pluginMangement>配置

(注意动态的<pluginArtifact>)

<build>
  <pluginManagement>
    <plugins>
  <plugin>
  <!-- http://os72.github.io/protoc-jar-maven-plugin/run-mojo.html -->
  <groupId>com.github.os72</groupId>
  <artifactId>protoc-jar-maven-plugin</artifactId>
  <version>${protoc-jar-maven-plugin.version}</version>
  <executions>
      <execution>
          <id>generate-sources</id>
          <phase>generate-sources</phase>
          <goals>
              <goal>run</goal>
          </goals>
          <configuration>
              <addProtoSources>all</addProtoSources>
              <includeMavenTypes>direct</includeMavenTypes>
              <includeMavenTypes>transitive</includeMavenTypes>
              <includeDirectories>
                  <include>src/main/proto</include>
              </includeDirectories>
              <inputDirectories>
                  <include>src/main/proto</include>
              </inputDirectories>
              <protocArtifact>
                  com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}
              </protocArtifact>
              <outputTargets>
                  <outputTarget>
                      <type>java</type>
                  </outputTarget>
                  <outputTarget>
                      <type>grpc-java</type>
                      <pluginArtifact>
                          io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}
                      </pluginArtifact>
                  </outputTarget>
              </outputTargets>
          </configuration>
      </execution>
  </executions>
</plugin>

当配置位于父级时,os.detected.classifier在构建开始时显示正确:

[INFO] ------------------------------------------------------------------------
[INFO] Detecting the operating system and CPU architecture
[INFO] ------------------------------------------------------------------------
[INFO] os.detected.name: osx
[INFO] os.detected.arch: x86_64
...
[INFO] os.detected.classifier: osx-x86_64

但是插件却显示解析到不正确的构件:

[INFO] --- protoc-jar-maven-plugin:3.8.0:run (generate-sources) @ recipe-order-processor ---
[INFO] Resolving artifact: com.google.protobuf:protoc:3.9.0:exe:linux-x86_64, platform: osx-x86_64

我怀疑问题出在继承的管理插件上的变量绑定时,但我找不到关于父POM中<pluginMangement>的"绑定顺序"的任何Apache Maven参考资料。

另外,如果我运行: mvn clean compile ...构建会在protoc-jar-maven-plugin处失败。 如果我运行: mvn protoc-jar 那么插件就会正确解析。 - JJ Zabkar
我还在protoc-jar-maven-plugin中设置了一个断点;在它被调用时,插件<configuration>中的变量已被解析/绑定到(错误的)linux-x86_64架构。 - JJ Zabkar
1个回答

2
为了使os.detected.classifier在使用os-maven-plugin时正确解析,您需要将其用作插件而不是扩展程序。由于某种原因,如果在父POM中将其用作扩展程序,则会解析为编译该父POM的平台。请注意确保您的依赖项不继承定义os-maven-plugin作为扩展程序的父POM。
文档没有提到将父POM继承作为配置os-maven-plugin为插件的原因,但以下是它关于如何使用的说明。
https://github.com/trustin/os-maven-plugin#issues-with-eclipse-m2e-or-other-ides
<plugin>
    <groupId>kr.motd.maven</groupId>
    <artifactId>os-maven-plugin</artifactId>
    <version>1.6.1</version>
    <executions>
        <execution>
            <phase>initialize</phase>
            <goals>
                <goal>detect</goal>
            </goals>
        </execution>
    </executions>
</plugin>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接