2013-03-01 9 views
13

Mam projekt multimoduł maven, a jeden z modułów jest do dystrybucji.Czy istnieje dobry sposób na użycie programu maven do uruchomienia pliku wykonywalnego?

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

Dystrybucja zawiera plik wykonywalny, który chciałbym łatwo wykonać. Jednak, aby go wykonać muszę wpisać coś takiego:

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

Byłoby bardzo korzystne wystarczy wpisać:

mvn exec:java \ OR 
mvn exec:exec 

Niestety, nie mogę znaleźć sposobu na zdobycie gola java wykonaj .jar. Cel exec faktycznie to zrobi, ale jest pewien haczyk: słoik zawiera wbudowany serwer pomostowy, a ze względu na sposób działania exec (nie używa tej samej maszyny JVM co maven) serwer nie kończy się, dopóki nie zabiję procesu ręcznie, co jest podobnie uciążliwe.

Wszelkie zalecenia dotyczące tego, jak to zrobić przy użyciu programu maven?

Edit:
Dla wyjaśnienia, to polecenie będzie wykorzystywany głównie do prostego ręcznego dymu testowania; aby odczytać wyjście dziennika i upewnić się, że program został poprawnie uruchomiony w swoim środowisku dystrybucji. Jako takie, prawdopodobnie powinno to być połączenie blokujące z ctrl-c kończącym zarówno serwer jak i maven.

Wbudowany serwer specjalizuje się w uruchamianiu kilku konkretnych aplikacji i nie ładuje ich automatycznie. Tak więc, nie ma dużej potrzeby utrzymywania serwera działającego niezależnie od urządzenia przez długie okresy czasu.

+0

Jakie jest zadanie pomostu? – Nachtgold

+0

Czy możesz dołączyć pom z problematyczną exec: definicją celu java? –

+0

Nie ma dobrej drogi, ponieważ maven jest narzędziem do budowania i wdrażania. Jeśli twój słoik jest częścią procesu kompilacji, napisz do niego maven plugin. Jeśli chcesz po prostu użyć aplikacji maven do uruchomienia aplikacji, może lepiej pomyśleć o czymś innym. – kan

Odpowiedz

25

mvn exec: java uruchamia aplikację bezpośrednio z wyjścia kompilatora poniżej docelowego/- nie trzeba uruchamiać ze słoika:

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

Jeśli chcesz uruchomić słoika z mvn exec: 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>   

Jeśli masz problemy z molo kończącym, polecam uruchomiony test integracji (lub po prostu nie wyjść z głównego wątku molo bez zakończenia molo pierwszy, lub po prostu użyć przystanek na molo Port)! Możliwe jest uruchomienie maszyny JVM w tle i po zakończeniu testowania maven może ją zatrzymać. Są na to trzy fazy: test przed integracją, test integracji lub test po integracji. Więcej informacji na ten temat można znaleźć pod adresem http://docs.codehaus.org/display/MAVENUSER/Maven+and+Integration+Testing. Podczas korzystania z wtyczki pomost maven, config pom.xml mógłby lubię:

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

Zamiast wiązania plugin maven pomost do tych etapów, można powiązać maven antrun wtyczki do wykonywania dowolnych poleceń.

+0

Muszę uruchomić słoik, ponieważ zawiera logikę, która identyfikuje jej ścieżkę i określa inne zasoby w tym samym katalogu. W związku z tym jest to projekt dystrybucji, który musi wykonać kod. Jednak korzystanie z maven do testowania integracji jest interesującą możliwością, którą warto poznać, więc przynajmniej o +1. – Shaun

+0

Wygląda na to, że wymyślasz nowe koło. Jeśli potrzebujesz odpowiedniej dystrybucji, pomyśl o użyciu plików wojennych i ewentualnie opakowania tanukisoft do ich uruchomienia - jeśli nie chcesz używać całych serwerów aplikacji, takich jak tomcat i pomost, to wystarczy. Opakowanie tanukisoft uruchamia serwer aplikacji pomostowej i uruchamia twoje aplikacje internetowe z rozpakowanego archiwum dystrybucyjnego. Jeśli potrzebujesz przykładu, spójrz na kod źródłowy Archivy. Jeśli potrzebujesz pomocy, robiłem to wcześniej ... A kiedy używasz plików wojennych, możesz użyć przykładu integracji z pomostem, o którym wspomniałem. – user1050755

+0

Jeśli masz obnażoną wersję swojego projektu serwera, mógłbym spróbować. Nie powinno być zbyt skomplikowane. Ale nigdy nie udało mi się zaprogramować webmasterów przystani programowo :-) – user1050755

3

chciałbym użyć Maven mrówka lub gmaven (wtedy używać groovy ant builder) jeśli chcesz wykonać rzeczy

Po edycji brzmi jak używasz coś jak DropWizard. Możesz chcieć zobaczyć, jak oni są solving that problem.

Edycja oparty na komentarze:

The Spring Boot Maven utworzy wojen wykonywalnych, a także ich wykonania i nie trzeba ani Boot Wiosna Wiosna. Więcej szczegółów w moją odpowiedź tutaj: Can spring-boot-maven-plugin be used for non spring project?

+0

Podczas gdy czuję, że user1050755 odpowiada bardziej bezpośrednio na to pytanie, dziękuję za zwrócenie mojej uwagi na DropWizard. Nie odpowiada to moim potrzebom projektu, ale jest na tyle podobny, aby stanowić interesujące studium przypadku. – Shaun

+0

Oba łącza w tej odpowiedzi są martwe w chwili pisania tego tekstu. – Stephan

+0

@Stephan Właściwie najlepszą opcją, którą teraz polecam jest wtyczka Spring Boot maven, która nie potrzebuje Spring Boot, a nawet Spring. Zobacz moją odpowiedź tutaj: https://stackoverflow.com/questions/42696495/can-spring-boot-maven-plugin-be-used-for-non-spring-project/43017960#43017960 –

Powiązane problemy