Использование Maven 'exec: exec' с аргументами

У меня есть проект, сконфигурированный для сборки и запуска с Maven. Проект зависит от конкретных конкретных библиотек на платформе, и я использую найденную стратегию здесь для управления этими зависимостями.

По существу, файлы .dll или .so для конкретной платформы упаковываются в банку и помещаются на сервер Maven с классификатором, идентифицирующим целевую платформу. Плагин maven-dependency затем распаковывает конкретную платформу платформы и копирует собственные библиотеки в целевую папку.

Обычно я использовал mvn exec:java для запуска Java-программы, но exec:java запускает приложения в одной JVM как Maven, что мешает мне изменять путь к классам. Поскольку родственные зависимости должны быть добавлены в путь к классам, я вынужден вместо этого использовать 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>
...

Это отлично подходит для конфигурации приложения по умолчанию, но я хочу указать некоторые необязательные параметры в командной строке. В идеале я бы хотел сделать что-то вроде этого:

mvn exec:exec -Dexec.args="-a <an argument> -b <another argument>"

К сожалению, указание переменной exec.args перезаписывает аргументы, которые у меня есть в pom (которые необходимы для настройки пути к классам и запуска приложения). Есть ли способ обойти это? Какой лучший способ указать некоторые необязательные аргументы в командной строке без перезаписи того, что у меня есть в pom?

Ответ 1

Мне удалось найти достаточно элегантное решение моей проблемы с использованием переменных среды 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>
...

Теперь я могу работать с параметрами по умолчанию точно так же, как и раньше:

mvn exec:exec

И я могу легко переопределить значения по умолчанию для каждого аргумента в командной строке, используя:

mvn exec:exec -DargumentA=alternateA -DargumentB=alternateB