首先是简单的答案:
真的需要自定义插件吗?该${basedir}
变量应该在与运行原型的基本目录相对应的原型资源文件中工作。
目标项目的根是${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>
然后原型生成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
因为默认情况下这是真的。附加文档在这里。
- 有一个
project
类型的字段,MavenProject
它被标记为@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 现在应该可以执行了。