使用Maven'exec:exec'和Arguments

the*_*enp 15 maven exec-maven-plugin

我有一个项目配置为使用Maven构建和运行.该项目依赖于特定于平台的本机库,我使用此处的策略来管理这些依赖项.

本质上,特定平台的.dll.so文件被打包到jar中,并通过标识目标平台的分类器推送到Maven服务器.然后,maven-dependency-plugin解包特定于平台的jar,并将本机库复制到目标文件夹.

通常我会mvn exec:java用来运行Java程序,但是exec:java在与Maven相同的JVM中运行应用程序,这会阻止我修改类路径.由于必须将本机依赖项添加到类路径中,因此我不得不使用mvn exec:exec.这是pom的相关片段:

...
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.2.1</version>
    <configuration>
        <executable>java</executable>
        <arguments>
            <argument>-Djava.library.path=target/lib</argument>
            <argument>-classpath</argument>
            <classpath />
            <argument>com.example.app.MainClass</argument>
        </arguments>
    </configuration>
</plugin>
...
Run Code Online (Sandbox Code Playgroud)

这适用于应用程序的默认配置,但我希望能够在命令行中指定一些可选参数.理想情况下,我想做这样的事情:

mvn exec:exec -Dexec.args="-a <an argument> -b <another argument>"
Run Code Online (Sandbox Code Playgroud)

不幸的是,指定exec.args变量会覆盖我在pom中的参数(这些参数是设置类路径并运行应用程序所必需的).有没有解决的办法?在命令行中指定一些可选参数而不覆盖我在pom中的内容的最佳方法是什么?

the*_*enp 44

我设法使用Maven环境变量为我的问题找到了一个相当优雅的解决方案.

默认值在pom中定义为属性,并作为参数添加到exec插件中:

...
<properties>
    <argumentA>defaultA</argumentA>
    <argumentB>defaultB</argumentB>
</properties>
...
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.2.1</version>
    <configuration>
        <executable>java</executable>
        <arguments>
            <argument>-Djava.library.path=${project.build.directory}/lib</argument>
            <argument>-classpath</argument>
            <classpath />
            <argument>com.example.app.MainClass</argument>
            <argument>-a</argument>
            <argument>${argumentA}</argument>
            <argument>-b</argument>
            <argument>${argumentB}</argument>
        </arguments>
    </configuration>
</plugin>
...
Run Code Online (Sandbox Code Playgroud)

现在我可以像以前一样使用默认参数运行:

mvn exec:exec
Run Code Online (Sandbox Code Playgroud)

我可以使用以下命令轻松覆盖命令行中每个参数的默认值:

mvn exec:exec -DargumentA=alternateA -DargumentB=alternateB
Run Code Online (Sandbox Code Playgroud)

  • @zygimantus你想要`mvn exec:java -Dexec.mainClass ="path.to.your.class"-Dexec.args ="arg1 arg2"`这超出了原始问题的范围. (5认同)
  • 如何在Java代码中访问这些参数,我的意思是这一行:`String [] args`? (3认同)