我的原型资源文件中需要一个变量,它是生成新项目的目录的路径。 This StackOverflow post来自一个制作自己的插件的人。
不幸的是,我无法弄清楚它最初是如何运行的。如果我运行此命令:
mvn \
com.example.build.maven:property-setter-maven-plugin:0.1:set-properties \
archetype:generate \
-DarchetypeGroupId=... -DarchetypeArtifactId=... -DarchetypeVersion=... -DartifactId=...
从我打算从原型创建新项目的空目录中我得到此错误:
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命令时,它会生成一个原型,但是我不需要存在任何环境变量,就好像插件现在什么都不做。
有人知道如何让它发挥作用吗?
答案 0 :(得分:1)
首先简单回答:
真的需要自定义插件吗? ${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
,因为默认情况下这是真的。其他文档为here。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应该能够立即执行。