gpt4 book ai didi

java - 扩展默认 Maven 原型(prototype)环境变量

转载 作者:行者123 更新时间:2023-12-01 14:52:07 24 4
gpt4 key购买 nike

我的原型(prototype)资源文件中需要一个变量,它是生成新项目的目录的路径。 This StackOverflow post来自一个制作了自己的插件来执行此操作的人。

不幸的是,我不知道它最初是如何运行的。如果我运行这个命令:

mvn \
com.example.build.maven:property-setter-maven-plugin:0.1:set-properties \
archetype:generate \
-DarchetypeGroupId=... -DarchetypeArtifactId=... -DarchetypeVersion=... -DartifactId=...

从一个空目录中,我打算从原型(prototype)创建新项目,但出现此错误:

Goal requires a project to execute but there is no POM in this directory

这对我来说似乎完全错误。我正在尝试在此目录中创建一个新的 Maven 项目,那里不应该有 pom.xml 。于是,我查了一下the phases run by maven-archetype-plugin并决定在 <goal>archetype:generate</goal> 上运行此插件我从正在执行的 Maven 命令中删除了 set-properties。

现在,当我运行 archetype:generate 命令时,它会生成一个原型(prototype),但我需要的环境变量都不存在,就好像插件现在什么也没做。

有人知道我怎样才能让它工作吗?

最佳答案

首先是简单的答案:

真的需要自定义插件吗? ${basedir} 变量应该在原型(prototype)资源文件中工作,该资源文件对应于原型(prototype)运行的基本目录。

目标项目的根目录是${basedir}/${artifactId},所以如果我的模板pom.xml如下:

<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
<version>${version}</version>
<packaging>jar</packaging>

<name>A custom project at base ${basedir}/${artifactId}</name>

</project>

然后原型(prototype)生成的 pom.xml 将如下所示:

<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>galah</groupId>
<artifactId>galah-artifact</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>A custom project at base /home/prunge/java/testing/galah-artifact</name>

</project>

(假设我通过命令行/提示设置了groupId、artifactId、version)

<小时/>

但是现在假设您出于其他原因需要这些环境变量,而不仅仅是项目的基目录。

据我所知,property-setter-maven-plugin 获取当前执行属性并将它们放入环境变量中。并且您需要基本目录

要运行 property-setter-maven-plugin,需要对其进行修改,因为原始版本需要项目/POM 按照元数据中的定义运行。

原始 MOJO 定义:

/**
* @goal set-properties
* @phase validate
* @since 0.1
*/
public class PropertySetterMojo extends AbstractMojo
{
/**
* @parameter default-value="${project}"
* @parameter required
* @readonly
*/
private MavenProject project;

/**
* @parameter expression="${session}"
* @readonly
*/
private MavenSession session;

/**
* @parameter expression="${mojoExecution}"
* @readonly
* @required
*/
protected MojoExecution execution;

...

}

为了使该插件可以在没有项目存在的情况下运行,需要进行一些更改:

  • @requiresProject false,因为默认情况下这是 true。附加文档是here .
  • 有一个 MavenProject 类型的 project 字段,它被标记为 @parameter required - 需要将其删除,以便 MOJO无需项目即可执行。粗略地浏览一下原始帖子的源代码,该字段没有被使用,因此可以安全地删除。

所以你最终会得到类似的结果:

/**
* @goal set-properties
* @phase validate
* @since 0.1
* @requiresProject false
*/
public class PropertySetterMojo extends AbstractMojo
{
/**
* @parameter expression="${session}"
* @readonly
*/
private MavenSession session;

/**
* @parameter expression="${mojoExecution}"
* @readonly
* @required
*/
protected MojoExecution execution;

...

}

然后您可以像以前一样运行命令行:

mvn \
com.example.build.maven:property-setter-maven-plugin:0.1:set-properties \
archetype:generate \
-DarchetypeGroupId=... -DarchetypeArtifactId=... -DarchetypeVersion=... -DartifactId=...

并且 property-setter-maven-plugin 现在应该能够执行。

关于java - 扩展默认 Maven 原型(prototype)环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14742427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com