Получение MavenProjectHelper в скрипте GMaven без session.lookup

Я нашел этот пример о том, как прикрепить сторонний артефакт Maven с помощью скрипта Groovy. Я видел, что 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 для инъекции в мой скриптлет? Является ли это возможным? Я не хочу создавать Mojo или Groovy Mojo, я хочу, чтобы они были встроены в POM.

ОБНОВЛЕНИЕ: В случае, если это не ясно: приведенный выше пример работает отлично, но использует устаревший API (MavenSession.lookup). Вопрос только в том, можно ли внедрить что-либо в скриптлет gmaven.

2 ответа

Ты можешь использовать 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)

В этом конкретном случае может быть проще использовать плагин Build Helper.

Но предполагая, что вы не хотите идти по этому пути по какой-либо причине, с GMaven вы должны ссылаться на все объекты через объект свойств (как показано здесь). Кроме того, 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>

Если у вас есть время, позвольте мне знать, решит ли это вашу проблему. Кроме того, если я снова неправильно понял ваш вопрос, дайте мне знать:)

Другие вопросы по тегам