1

我有一个运行良好的 v2.2 maven 原型,完成后,我想对它放在文件系统上的项目执行一些后处理。我通过使用 -Dgoals 命令行选项来完成此操作,如下所示:

mvn archetype:generate \
   -DarchetypeGroupId=net.jpmchase.cma.cmadev \
   -DarchetypeArtifactId=buildtools-archetype-resources \
   -DarchetypeVersion=1.0-SNAPSHOT \
   -DarchetypeCatalog=local \
   -DgroupId=net.jpmchase.cma.cmadev \
   -DartifactId=bt-converter-test \
   -Dpackage=net.jpmchase.cma.cmadev \
   -Dgoals=net.jpmchase.cma.cmadev:buildtools-converter-plugin:1.0-SNAPSHOT:touch \
   -DbtBasedir=/ccs_home/projects/CCSSC/SC_Inventory

buildtools-archetype-resources 原型运行良好。Maven 确实按预期调用了触摸插件后处理目标。但是,maven 没有将 -DbtBasedir 系统属性(与此无关的系统属性)传递给它调用的分叉 jvm 以运行该后处理目标。

这是原型生成阶段的输出:

[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: buildtools-archetype-resources:1.0-SNAPSHOT
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: net.jpmchase.cma.cmadev
[INFO] Parameter: artifactId, Value: bt-converter-test
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: net.jpmchase.cma.cmadev
[INFO] Parameter: packageInPathFormat, Value: net/jpmchase/cma/cmadev
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: net.jpmchase.cma.cmadev
[INFO] Parameter: groupId, Value: net.jpmchase.cma.cmadev
[INFO] Parameter: btBasedir, Value: /ccs_home/projects/CCSSC/SC_Inventory
[INFO] Parameter: artifactId, Value: bt-converter-test
[INFO] project created from Archetype in dir: C:\ds\workspaces\bt-converter-test

正如您在原型生成阶段所看到的,Maven 将所有系统属性设置为属性,包括 btBasedir 系统属性。

我正在使用 Maven 3.1.1。我调试了 maven-archetype-plugin v2.2 源代码,可以看到 maven 原型命令行系统属性没有被转移到运行后处理目标的分叉 maven jvm。

这是用于调用后处理目标的命令行值:

cmd.exe /X /C "C:\ds\ds_env\tools\apache-maven-3.1.1\bin\mvn.bat -B net.jpmchase.cma.cmadev:buildtools-converter-plugin:1.0-SNAPSHOT:touch"

这是直接从我的调试器中取出的,断点位于 org.apache.maven.shared.invoker.DefaultInvoker.java 的第 102 行:

(line 102 --->) int exitCode = executeCommandLine( cli, request );

在我的触摸 Mojo 中,我有这个私有成员变量来接受 btBasedir 属性:

/**
 * The Buildtools btBasedir.
 */
@Parameter
private String btBasedir;

execute()方法开始时,我转储 btBasedir 属性的值:

public void execute() throws MojoExecutionException {
    getLog().info("Starting Buildtools to Maven project migration......");
    try {
        getLog().info("New Maven project base directory [" + project.getBasedir() + "]");
        getLog().info("Source Buildtools project base directory [" + btBasedir + "]");
    .
    .
    .

控制台输出如下所示:

[INFO] Invoking post-archetype-generation goals: net.jpmchase.cma.cmadev:buildtools-converter-plugin:1.0-SNAPSHOT:touch
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building bt-converter-test 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- buildtools-converter-plugin:1.0-SNAPSHOT:touch (default-cli) @ bt-converter-test ---
[INFO] Starting Buildtools to Maven project migration......
[INFO] New Maven project base directory [C:\ds\workspaces\bt-converter-test]
[INFO] Source Buildtools project base directory [null]

如您所见,btBasedir 没有从 mvn archetype:generate 命令行中获取。

Source Buildtools project base directory [null]

关于这是否可能的任何想法,或者我是否错过了一些允许系统属性转移发生的事情?

4

1 回答 1

0

我相信导致问题的原因如下:

-Dgoals=net.jpmchase.cma.cmadev:buildtools-converter-plugin:1.0-SNAPSHOT:touch \
-DbtBasedir=/ccs_home/projects/CCSSC/SC_Inventory

发生的事情是“-DbtBasedir”被传递到 Maven 原型插件中,而不是作为较长的 -Dgoals“...” 字符串的一部分。

更改您的命令如下:

-Dgoals='net.jpmchase.cma.cmadev:buildtools-converter-plugin:1.0-SNAPSHOT:touch -DbtBasedir=/ccs_home/projects/CCSSC/SC_Inventory'

希望有帮助。

于 2014-01-29T14:34:26.267 回答