Получение 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>
Если у вас есть время, позвольте мне знать, решит ли это вашу проблему. Кроме того, если я снова неправильно понял ваш вопрос, дайте мне знать:)