【问题标题】:How to pass parameter to Maven plugin from CLI?如何从 CLI 将参数传递给 Maven 插件?
【发布时间】:2016-11-20 23:20:35
【问题描述】:
<build>
    <plugins>
        <plugin>
            <groupId>org.jvnet.jax-ws-commons</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <version>2.3</version>

            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>wsimport</goal>
                    </goals>
                    <id>generate-sei</id>

                    <configuration>
                        <sourceDestDir>${project.basedir}/src/main/java</sourceDestDir>
                    </configuration>
                </execution>
            </executions>
          <dependencies>...</dependencies>
        </plugin>
    </plugins>
</build>

上述 XML sn-p 来自 Java 项目中的 POM 文件。在这个 sn-p 中,我定义了 jaxws-maven-plugin 以使用 wsdl 文件生成 SEI 代码并将其放置在 src/main/java 目录中。此插件绑定到 generate-sources 阶段,并且工作正常。

我想这样做,如果我直接发布插件,使用:

mvn jaxws:wsimport

它应该将文件放在上述文件夹中。从插件参考站点 (https://jax-ws-commons.java.net/jaxws-maven-plugin/wsimport-mojo.html),我无法弄清楚如何将参数 (sourceDestDir) 作为命令行参数传递。有什么办法可以做到吗?

【问题讨论】:

  • 将代码生成到src/main 通常是个坏主意...因为它会更改提交给版本控制的代码...
  • 注意,谢谢。我现在已经改变了。

标签: java maven jaxws-maven-plugin


【解决方案1】:

警告 /!\

您正在尝试在源文件夹src/main/java 下生成源。除非有一个非常强烈的理由,don't do this。所有生成的内容应始终放在构建目录下(默认为target),并且不受版本控制。如果插件本身没有这样做,您始终可以使用 build-helper-maven-plugin:add-source 将生成的源添加为源文件夹。


为了能够直接在命令行上设置参数,插件需要定义一个用户属性。但是,org.jvnet.jax-ws-commons:jaxws-maven-plugin 没有为sourceDestDir 参数定义用户属性。这很明显,因为文档没有设置“用户属性”。

你也可以找到这个in the source code:

@Parameter(defaultValue = "${project.build.directory}/generated-sources/wsimport")
private File sourceDestDir;

@Parameter注解,用于声明Maven插件的参数,没有对应的property

因此,您需要具备以下条件:

  1. 定义一个值为${project.basedir}/src/main/java的Maven属性jaxws.sourceDestDir

    <properties>
      <jaxws.sourceDestDir>${project.basedir}/src/main/java</jaxws.sourceDestDir>
    </properties>
    

    最好使用${project.build.directory}/some/path 而不是src/main/java

  2. 配置插件以使用此 Maven 属性:

    <configuration>
      <sourceDestDir>${jaxws.sourceDestDir}</sourceDestDir>
    </configuration>
    
  3. 如果您想覆盖它,您现在可以直接在命令行上使用-Djaxws.sourceDestDir=/my/new/value 进行覆盖。此系统属性将优先于 Maven 属性的值。

【讨论】:

  • 嗨团基。感谢您提供非常全面的答案。澄清一下,添加到 POM 的任何配置(使用 标记)如果插件直接从 CLI 运行,则不会被插件使用,而不是在它绑定到的阶段在构建过程中运行?跨度>
  • @AamirKhan 这就是使用&lt;execution&gt; 执行插件的地方。在命令行上调用时,您将启动新的自定义执行,因此不会使用 &lt;execution&gt;&lt;configuration&gt; 下的任何配置。但是,将使用全局&lt;configuration&gt;(不在任何&lt;execution&gt; 下)中添加的配置。请注意,在命令行上,您还可以使用 @ 语法 stackoverflow.com/questions/3166538/… 执行特定的现有执行(而不是默认创建新执行)。
  • 正是我所需要的。谢谢@Tunaki!
猜你喜欢
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
相关资源
最近更新 更多