2017-02-22 43 views
10

tôi có một dự án trong Eclipse đó, sau khi lắp ráp có cấu trúc gói trong các cách saugỡ lỗi một hội đồng maven từ bên trong Eclipse

launcher.tar.gz 
|-- launcher.jar 
|-- lib/ 
|-- resources/ 
|-- plugins/ 

nào được thực hiện bằng cách sử dụng maven-assembly-plugin.

Để ứng dụng khởi động đúng, một số yêu cầu resources, nhưng không có sẵn ngoài hội đồng cuối cùng, ngoài ra, tôi muốn có khả năng cài đặt plugin như hiện tại.

công việc hiện tại của tôi là

$ mvn [clean] package 
$ cd target/launcher/ 
$ java -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -jar launcher.jar 

Một khi ứng dụng đã đưa ra trong tình trạng lơ lửng, tôi có thể đính kèm các trình gỡ lỗi và tiếp tục công việc bình thường của tôi.

Làm cách nào để hợp lý hóa quy trình này từ Eclipse?

I có thể khởi chạy điều này từ lớp Launcher.java của mình, nhưng khi gỡ lỗi trong Eclipse, tôi không có khả năng cài đặt plugin thông qua phương pháp này.

+0

bạn đang xem xét việc thực hiện điều gì đó tương tự (hoặc chính xác) là gỡ lỗi từ xa ứng dụng của bạn? http://javarevisited.blogspot.ca/2011/02/how-to-setup-remote-debugging-in.html – ochi

+0

Gỡ lỗi từ xa là cách tôi hiện đang thực hiện. Tôi muốn chỉ đơn giản là có thể nhấp vào nút chạy từ bên trong nhật thực, không phải lệnh bên ngoài, sau đó gỡ lỗi từ xa. –

+0

Vậy, bài viết trong liên kết có giúp ích gì không? – ochi

Trả lời

0

Theo lời khuyên của Braheem, tôi có thể thực hiện việc này bằng cách sử dụng plugin exec-maven-plugin, tuy nhiên tôi đã thay đổi một chút để làm cho nền tảng độc lập hơn.

Sử dụng profile definitions from this answer, tôi có thể sử dụng ${script.extension} để trao đổi giữa sh.bat

Tôi có nghĩa Plugin sau đó tôi có thể thực hiện bằng cách sử dụng mục tiêu verify, mà cuối cùng sẽ trở thành một mục tiêu tùy chỉnh hoàn toàn.

<plugin> 
    <artifactId>exec-maven-plugin</artifactId> 
    <groupId>org.codehaus.mojo</groupId> 
    <version>1.5.0</version> 

    <executions> 
     <execution> 

      <id>Application Launcher</id> 
      <phase>verify</phase> 
      <goals> 
       <goal>exec</goal> 
      </goals> 
     </execution> 
    </executions> 

    <configuration> 
     <executable>"${project.build.directory}\${project.artifactId}-${project.version}\bin\launcher${script.extension}"</executable> 

     <arguments> 
      <argument>${flags}</argument> 
     </arguments> 
    </configuration> 
</plugin> 

Với định nghĩa Plugin trên, tôi đã có sẵn

# Launch 
mvn package verify 
# Calls [ launcher.bat ] 

# Launch with debug flag 
mvn package verify -Dflags=--debug 
# Calls [ launcher.bat --debug ] 

Sau đó, từ kịch bản của tôi, tôi có thể xử lý các --debug cờ, và nếu cần, sửa đổi lệnh khởi động.

... 

IF "%1"=="--debug" (

     REM add VM arguments to suspend the JVM and wait for debugger to attach 
     SET vmOpts=%vmOpts% -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 

     REM some additional arguments to send to my application 
     SET extOpts=%extOpts% --debug --console 
) 

... 

REM start the launcher.jar app with assemble arguments 
START java %vmOpts% -jar launcher.jar %extOpts% 

Từ với Eclipse, tôi hiện có 3 mục tiêu khởi chạy.

Launch Chuẩn

Một phóng tiêu chuẩn có thể được điều hành bởi chỉ chạy

mvn package verify 

Để gỡ rối, tôi yêu cầu tại hai mắt nhắm

Launch gỡ lỗi

mvn package verify -Ddebug=--debug 

Điều này sẽ gây ra các ứng dụng để khởi động, và treo, chờ đợi debugger để đính kèm, từ thời điểm này, tôi có thể chạy các mục tiêu thứ hai từ nhật thực, mà chỉ đơn giản được cấu hình để

Launch gỡ lỗi Đính kèm

Mục tiêu khởi chạy này chỉ đơn giản là connects to a remote application, như được mô tả trong tài liệu của Eclipse.

Chạy mục tiêu này kết nối với jvm đang chạy và mã không gian người dùng được tiếp tục, cho phép tôi gỡ lỗi như bình thường - trong khi ứng dụng đang chạy ra khỏi thư mục dist đã biên dịch.


