2

我找到了这个关于如何使用 Groovy scriptlet 附加 Maven 端工件的示例。我已经看到MavenSession.lookup已被弃用,我应该使用依赖注入。让我们假设有以下 POM.xml 部分:

<plugin>
    <groupId>org.codehaus.gmaven</groupId>
    <artifactId>gmaven-plugin</artifactId>
    <version>1.5</version>
    <executions>
        <execution>
            <id>attach-config-artifacts</id>
            <phase>package</phase>
            <goals><goal>execute</goal></goals>
            <configuration>
                <source>
                    def helper = session.lookup("org.apache.maven.project.MavenProjectHelper")

                    new File('${basedir}').eachFileMatch( ~/.[^\.]*.cfg$/ ) { configFile ->
                        println configFile + " attached as artifact."
                        helper.attachArtifact( project, "cfg", configFile.name, configFile )
                    }
                </source>
            </configuration>
        </execution>
    </executions>
</plugin>

如何将 MavenProjetHelper 注入到我的 scriptlet 中?可能吗?我不想创建 Mojo 或 Groovy Mojo,我想让它内联在 POM 中。

更新: 如果不清楚:上面的示例完美运行,但使用了已弃用的 API (MavenSession.lookup)。问题仅在于是否可以将任何内容注入 gmaven scriptlet。

4

2 回答 2

1

您可以使用ContainerHelper.lookup

def projectHelper = container.lookup("org.apache.maven.project.MavenProjectHelper")
def artifactFile = new File(project.build.directory, "artifact.zip")
projectHelper.attachArtifact(project, "zip", null, artifactFile)
于 2014-12-04T10:00:28.690 回答
0

在这种特殊情况下,仅使用Build Helper 插件可能更简单。

但是假设您出于某种原因不想走这条路,使用 GMaven,您必须通过 properties 对象引用所有对象(如此处所示。此外,GMaven 不再维护。我建议改为

<plugin>
  <groupId>org.codehaus.gmavenplus</groupId>
  <artifactId>gmavenplus-plugin</artifactId>
  <version>1.2</version>
  <executions>
    <execution>
      <id>attach</id>
      <configuration>
        <scripts>
          <script><![CDATA[
            def helper = session.lookup("org.apache.maven.project.MavenProjectHelper")
            project.basedir.eachFileMatch( ~/.[^\.]*.cfg$/ ) { configFile ->
              helper.attachArtifact(project, "cfg", configFile.name, configFile)
              println "${configFile.name} attached as artifact."
            }
          ]]></script>
        </scripts>
      </configuration>
      <goals>
        <goal>execute</goal>
      </goals>
      <phase>prepare-package</phase>
    </execution>
  </executions>
  <dependencies>
    <dependency>
      <groupId>org.codehaus.groovy</groupId>
      <artifactId>groovy-all</artifactId>
      <version>2.3.3</version>
    </dependency>
  </dependencies>
</plugin>

您会注意到我将阶段更改为准备包而不是包。这是因为附加到阶段的目标发生在该阶段的所有默认目标都已运行之后。因此,将其附加到包阶段会将其添加到包已经创建后的工件列表中(我认为这不是您想要的)。


编辑:根据您的编辑。这其实是我之前没有考虑过的问题。看起来没有通过会话调用是没有办法的(你可以调用 session.container.lookup,但 session.getContainer() 也被弃用了)。您真正想要做的是访问 Plexus 容器以访问该对象,如果没有插件本身为您连接它,没有好的方法可以做到这一点(实际上这就是 Build Helper 插件所做的)。您可以将对象添加到它所绑定的事物列表中,但我认为没有一个 Maven 表达式可以用来获取所需的对象。GMavenPlus 1.3 将包含此功能。如果您想试一试,我已将它添加到 1.3-SNAPSHOT 中(它在 Codehaus 存储库中,但它可能在 Maven Central 中的前一天)。

<plugin>
  <groupId>org.codehaus.gmavenplus</groupId>
  <artifactId>gmavenplus-plugin</artifactId>
  <version>1.3-SNAPSHOT</version>
  <executions>
    <execution>
      <id>attach</id>
      <configuration>
        <scripts>
          <script><![CDATA[
            project.basedir.eachFileMatch( ~/.[^\.]*.cfg$/ ) { configFile ->
              projectHelper.attachArtifact(project, "cfg", configFile.name, configFile)
              println "${configFile.name} attached as artifact."
            }
          ]]></script>
        </scripts>
      </configuration>
      <goals>
        <goal>execute</goal>
      </goals>
      <phase>prepare-package</phase>
    </execution>
  </executions>
  <dependencies>
    <dependency>
      <groupId>org.codehaus.groovy</groupId>
      <artifactId>groovy-all</artifactId>
      <version>2.3.4</version>
    </dependency>
  </dependencies>
</plugin>

如果你有时间,让我知道这是否能解决你的问题。另外,如果我再次完全误解了您的问题,请告诉我:)

于 2014-06-30T15:05:45.390 回答