2013-03-01 2 views
13

나는 멀티 모듈 프로젝트를 가지고 있으며, 그 중 하나는 배포 용이다.Maven을 사용하여 실행 가능한 jar를 실행하는 좋은 방법이 있습니까?

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

배포판에는 실행하기 쉬운 jar 파일이 포함되어 있습니다. 나는에 자바 목표를 얻을 수있는 방법을 찾을 수없는, 불행하게도

mvn exec:java \ OR 
mvn exec:exec 

을 : 단순히 입력하는 것은 매우 바람직 할 것이다

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

: 그러나, 나는 뭔가를 입력 할 필요가 그것을 실행합니다 .jar를 실행하십시오. exec 목표는 실제로 그것을 수행 할 것이지만 캐치가 있습니다. jar에는 임베디드 jetty 서버가 포함되어 있으며 exec 작업 (maven과 동일한 JVM을 사용하지 않음)으로 인해 프로세스를 종료하지 않으면 서버가 종료되지 않습니다 수동으로, 이것은 비슷하게 번거롭다.

Maven을 사용하여 이것을 수행하는 방법에 대한 권장 사항은 무엇입니까?

편집 : 대한 명확한
,이 명령은 주로 간단한 수동 연기 테스트에 사용됩니다; 로그 출력을 읽고 프로그램이 배포 환경에서 올바르게 시작되었는지 확인하십시오. 따라서, 아마도 ctrl-c가 서버와 maven을 종료하는 블로킹 호출이어야합니다.

임베디드 서버는 몇 가지 특정 응용 프로그램을 실행하는 데 특화되어 있으며 자동으로 다시로드하지 않습니다. 따라서 서버를 장시간 동안 maven과 독립적으로 실행되도록 유지할 필요가 없습니다.

+0

부두의 임무는 무엇입니까? – Nachtgold

+0

문제가있는 exec로 pom을 첨부 할 수 있습니까? java goal definition? –

+0

maven은 빌드 및 배포 도구이기 때문에 좋은 방법은 없습니다. 당신의 항아리가 빌드 프로세스의 일부라면, 그것을위한 메이븐 플러그인을 작성하십시오. 앱을 실행하기 위해 maven을 사용하고 싶다면 다른 것을 생각하는 것이 더 나을 것입니다. – kan

답변

25

MVN 간부 : 자바는 목표 아래 컴파일러 출력 /에서 직접 응용 프로그램을 실행 - 항아리에서 실행할 필요가 없습니다 : 당신이 항아리를 실행하려면

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

간부 : MVN 간부 당신이 부두의 종료에 문제가있는 경우

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

, 나는 통합 테스트를 실행 (또는 최초의 부두를 종료하지 않고 부두 주 스레드를 종료하지 않거나 단지 부두의 정지를 사용하는 것이 좋습니다 것 포트)! 백그라운드에서 JVM을 실행하고 테스트 후에 maven에 다시 중지시킬 수 있습니다. 사전 통합 테스트, 통합 테스트 또는 통합 후 테스트의 세 단계가 있습니다. 자세한 내용은 http://docs.codehaus.org/display/MAVENUSER/Maven+and+Integration+Testing에서 확인할 수 있습니다. 부두 받는다는 플러그인을 사용하는 경우, pom.xml 파일의 설정은 원하는 수 :

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

이 단계에 부두 받는다는 플러그인을 결합, 당신은 임의의 명령을 실행할 수있는 받는다는 antrun 플러그인을 결합 할 수 대신에.

+0

항아리를 실행할 필요가 있습니다. 경로를 식별하고 동일한 디렉토리의 다른 자원을 지정하는 논리를 포함합니다. 따라서 실제로는 코드를 실행해야하는 배포 프로젝트입니다. 그러나 통합 테스트를 위해 maven을 사용하는 것은 흥미로운 가능성이 있으므로 탐구 할 가치가 있습니다. – Shaun

+0

휠을 다시 발명 한 것처럼 보입니다. 적절한 배포가 필요한 경우 war 파일 및 tanukisoft 래퍼를 사용하여 프로덕션 환경에서 실행하십시오. tomcat과 jetty와 같은 전체 응용 프로그램 서버를 사용하지 않으려는 경우 충분합니다. tanukisoft 래퍼는 jetty app 서버를 시작하고 압축을 푼 배포 아카이브에서 웹 응용 프로그램을 실행합니다. 예제가 필요하면 Archiva의 소스 코드를 살펴보십시오. 도움이 필요하면 이전에 해 봤는데 ... 전쟁 파일을 사용할 때 언급 한 부두 통합 예제를 사용할 수 있습니다. – user1050755

+0

서버 프로젝트에서 버려진 버전을 사용했다면 시도해 볼 수 있습니다. 너무 복잡해서는 안됩니다. 하지만 부두 웹 응용 프로그램을 프로그래밍 방식으로 설정할 수는 없었습니다 :-) – user1050755

3

내가 사용하는 것이 받는다는 개미 또는 gmaven 당신이 물건에게 그것은 당신이 DropWizard 같은 것을 사용하여 같은 소리 편집 한 후

을 실행하려는 경우 (다음 그루비 개미 빌더를 사용). 그들이 어떻게 solving that problem인지보고 싶을 것입니다. 의견에 따라

편집 :

봄 부팅 메이븐이 실행 전쟁을 만들뿐만 아니라 그들을 실행하고 봄 부팅도 봄을하지 않아도됩니다. 여기에 내 대답에 더 많은 세부 정보 : Can spring-boot-maven-plugin be used for non spring project?

+0

나는 user1050755의 대답이 더 직접적으로 문제를 해결한다고 생각하지만, DropWizard에 관심을 가져 주셔서 감사합니다. 그것은 내 프로젝트의 요구에 맞지 않지만 흥미로운 사례 연구가되기에 충분할만큼 유사합니다. – Shaun

+0

이 답변의 두 링크는이 글을 쓰고있는 현재로는 죽었습니다. – Stephan

+0

@Stephan 실제로 제가 권장하는 가장 좋은 옵션은 우연히 Spring Boot 나 Spring을 필요로하지 않는 Spring Boot maven 플러그인입니다. 내 대답을 참조하십시오 : https://stackoverflow.com/questions/42696495/can-spring-boot-maven-plugin-be-used-for-non-spring-project/43017960#43017960 –