2010-03-02 32 views
9

Chúng tôi đang sử dụng mục tiêu Maven exec:java để chạy một ứng dụng java tùy chỉnh cấu hình cơ sở dữ liệu để sử dụng với các bài kiểm tra tích hợp của chúng tôi. Chúng tôi muốn sử dụng exec:java trên exec:exec để có thể sử dụng phụ thuộc của dự án trong đường dẫn lớp của lớp chính sẽ được sử dụng. Một vài lần ứng dụng đã thất bại vì lý do hợp lệ, nhưng việc xây dựng Maven tiếp tục như thể không có gì sai.Làm thế nào tôi có thể thất bại Maven xây dựng nếu exec: java mục tiêu không thành công?

Có đối số kiểu "failonerror" nào có thể được sử dụng với exec:java không? Tôi sợ thêm system.exit() mã vào lớp đang chạy, vì tôi nghi ngờ nó sẽ giết chết không chỉ bản thân nó, mà còn chính Maven, do thực tế nó đang chạy trong máy ảo Maven.

+0

là có thể sử dụng exec: exec, trong trường hợp đó tôi đoán bạn có thể sử dụng mã trả lại? –

Trả lời

13

Tôi chỉ cần làm một thử nghiệm đơn giản với cấu hình Plugin sau tuyên bố trong một POM:

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>exec-maven-plugin</artifactId> 
     <version>1.1</version> 
     <executions> 
      <execution> 
      <id>my-exec-java</id> 
      <phase>pre-integration-test</phase> 
      <goals> 
       <goal>java</goal> 
      </goals> 
      </execution> 
     </executions> 
     <configuration> 
      <mainClass>com.example.Main</mainClass> 
     </configuration> 
     </plugin> 
     ... 
    </plugins> 
    ... 
    </build> 
</project> 

Và lớp Java sau:

package com.example; 

public class Main { 
    public static void main(String[] args) { 
     throw new RuntimeException("A problem occured"); 
    } 
} 

Và đây là những gì tôi nhận được khi triệu gọi integration-test giai đoạn:

 
$ mvn clean integration-test 
[INFO] Scanning for projects... 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building q2363055 
[INFO] task-segment: [clean, integration-test] 
[INFO] ------------------------------------------------------------------------ 

... 

[INFO] [jar:jar {execution: default-jar}] 
[INFO] Building jar: /home/pascal/Projects/stackoverflow/q2363055/target/q2363055-1.0-SNAPSHOT.jar 
[INFO] Preparing exec:java 
[WARNING] Removing: java from forked lifecycle, to prevent recursive invocation. 
[INFO] No goals needed for project - skipping 
[INFO] [exec:java {execution: my-exec-java}] 
[INFO] ------------------------------------------------------------------------ 
[ERROR] BUILD ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] An exception occured while executing the Java class. null 

A problem occured 
[INFO] ------------------------------------------------------------------------ 
[INFO] For more information, run Maven with the -e switch 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 19 seconds 
[INFO] Finished at: Tue Mar 02 23:40:32 CET 2010 
[INFO] Final Memory: 16M/79M 
[INFO] ------------------------------------------------------------------------ 

integration giai đoạn không bao giờ được thực hiện, vì lỗi xây dựng.

Vì vậy, câu hỏi đặt ra là, bạn xử lý các lỗi trong lớp Java tải db của bạn như thế nào? Là ném một ngoại lệ một lựa chọn?

+0

Cảm ơn Pascal. Tôi đã có cơ hội nhìn vào nguồn và thấy rất nhiều lỗi chưa được giải quyết. Tôi tin rằng giải pháp của bạn sẽ hoạt động nếu lớp được gọi là xử lý ngoại lệ tốt hơn. Cảm ơn câu trả lời toàn diện! –

+0

Cảm ơn! Tôi đã có cùng một vấn đề bắt đầu HSQLDB. Một ngoại lệ đã được ném và không được hiển thị. Tôi đã nhận được cùng một lỗi ở trên !. Tôi đã chuyển số không hợp lệ đến hsqldb .......... – Derek

4

Đây không phải là tính năng theo mặc định, nhưng bạn có thể muốn yêu cầu nó tại http://jira.codehaus.org/browse/MEXEC, vì nó sẽ là một bổ sung đơn giản.

Nếu bạn muốn exec:java không thực hiện được, cuộc gọi main sẽ cần phải ném ngoại lệ thay vì trả lại mã thoát khác.

Nếu đó không phải là một tùy chọn, bạn vẫn có thể sử dụng exec:exec - xem http://mojo.codehaus.org/exec-maven-plugin/examples/example-exec-for-java-programs.html để biết mô tả về cách thêm phụ thuộc dự án vào đường dẫn lớp.

Một tùy chọn khác nếu không phù hợp với một số lý do nào đó là sử dụng plugin AntRun với tác vụ <java .../>. Phụ thuộc dự án cũng có thể được chuyển vào đó.

+1

Cảm ơn Brett, cuối cùng tôi đã sử dụng plugin antrun cuối cùng. –

0

Ngoài việc ném một ngoại lệ, bạn cũng có thể sử dụng System.exit(n), trong đó n là khác 0 để làm cho việc xây dựng maven thất bại.

1

Đối với mục tiêu java System.exit (n) trong đó n là khác 0 sẽ không hoạt động. Cần phải ném ngoại lệ java.

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