Sau this answer, tôi chỉ đơn giản là có thể xuất ba cấu hình khởi động, và cam kết chúng với các phóng bản thân, cho phép người dùng mới của kho chỉ đơn giản là nhập các mục tiêu và sẵn sàng để đi trong vài giây.

2

Sau đây là một cách để có thể làm những gì bạn muốn, với các ví dụ cho Windows. Một phần của ý tưởng là từ here.

Tôi tin rằng có hai cách để thực hiện các lệnh bên ngoài bằng một nút trong nhật thực. Một là cấu hình công cụ bên ngoài tùy chỉnh, cấu hình kia có thể được thực hiện với cấu hình chạy cho maven trong nhật thực. Tôi sẽ hiển thị cấu hình công cụ bên ngoài trước tiên:

Ý tưởng là tạo tệp lô trong thư mục dự án của bạn và chạy nó từ nhật thực bằng cách tạo cấu hình chương trình Công cụ bên ngoài mới.

Vì vậy, ví dụ, bạn đã launcher.bat trong thư mục dự án của bạn với kịch bản sau đây:

call mvn clean package 
call cd target/ 
call "C:\Program Files\Java\{jdkfolder}\bin\cjava.bat" -{your debug options} -jar launcher.jar 


đâu cjava.bat là một tập tin thực thi bạn cần phải tạo ra với kịch bản sau đây:

start /wait cmd.exe /c java %* 


Sau đó, chương trình bên ngoài khởi chạy cấu hình có thể trông như thế này, mặc dù tôi chắc chắn bạn muốn đặt thư mục làm việc một cách rõ ràng để bạn không phải hig hlight dự án khi bạn bấm chạy.

external tools config



Đặt các thông số ra mắt trong tab chung cho việc lựa chọn của bạn

enter image description here

Thêm cấu hình bên ngoài này vào mục yêu thích của bạn để dễ dàng truy cập (nút công cụ bên ngoài của nó nên được trên thanh tác vụ).


Cách khác, nếu bạn thực sự muốn thực hiện điều này bằng cách sử dụng Lệnh chạy thay thế, hãy thiết lập cấu hình trình quản lý maven (exec-maven-plugin) và gọi tệp kịch bản theo cách đó với một cái gì đó như thế này, mặc dù tôi đã không thử nó.

<plugin> 
       <artifactId>exec-maven-plugin</artifactId> 
       <groupId>org.codehaus.mojo</groupId> 
       <executions> 
        <execution> 
         <id>Launcher Remote Debug</id> 
         <phase>package</phase> 
         <goals> 
          <goal>exec</goal> 
         </goals> 
        </execution> 
       </executions> 
       <configuration> 
        <executable>${basedir}/launcher.bat</executable> 
       </configuration> 
      </plugin> 

Sau đó, bạn chỉ cần xóa cuộc gọi cho mvn clean package trong tệp tập lệnh để bạn không kết thúc trong vòng lặp vô hạn.

+0

Giải pháp cuối cùng của tôi trông hơi khác một chút để có thể hỗ trợ nâng cấp đa nền tảng/phiên bản, tuy nhiên tôi đã xây dựng được việc triển khai này, cảm ơn. Tôi sẽ cung cấp cho bạn tiền thưởng và đăng giải pháp cuối cùng của tôi. –

1

Vì vậy, tôi không bao giờ cố gắng này, nhưng ở đây là thế nào tôi sẽ cho nó một shot:

Trong dự án của bạn, song song với pom.xml, thêm một build.xml (script Ant) với nội dung sau:

<project> 
<target name="mytarget" description="runs my class" > 
<java jar="target/launcher/launcher.jar" 
     fork="true" 
     failonerror="true" 
     maxmemory="128m" 
     > 
</java> 
</target> 
</project> 

Bây giờ Trong Eclipse đi đến run-> External Tools-> Công cụ cấu hình bên ngoài

Tạo một cấu hình mới dưới "xây dựng Ant"

dưới buildfile chọn c đường dẫn đầy đủ của tệp build.xml

Theo Mục tiêu, mục tiêu "mytarget" sẽ được chọn tự động. Chỉ cần chắc chắn rằng nó được kiểm tra.

Dưới tab JRE vượt qua đối số VM của bạn

-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 

Bây giờ bấm vào Run. Nếu thành công, hãy đính kèm trình gỡ rối của bạn. Bạn có thể tự động hóa nó bằng cách cấu hình tab Build. Tôi thực sự sẽ cấu hình tab Build để chạy "mvn clean package". Nhưng đến bây giờ bạn có một kịch bản kiến. Hãy làm bất cứ điều gì bạn muốn :-)

+0

Nếu các đối số JVM không được truyền đến bình của bạn có thể được sử dụng để "fork = true" trong tập lệnh ant. Trong trường hợp đó, tôi sẽ thêm sau đây trước: htulsiani

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