3

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

   <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 来解析脚本路径。通常这正是你想要的属性,但在这里它不起作用,我想不出任何办法。

4

2 回答 2

1

解决这个问题的一种方法似乎是使用 的set-system-properties目标properties-maven-plugin,因此:

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>properties-maven-plugin</artifactId>
    <version>1.0-alpha-2</version>
    <inherited>false</inherited>
    <executions>
      <execution>
        <goals>
          <goal>set-system-properties</goal>
        </goals>
        <configuration>
          <properties>
            <property>
              <name>com.binu.core.parent.basedir</name>
              <value>${basedir}</value>
            </property>
          </properties>
        </configuration>
      </execution>
    </executions>
  </plugin>

因为不是继承的,所以这个插件只会在父pom中运行。不过,这似乎很hacky,有没有一种本地的maven方法来实现这一点?

于 2012-07-04T03:14:07.563 回答
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 下载并被使用。

不需要相对路径...

于 2012-07-04T08:33:14.263 回答