如何在Maven pom.xml上可变化shell脚本输出以使用

pet*_*ter 5 bash shell groovy maven-plugin maven

我想知道是否有一种方法可以使maven执行可卷曲资源并使响应可用的shell脚本,例如maven可以引用的环境变量或全局变量,或者可以这样做Groovy吗?

因此,当我进行Maven构建时,我想执行此Shell脚本。脚本本身将使curl变为某些资源URI并输出响应(我们可能不得不等待它返回),并且maven或Groovy可以某种方式获取该curl响应并将其用于设置某些配置。

A_D*_*teo 2

这是一个建议的方法:

该方法的要求:

  • 您期望的curl响应(或输出或您的脚本)应具有名称=值格式(即属性文件)
  • Exec Maven 插件执行必须在 Properties Maven 插件执行之前在 POM 中声明,并且它们必须附加到同一个 Maven 阶段或两个连续的 Maven 阶段,以便提供所需的流程
  • Properties Maven 插件执行必须附加到 Maven 的早期阶段(初始化或验证),以便使配置可用于其他 Maven 阶段和插件

有关 Maven 阶段的完整列表,请参阅此处的官方文档

更新:下面是流程示例,刚刚测试并完美运行(在 Windows 机器上):

<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.sample</groupId>
    <artifactId>generation</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.1</version>
                <executions>
                    <execution>
                        <id>retrieve-config</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <executable>echo</executable>
                    <arguments>
                        <argument>jar.name=from-exec</argument>
                        <argument>></argument>
                        <argument>config.properties</argument>
                    </arguments>
                    <workingDirectory>${basedir}/src/main/resources/</workingDirectory>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>properties-maven-plugin</artifactId>
                <version>1.0-alpha-2</version>
                <executions>
                    <execution>
                        <id>read-properties</id>
                        <phase>initialize</phase>
                        <goals>
                            <goal>read-project-properties</goal>
                        </goals>
                        <configuration>
                            <files>
                                <file>${basedir}/src/main/resources/config.properties</file>
                            </files>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <finalName>${jar.name}</finalName>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
Run Code Online (Sandbox Code Playgroud)

基本上,附加到阶段的 exec 插件validate将在构建开始时执行,将内容写入 config.properties 文件(通过 echo 命令)jar.name=from-exec

然后附加到该阶段的属性插件initialize将读取该 config.properties 文件并加载要用作构建一部分的属性。

然后,作为示例,jar 插件将使用该属性作为其配置的一部分(部分<finalName>${jar.name}</finalName>)。

运行,您将在目标文件夹中mvn clean package找到该文件。from-exec.jar

更新:上面是如何从脚本动态加载一组属性的示例,然后将这些属性注入到 Maven 构建中(因此用作 POM 配置的一部分)。

但是,如果您需要将此动态配置加载到应用程序中,您甚至可以跳过第二步(Propeprties Maven 插件)并从config.properties代码中的文件加载属性,只要该文件是应用程序类路径的一部分(就像上面的例子一样,放在src/main/resources) 下。

由于属性文件的创建发生在早期 Maven 阶段(validateinitialize),因此test(对于您的测试)和package(对于您的最终工件)阶段可以根据需要使用它。

在 Java 中,您可以使用该类,在 Groovy 中您可以按照java.util.Propertiesstackoverflow 中另一个问题的解释进行操作。