2013-02-21 8 views
11

Ich habe ein Projekt konfiguriert, um mit Maven zu bauen und zu laufen. Das Projekt hängt von plattformspezifischen nativen Bibliotheken ab, und ich verwende die Strategie here, um diese Abhängigkeiten zu verwalten.Verwenden von Maven 'exec: exec' mit Argumenten

Im Wesentlichen sind die .dll oder .so Dateien für eine bestimmte Plattform in ein Jar verpackt und an den Maven-Server mit einem Klassifikator geschoben, der die Zielplattform identifiziert. Das maven-dependency-plugin entpackt dann das plattformspezifische jar und kopiert die nativen Bibliotheken in den Zielordner.

Normalerweise würde ich verwenden, um ein Java-Programm auszuführen, aber exec:java läuft Anwendungen in der gleichen JVM wie Maven, die mich daran hindert, den Klassenpfad zu ändern. Da die nativen Abhängigkeiten dem Klassenpfad hinzugefügt werden müssen, muss ich stattdessen mvn exec:exec verwenden. Dies ist der entsprechende Ausschnitt aus der 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> 
... 

Dies funktioniert für die Standardkonfiguration der Anwendung gut, aber ich möchte in der Lage, einige optionale Parameter in der Befehlszeile angeben. Im Idealfall würde Ich mag so etwas tun:

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

Leider überschreibt die exec.args Variable unter Angabe der Argumente, die ich in der pom haben (die erforderlich sind, um die Classpath einzurichten und die Anwendung ausführen). Gibt es einen Weg dahin? Was ist der beste Weg, um einige optionale Argumente in der Befehlszeile anzugeben, ohne zu überschreiben, was ich in der Pom habe?

Antwort

34

Es ist mir gelungen, mit Maven-Umgebungsvariablen eine einigermaßen elegante Lösung für mein Problem zu finden.

Die Standardwerte werden als Objekte im pom definiert und als Argumente für die exec-Plugin hinzugefügt:

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

Jetzt kann ich genau mit Standardparametern ausgeführt werden, wie ich zuvor:

mvn exec:exec 

Und ich kann leicht die Standardeinstellungen für jedes Argument an der Befehlszeile überschreiben mit:

+2

Und wie th Auf diese Argumente kann im Java-Code zugegriffen werden, ich meine diese Zeile: 'String [] args'? – zygimantus

+2

@zygimantus Sie wollen 'mvn exec: java -Dexec.mainClass =" path.to.your.class "-Dexecs.args =" arg1 arg2 "' was außerhalb des Umfangs der ursprünglichen Frage ist. – dr0i