2013-02-07 80 views
0

我需要在我的原型資源文件的變量是到正在生成的新項目目錄的路徑。 This StackOverflow post來自一位自己做插件的人。擴展默認Maven原型環境變量

不幸的是,我無法弄清楚它是如何原本打算運行。如果我運行此命令:從空目錄

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。

現在,當我運行的原型:生成的命令,它生成一個原型,但沒有我需要的存在,環境變量,它彷彿插件現在正在做絕對沒有。

有沒有人知道我能如何讓這個工作?

回答

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的,通過命令行版本/提示)


但現在讓我們假設您需要這些環境變量出於其他原因,而不僅僅是項目的基礎目錄。

從我所知道的,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的插件應該能夠現在執行。

+0

當我運行archetype:generate命令(但$ {package}正在解析同一文件)時,$ {basedir}沒有被正確替換。是否可能$ {basedir}僅在maven原型插件的特定版本中可用? – Ring

+0

我正在運行2.2(截至目前,最新版本)的org.apache.maven.archetype擴展插件。 – Ring

+0

我正在使用最新的原型插件運行Maven 3.0.4,並且'$ {basedir}'正被替換爲此版本。 – prunge