ti-enxame.com

Usando o Maven 'exec: exec' com argumentos

Eu tenho um projeto configurado para criar e executar com o Maven. O projeto depende das bibliotecas nativas específicas da plataforma e estou usando a estratégia encontrada aqui para gerenciar essas dependências.

Essencialmente, o .dll ou .so arquivos para uma plataforma específica são empacotados em um jar e enviados ao servidor Maven com um classificador que identifica a plataforma de destino. O maven-dependency-plugin descompacta o jar específico da plataforma e copia as bibliotecas nativas para a pasta de destino.

Normalmente eu usaria mvn exec:Java para executar um Java, mas exec:Java executa aplicativos na mesma JVM que o Maven, o que me impede de modificar o caminho de classe. Como as dependências nativas devem ser adicionadas ao caminho de classe, sou forçado a usar mvn exec:exec em vez de. Este é o trecho relevante do 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>
...

Isso funciona bem para a configuração padrão do aplicativo, mas quero poder especificar alguns parâmetros opcionais na linha de comando. Idealmente, eu gostaria de fazer algo assim:

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

Infelizmente, especificando o exec.args variável sobrescreve os argumentos que tenho no pom (que são necessários para configurar o caminho de classe e executar o aplicativo). Existe uma maneira de contornar isso? Qual é a melhor maneira de especificar alguns argumentos opcionais na linha de comando sem substituir o que tenho no pom?

15
theisenp

Consegui encontrar uma solução razoavelmente elegante para o meu problema usando variáveis ​​de ambiente Maven.

Os valores padrão são definidos como propriedades no pom e adicionados ao plug-in exec como argumentos:

...
<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>
...

Agora posso executar os parâmetros padrão exatamente como antes:

mvn exec:exec

E posso substituir facilmente os padrões de cada argumento na linha de comando usando:

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