maven执行groovy脚本相关配置

37 阅读1分钟

maven属性与groovy变量对照表

maven属性groovy变量
${project.basedir}project.basedir
${project.build.directory}project.build.directory
${project.artifactId}project.artifactId
${project.version}project.version
${project.build.outputDirectory}project.build.outputDirectory
<properties>project.properties['property.name']
命令行传入-Dxxx=yyySystem.getProperty("xxx")
${maven.multiModuleProjectDirectory}System.getProperty("maven.multiModuleProjectDirectory")

特殊模块执行多脚本

方式1-多Execution机制

隔离性最好,特殊模块追加一个单独的<execution>来运行特定脚本。

根pom的pluginManagement中定义全局默认的execution:

<build>
  <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.codehaus.gmavenplus</groupId>
        <artifactId>gmavenplus-plugin</artifactId>
        <version>3.0.2</version>
        <executions>
          <!-- 全局公共execution  -->
          <execution>
            <id>exec-common-c1</id>
            <phase>generate-sources</phase>
            <goals><goal>execute</goal></goals>
            <configuration>
              <scripts>
                <script>file:///${maven.multiModuleProjectDirectory}/corp-parent/src/main/scripts/c1.groovy</script>
              </scripts>
            </configuration>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>org.apache.groovy</groupId>
            <artifactId>groovy</artifactId>
            <version>4.0.15</version>
            <scope>runtime</scope>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </pluginManagement>
</build>

特殊模块,并非覆盖:

<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.gmavenplus</groupId>
      <artifactId>gmavenplus-plugin</artifactId>
      <executions>
        <!-- 追加仅属于特殊模块的 execution -->
        <execution>
          <id>exec-parent-c2</id>
          <phase>generate-sources</phase>
          <goals><goal>execute</goal></goals>
          <configuration>
            <scripts> <script>file:///${project.basedir}/src/main/scripts/c2.groovy</script>
            </scripts>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

方式2-多script标签机制

<scripts>标签支持按顺序罗列多个<script>

<!-- corp-parent-api/pom.xml -->
<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.gmavenplus</groupId>
      <artifactId>gmavenplus-plugin</artifactId>
      <configuration>
        <scripts>
          <!-- 1. 先运行公共脚本 c1 -->
          <script>file:///${maven.multiModuleProjectDirectory}/corp-parent/src/main/scripts/c1.groovy</script>
          <!-- 2. 紧接着运行专有脚本 c2 -->
          <script>file:///${project.basedir}/src/main/scripts/c2.groovy</script>
        </scripts>
      </configuration>
    </plugin>
  </plugins>
</build>

全局配置仅指定模块生效

方式1-使用gmaven.skip属性开关

<properties>
  <!-- 默认全局跳过 Groovy 脚本执行 -->
  <gmaven.skip>true</gmaven.skip>
</properties>

<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.gmavenplus</groupId>
      <artifactId>gmavenplus-plugin</artifactId>
      <version>3.0.2</version>
      <configuration>
        <!-- 绑定跳过开关 -->
        <skip>${gmaven.skip}</skip>
      </configuration>
      <executions>
        <execution>
          <id>exec-common-c1</id>
          <phase>generate-sources</phase>
          <goals><goal>execute</goal></goals>
          <configuration>
            <scripts>
              <script>file:///${maven.multiModuleProjectDirectory}/corp-parent/src/main/scripts/c1.groovy</script>
            </scripts>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

需要的模块开启:

<!-- corp-diligence-api/pom.xml (其他 api 模块同理) -->
<properties>
  <api.pkg>com.corp.diligence.api</api.pkg>
  <!-- 仅 API 模块开启插件执行 -->
  <gmaven.skip>false</gmaven.skip>
</properties>

方式2-脚本内匹配artifactId

// c1.groovy 头部
// 仅当当前模块的 artifactId 以 "-api" 结尾时才执行
if (!project.artifactId.endsWith("-api")) {
    return
}

// ... 下面是正常生成的 c1 逻辑 ...

方式3-抽取独立父POM

gmavenplus-plugin 声明在专属父POM的 <build><plugins>中。