2013-03-01 30 views
13

Tôi có một dự án maven đa mô-đun và một trong các mô-đun là để phân phối.Có cách nào tốt để sử dụng maven để chạy một bình thực thi?

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

Phân phối chứa một jar thực thi mà tôi muốn thực hiện dễ dàng. Tuy nhiên, để thực hiện nó, tôi phải gõ một cái gì đó như:

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

Nó sẽ là khá thích hợp hơn để chỉ cần gõ:

mvn exec:java \ OR 
mvn exec:exec 

Thật không may, tôi không thể tìm thấy một cách để có được mục tiêu java để thực hiện một .jar. Mục tiêu exec sẽ thực sự làm điều đó, nhưng có một catch: jar chứa một máy chủ jetty được nhúng, và do cách exec hoạt động (không sử dụng cùng một JVM như maven), máy chủ không chấm dứt trừ khi tôi giết quá trình theo cách thủ công, điều tương tự khó chịu.

Bất kỳ đề xuất nào về cách thực hiện việc này bằng cách sử dụng maven?

Chỉnh sửa:
Để làm rõ, lệnh này chủ yếu sẽ được sử dụng để thử nghiệm khói thủ công đơn giản; để đọc đầu ra nhật ký và đảm bảo chương trình khởi động đúng cách trong môi trường phân phối của nó. Như vậy, nó có thể là một cuộc gọi chặn với ctrl-c chấm dứt cả máy chủ và maven.

Máy chủ nhúng chuyên chạy một số ứng dụng cụ thể và không tự động tải lại chúng. Vì vậy, không có nhu cầu lớn để giữ cho máy chủ hoạt động độc lập với maven trong một thời gian dài.

+0

Nhiệm vụ của cầu tàu là gì? – Nachtgold

+0

Bạn có thể đính kèm pom với exec có vấn đề: java định nghĩa mục tiêu? –

+0

Không có cách nào tốt, bởi vì maven là một công cụ xây dựng và triển khai. Nếu bình của bạn là một phần của quá trình xây dựng, hãy viết một plugin maven cho nó. Nếu bạn chỉ muốn sử dụng maven để chạy ứng dụng của bạn, có lẽ tốt hơn là nghĩ về một thứ khác. – kan

Trả lời

25

mvn exec: java chạy ứng dụng trực tiếp từ đầu ra trình biên dịch dưới mức mục tiêu/- không cần phải chạy từ jar:

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

Nếu bạn muốn chạy jar với 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>   

Nếu bạn có vấn đề với cầu cảng chấm dứt, tôi khuyên bạn nên chạy một thử nghiệm hội nhập (hoặc chỉ cần không thoát khỏi chủ đề chính cầu cảng mà không chấm dứt cầu cảng đầu tiên, hoặc chỉ sử dụng cầu cảng dừng của Hải cảng)! Có thể chạy JVM ở chế độ nền và để maven dừng lại sau khi thử nghiệm. Có ba giai đoạn cho điều này: thử nghiệm tích hợp trước, kiểm tra tích hợp hoặc kiểm tra tích hợp sau. Bạn có thể đọc thêm về điều này tại http://docs.codehaus.org/display/MAVENUSER/Maven+and+Integration+Testing. Khi sử dụng plugin cầu cảng maven, cấu hình pom.xml có thể thích:

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

Thay vì ràng buộc các plugin cầu cảng maven để những giai đoạn, bạn có thể liên kết các plugin antrun maven để thực hiện các lệnh tùy ý.

+0

Tôi cần chạy bình vì nó chứa logic xác định đường dẫn của nó và chỉ định các tài nguyên khác trong cùng một thư mục. Do đó, nó thực sự là dự án phân phối cần thực thi mã. Tuy nhiên, bằng cách sử dụng maven để thử nghiệm tích hợp là một khả năng thú vị đáng để khám phá, vì vậy hãy +1 cho điều đó ít nhất. – Shaun

+0

Có vẻ như bạn đang tái phát minh ra bánh xe. Nếu bạn cần phân phối thích hợp, hãy nghĩ đến việc sử dụng các tệp chiến tranh và có thể là trình bao bọc tanukisoft để chạy chúng trong sản xuất - nếu bạn không muốn sử dụng toàn bộ các máy chủ ứng dụng như tomcat và cầu tàu là đủ cho bạn. Trình bao bọc tanukisoft bắt đầu một máy chủ ứng dụng cầu nối và chạy các ứng dụng web của bạn từ một kho lưu trữ phân phối chưa được giải nén. Nếu bạn cần một ví dụ, hãy nhìn vào mã nguồn của Archiva. Nếu bạn cần giúp đỡ, tôi đã làm điều đó trước đây ... Và khi sử dụng các tập tin chiến tranh, bạn có thể sử dụng ví dụ về tích hợp jetty mà tôi đã đề cập. – user1050755

+0

Nếu bạn có một phiên bản rút gọn của dự án máy chủ của bạn, tôi có thể dùng thử. Không nên quá phức tạp. Nhưng tôi không bao giờ quản lý để thiết lập webapps jetty lập trình :-) – user1050755

3

tôi sẽ sử dụng maven kiến ​​hoặc gmaven (sau đó sử dụng xây dựng kiến ​​groovy) nếu bạn muốn thực thi công cụ

Sau khi chỉnh sửa của bạn có vẻ như sử dụng của bạn một cái gì đó giống như DropWizard. Bạn có thể muốn xem chúng như thế nào là solving that problem.

Chỉnh sửa dựa trên nhận xét:

Các mùa xuân Boot Maven sẽ tạo ra cuộc chiến tranh thực thi cũng như thực hiện chúng và bạn không cần phải mùa xuân Boot cũng không mùa xuân. Xem thêm chi tiết trong câu trả lời của tôi ở đây: Can spring-boot-maven-plugin be used for non spring project?

+0

Trong khi tôi cảm thấy câu trả lời của user1050755 trực tiếp giải quyết các câu hỏi, bạn có cảm ơn của tôi đã mang DropWizard đến sự chú ý của tôi. Nó không hoàn toàn phù hợp với nhu cầu của dự án của tôi, nhưng nó tương tự đủ để trở thành một nghiên cứu trường hợp thú vị. – Shaun

+0

Cả hai liên kết trong câu trả lời này đều đã chết khi viết bài này. – Stephan

+0

@Stephan Trên thực tế, tùy chọn tốt nhất mà tôi đề xuất là plugin maven Spring Boot mà tình cờ không cần Spring Boot hoặc thậm chí là Spring. Xem câu trả lời của tôi ở đây: https://stackoverflow.com/questions/42696495/can-spring-boot-maven-plugin-be-used-for-non-spring-project/43017960#43017960 –

Các vấn đề liên quan