Maven POM:如何坚持财产不被覆盖

时间:2012-07-04 03:11:24

标签: inheritance maven properties pom.xml

我有一个父POM使用gmaven脚本来做一些事情:

   <plugin>
      <groupId>org.codehaus.gmaven</groupId>
      <artifactId>gmaven-plugin</artifactId>
      <version>1.4</version>

      <configuration combine.children="override">
        <providerSelection>2.0</providerSelection>
        <scriptPath>${basedir}/build/groovy</scriptPath>
      </configuration>
      <executions>
        <execution>
          <id>groovy-properties-script</id>
          <phase>validate</phase>
          <goals>
            <goal>execute</goal>
          </goals>
          <configuration>
            <source>computeProperties.groovy</source>
          </configuration>
        </execution>
          <!-- ... -->

所有的孩子也应该运行这个脚本,但他们会尝试根据他们的OWN basedir来解析脚本路径。通常这正是你想要的属性,但在这里它不起作用,我无法找到任何解决方法。

2 个答案:

答案 0 :(得分:0)

解决这个问题的方法似乎是使用set-system-properties的{​​{1}}目标,因此:

properties-maven-plugin

因为它不是继承的,所以此插件只能在父pom中运行。这看起来相当hacky,有没有一种本地的maven方式来实现这个目标?

答案 1 :(得分:0)

执行这些操作的最佳方法是将groovy脚本放在自己的jar文件中,并让maven-dependency-plugin为您解压缩。然后你的脚本可以指向解压缩的脚本。

就像这个例子:

directory layout

+- pom.xml
  +- script
  | +- pom.xml
  | +- src
  |   +- main
  |     +- resources
  |       +-computeProperties.groovy
  +- code
    +- pom.xml
    +- src
      +- main
        +- java

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.stackoverflow</groupId>
    <artifactId>Q11321971</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>${project.artifactId}-${project.version}</name>

    <properties>
    </properties>

    <modules>
        <module>script</module>
        <module>code</module>
    </modules>

    <dependencyManagement>
        <dependencies>
            <!-- Inter-Module dependencies -->
            <dependency>
                <groupId>com.stackoverflow</groupId>
                <artifactId>Q11321971-script</artifactId>
                <version>${project.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <version>2.4</version>
                    <executions>
                        <execution>
                            <id>unpack</id>
                            <phase>validate</phase>
                            <goals>
                                <goal>unpack</goal>
                            </goals>
                            <configuration>
                                <artifactItems>
                                    <artifactItem>
                                        <groupId>com.stackoverflow</groupId>
                                        <artifactId>Q11321971-script</artifactId>
                                        <overWrite>false</overWrite>
                                        <outputDirectory>${project.build.directory}/build/groovy</outputDirectory>
                                        <includes>**/*.groovy</includes>
                                    </artifactItem>
                                </artifactItems>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

script/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>

    <parent>
        <groupId>com.stackoverflow</groupId>
        <artifactId>Q11321971</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>Q11321971-script</artifactId>

    <name>${project.artifactId}-${project.version}</name>

</project>

code/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>

    <parent>
        <groupId>com.stackoverflow</groupId>
        <artifactId>Q11321971</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>Q11321971-code</artifactId>

    <name>${project.artifactId}-${project.version}</name>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-dependency-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

如果您运行此顶级pom,您会发现target模块的code目录中现在有build/groovy/computeProperties.groovy您可以在插件中引用。

通过将其添加到父级的<build/>标记中,即使对于父pom,这也适用于所有模块:

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-dependency-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

父母将拥有一个target目录,其中包含build/groovy/computeProperties.groovy

在您的插件中,您可以将<scriptPath/>更改为:

<scriptPath>${project.build.directory}/build/groovy</scriptPath>

由于maven-dependency-plugin现在正在validate阶段运行,因此gmaven-plugin必须在稍后阶段运行。这是你可以按照自己的意愿详细说明的内容。

这样做的好处是,如果有人只想检查一个子模块,那么他们就可以运行它,脚本jar将从repo下载并被使用。

不需要相对路径...