如何通过CLI将参数传递给Maven插件?

Aam*_*han 4 java maven jaxws-maven-plugin

<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>
Run Code Online (Sandbox Code Playgroud)

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

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

mvn jaxws:wsimport
Run Code Online (Sandbox Code Playgroud)

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

Tun*_*aki 5

警告 /!\

您正在尝试在源文件夹下生成源src/main/java。除非有非常充分的理由,否则不要这样做。所有生成的内容应始终放置在构建目录下(target默认情况下),而不应受版本控制。build-helper-maven-plugin:add-source如果插件本身还没有做,您总是可以使用来将生成的源添加为源文件夹。


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

您也可以在源代码中找到它:

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

@Parameter用来声明Maven插件参数的注释没有对应的property

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

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

    <properties>
      <jaxws.sourceDestDir>${project.basedir}/src/main/java</jaxws.sourceDestDir>
    </properties>
    
    Run Code Online (Sandbox Code Playgroud)

    最好使用${project.build.directory}/some/path代替src/main/java

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

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

  • @AamirKhan这就是使用`&lt;execution&gt;`进行插件执行的地方。在命令行上调用时,您将启动一个新的自定义执行,因此将不会使用`&lt;execution&gt; &lt;configuration&gt;`下的任何配置。但是,将使用在全局`&lt;configuration&gt;`中添加的配置(不在任何&lt;execution&gt;`下)。请注意,在命令行上,您还可以使用`@`语法http://stackoverflow.com/questions/3166538/how-to-execute-执行特定的现有执行(而不是默认创建新的执行)。 Maven插件直接从命令行执行。 (2认同)