2013-03-01 10 views
13

Ho un progetto Maven multimodulo e uno dei moduli è per la distribuzione.C'è un buon modo di usare Maven per eseguire un jar eseguibile?

Project \ 
| moduleA \ 
| moduleB \ 
| ... 
| dist-module \ 

La distribuzione contiene un jar eseguibile che mi piacerebbe eseguire facilmente. Tuttavia, per eseguirlo devo digitare qualcosa di simile:

java -jar dist-module/target/dist-module-1.0-SNAPSHOT-full-dist/myJar.jar 

Sarebbe del tutto preferibile digitare semplicemente:

mvn exec:java \ OR 
mvn exec:exec 

Purtroppo, non riesco a trovare un modo per ottenere l'obiettivo di Java eseguire un .jar. L'obiettivo exec lo farà, ma c'è un problema: il jar contiene un server jetty incorporato e, a causa del modo in cui funziona exec (non usa la stessa JVM di maven) il server non termina a meno che non uccido il processo manualmente, che è allo stesso modo fastidioso.

Qualche raccomandazione su come utilizzare Maven?

Edit:
Per chiarimenti, questo comando sarà principalmente utilizzato per il semplice fumo-test manuale; leggere l'output del registro e assicurarsi che il programma sia avviato correttamente nel suo ambiente di distribuzione. Come tale, dovrebbe probabilmente essere una chiamata di blocco con ctrl-c che interrompe sia il server che il server.

Il server incorporato è specializzato per eseguire alcune applicazioni specifiche e non le ricarica automaticamente. Quindi, non c'è una grande necessità di mantenere il server in esecuzione indipendentemente da Maven per lunghi periodi di tempo.

+0

Qual è il compito del pontile? – Nachtgold

+0

Puoi collegare il pom con l'exec problematico: definizione dell'obiettivo java? –

+0

Non c'è un buon modo, perché maven è uno strumento di compilazione e distribuzione. Se il tuo jar fa parte di un processo di compilazione, allora scrivi un plugin di prova per esso. Se vuoi semplicemente usare Maven per eseguire la tua app, forse è meglio pensare a qualcos'altro. – kan

risposta

25

mvn exec: java gestisce l'applicazione direttamente dal output del compilatore di sotto del target/- non c'è bisogno di correre dal vaso:

<plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>exec-maven-plugin</artifactId> 
     <version>1.2.1</version> 
     <executions> 
      <execution> 
       <id>default-cli</id> 
       <goals> 
        <goal>java</goal> 
       </goals> 
       <configuration> 
        <mainClass>uk.co.pookey.hibernate.App</mainClass> 
        <systemProperties> 
         <systemProperty> 
          <key>derby.stream.error.file</key> 
          <value>${basedir}/target/derby.log</value> 
         </systemProperty> 
        </systemProperties> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin>    

Se si desidera eseguire il vaso con exec mvn: exec:

<plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>exec-maven-plugin</artifactId> 
     <version>1.2.1</version> 
     <executions> 
      <execution> 
       <id>default-cli</id> 
       <goals> 
        <goal>exec</goal> 
       </goals> 
       <configuration> 
        <executable>java</executable> 
        <!-- optional --> 
        <workingDirectory>/tmp</workingDirectory> 
        <arguments> 
         <argument>-jar</argument> 
         <argument>${basedir}/target/hibernate-derby-memory-${project.version}.jar</argument> 
        </arguments> 
       </configuration>       
      </execution> 
     </executions> 
    </plugin>   

Se avete problemi con pontile di terminazione, vi consiglio l'esecuzione di un test di integrazione (o semplicemente non uscire dal thread principale pontile senza terminare molo prima, o semplicemente usare fermata del pontile porta)! È possibile eseguire una JVM in background e lasciare che Maven la interrompa di nuovo dopo il test. Ci sono tre fasi per questo: pre-integrazione test, integrazione test o post-integrazione test. Puoi leggere ulteriori informazioni al riguardo a http://docs.codehaus.org/display/MAVENUSER/Maven+and+Integration+Testing. Quando si utilizza plug-pontile Maven, il config pom.xml potrebbe piacere:

<plugin> 
     <groupId>org.mortbay.jetty</groupId> 
     <artifactId>jetty-maven-plugin</artifactId> 
     <!-- test start/stop: --> 
     <executions>     
      <execution> 
       <id>start-jetty</id> 
       <phase>pre-integration-test</phase> 
       <goals> 
        <goal>deploy-war</goal> 
       </goals> 
       <configuration> 
        <daemon>true</daemon> 
        <systemProperties> 
         <systemProperty> 
          <name>some.prop</name> 
          <value>false</value> 
         </systemProperty> 
        </systemProperties> 
       </configuration> 
      </execution> 
      <execution> 
       <id>stop-jetty</id> 
       <phase>post-integration-test</phase> 
       <goals> 
        <goal>stop</goal> 
       </goals> 
      </execution> 
     </executions>  
    </plugin> 

Invece di legare il plugin Maven pontile a queste fasi, si potrebbe legare il plugin antrun Maven per eseguire comandi arbitrari.

+0

ho bisogno di correre il vaso perché contiene la logica che identifica il suo percorso e specifica altre risorse nella stessa directory. Quindi, è in realtà il progetto di distribuzione che deve eseguire il codice. Tuttavia, usare Maven per i test di integrazione è una possibilità interessante che vale la pena esplorare, quindi almeno +1 per questo. – Shaun

+0

Sembra che tu stia reinventando la ruota. Se hai bisogno di una corretta distribuzione, pensa di usare i file war e possibilmente il wrapper tanukisoft per eseguirli in produzione - se non vuoi utilizzare interi server di applicazioni come Tomcat e Jetty è sufficiente per te. Il wrapper tanukisoft avvia un server di applicazioni di jetty e esegue le tue webapp da un archivio di distribuzione scompattato. Se hai bisogno di un esempio, guarda il codice sorgente di Archiva. Se hai bisogno di aiuto, l'ho già fatto prima ... E quando usi i file di guerra, potresti usare l'esempio di integrazione jetty che ho menzionato. – user1050755

+0

Se hai una versione ridotta del tuo progetto server, potrei fare un tentativo. Non dovrebbe essere troppo complicato. Ma non sono mai riuscito a creare webapps molo di programmazione :-) – user1050755

3

userei l'esperto di formica o gmaven (quindi utilizzare Groovy costruttore formica) se si desidera eseguire roba

Dopo le modifiche che suona come la vostra utilizzando qualcosa come DropWizard. Potresti voler vedere come sono solving that problem.

Modifica sulla base di commenti:

La primavera Boot Maven creerà guerre eseguibili così come eseguirli e non avete bisogno di Primavera Boot né Primavera. Maggiori dettagli nella mia risposta qui: Can spring-boot-maven-plugin be used for non spring project?

+0

Mentre sento che la risposta di user1050755 affronta direttamente la domanda, hai il mio ringraziamento per aver portato DropWizard alla mia attenzione. Non soddisfa le esigenze del mio progetto, ma è abbastanza simile per essere un caso di studio interessante. – Shaun

+0

Entrambi i collegamenti in questa risposta sono morti al momento della stesura. – Stephan

+0

@Stephan In realtà l'opzione migliore che ora raccomando è il plug-in Maven Spring Boot che per inciso non ha bisogno di Spring Boot o Spring. Vedere la mia risposta qui: https://stackoverflow.com/questions/42696495/can-spring-boot-maven-plugin-be-used-for-non-spring-project/43017960#43017960 –

Problemi correlati