首先是簡單的回答:
自定義插件真的需要嗎? ${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的,通過命令行版本/提示)
但現在讓我們假設您需要這些環境變量出於其他原因,而不僅僅是項目的基礎目錄。
從我所知道的,property-setter-maven-plugin
以當前執行屬性,並把它們在環境變量中。而你需要的基本目錄
獲取屬性的制定者 - Maven的插件運行,它需要修改,因爲原來需要一個項目/ 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=...
和物業制定者 - Maven的插件應該能夠現在執行。
當我運行archetype:generate命令(但$ {package}正在解析同一文件)時,$ {basedir}沒有被正確替換。是否可能$ {basedir}僅在maven原型插件的特定版本中可用? – Ring
我正在運行2.2(截至目前,最新版本)的org.apache.maven.archetype擴展插件。 – Ring
我正在使用最新的原型插件運行Maven 3.0.4,並且'$ {basedir}'正被替換爲此版本。 – prunge