2016-01-18 13 views
5

Tôi có một tập lệnh có kích thước hấp dẫn Automate.groovy. Tập lệnh không có định nghĩa lớp hoặc phương thức chính. Tôi đang tìm cách đơn giản nhất để tạo một lọ chứa tập lệnh. Tôi đã cố gắng biên soạn kịch bản hấp dẫn bằng cách sử dụng lệnh sau:Tạo một bình thực thi với kịch bản lệnh hấp dẫn

groovyc Automate.groovy 

Tôi cũng có một tập tin Manifest manifest-addition.txt chỉ rõ những lớp học chính

Main-Class: Automate 

Và tôi đã tạo ra jar bằng cách sử dụng lệnh:

jar cvfm Automate.jar mainfest-addition.txt *.class 

Điều này đã cho tôi một cái bình với Automate.class và Automate $ 1.class và tệp kê khai với lớp chính. Nhưng khi tôi cố gắng chạy jar sử dụng java -jar Automate.jar tôi luôn luôn nhận được lỗi

cannot find or load main class Automate. 

Tôi đang làm gì sai ở đây?

Sẽ có một cách đơn giản như thế này để tạo bình. Tôi chỉ có một tập tin kịch bản mà tôi muốn trong jar của tôi và tôi không muốn sử dụng maven/ant/gradle để hoàn thành công việc này. Không phải là một cách đơn giản và đơn giản để làm điều này?

Trả lời

7

Tệp lớp có phụ thuộc vào Groovy. Sử dụng jar có thể nhúng sẽ khắc phục được sự cố.

Sử dụng Groovy 2.4.5, nếu tôi có kịch bản này cho Automate.groovy

println "Hello from Automate.groovy" 

và sử dụng manifest.txt này:

Main-class: Automate 
Class-path: jar/groovy-all-2.4.5.jar 

và xây dựng này kịch bản đơn giản:

rm *.class 
groovyc Automate.groovy 
jar cvfm Automate.jar manifest.txt Automate.class 

và, trong thư mục chạy, tôi thực hiện điều này:

bash$ mkdir jar 
bash$ cp $GROOVY_HOME/embeddable/groovy-all-2.4.5.jar jar 

sau đó làm việc này:

bash$ java -jar Automate.jar 
Hello from Automate.groovy 

Các giải pháp sẽ tốt hơn nhiều nếu jar nhúng được bao gồm trong Automate.jar riêng của mình. Một ví dụ về điều đó, sử dụng Gradle, là this project.

+0

Tại sao giải pháp tốt hơn lại bao gồm cả hộp chứa tất cả trong Automate.jar? – RaGe

+0

Tôi thực sự đã thử bao gồm cả groovy-all jar trong classpath bằng cách sử dụng java -cp groovy-all.jar Automate.jar. Thậm chí sau đó tôi cũng gặp lỗi tương tự. Tôi thực sự có một chú thích @Grab và đó là những gì thực sự gây ra vấn đề. Khi tôi gỡ bỏ nó, nó đã có thể xác định vị trí lớp chính – Harini

-1

Vấn đề thực tế là chú thích @Grab đã có trong tập lệnh của tôi. Tôi tạo ra một dự án Gradle và thêm một kịch bản lệnh rất đơn giản HelloWorld.groovy chỉ với một câu lệnh println nhưng cũng sử dụng một @Grab để chỉ nhập một cái gì đó. Khi tôi xây lọ, nó sẽ không tìm thấy lớp chính. Khi tôi googled xung quanh tôi thấy rằng chú thích @Grab có nghĩa là để được sử dụng trong các kịch bản độc lập và không cho kịch bản được biên dịch trước. Vì vậy, nếu bạn cần phải có @Grab trong groovy biên dịch của bạn sau đó bạn cần phải thêm một phụ thuộc ivy bổ sung hoặc chọn không có @Grab và sử dụng một số cách khác để bao gồm phụ thuộc. Tôi đã xóa @Grab khỏi tập lệnh của mình rồi xây dựng nó. Các jar thực hiện tốt sau đó.

Xin lỗi btw vì sai lệch vì thực tế tôi không muốn sử dụng Gradle/Maven. Tôi gần như đã dành hai ngày cố gắng tất cả những điều mà tôi có thể tìm thấy trên stackoverflow và google và cuối cùng đã cố gắng Gradle. Tôi không chắc chắn nếu đây là giải pháp duy nhất cho vấn đề này nhưng điều này làm việc cho tôi.

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