2008-12-18 11 views
14

Tôi phải gửi một số mã groovy cho một số người dùng mà chỉ có java cài đặt (không có grooy, không có $ groovy_home, vv). Tôi đang cố gắng gọi groovy từ dòng lệnh nhưng tôi không có may mắn. Dưới đây là file bat của tôi:Làm thế nào để gọi groovy với 'java' từ dòng lệnh

java -classpath .;lib;bin;bin-groovy introspector.AclCollector 

Và đây là ngoại lệ của tôi:

Exception in thread "main" java.lang.NoClassDefFoundError: groovy/lang/GroovyObject 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:621) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) 
     at java.net.URLClassLoader.access$000(URLClassLoader.java:56) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:195) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 
Caused by: java.lang.ClassNotFoundException: groovy.lang.GroovyObject 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 
     ... 12 more 
Could not find the main class: introspector.AclCollector. Program will exit. 

Có ai có một đầu mối? Tôi có 'groovy-all-1.6-beta-1.jar' trong thư mục \ lib.

Trả lời

9

Tôi nghĩ rằng bạn cần phải rõ ràng danh sách các jar groovy trong classpath

14

Bạn có here một ví dụ về ứng dụng Groovy gọi từ Java (trong trường hợp này, từ con kiến, nhưng ý tưởng chung là như nhau).

java -cp [...];%GROOVY_HOME%/embeddable/groovy-all-1.5.4.jar;[..] 

Như đã đề cập bởi frankowyer, bạn có chính xác được liệt kê rõ ràng trên các đối số đường dẫn của java.

Kể từ khi khách hàng của bạn không có biến môi trường đặc biệt, chỉ cần thay thế các %GROOVY_HOME%/... với đường dẫn đầy đủ đến:

  • groovy.jar hoặc
  • goovy-all-VERSION.jar (để giảm thiểu bất kỳ cuộc xung đột với các thư viện khác)
8

Một cách để tránh các vấn đề với các đường dẫn lớp khác nhau trên các máy khác nhau là gộp tất cả các phụ thuộc cần thiết vào một cái bình, điều này cũng sẽ giúp phân phối dễ dàng hơn cho người dùng. Điều này có thể được thực hiện với kịch bản 'GroovyWrapper' này. Các lọ mặc định (embeddable/groovy-all- .jar và lib/commons .jar) được bao gồm theo mặc định trong tập lệnh và nếu bạn yêu cầu các JAR khác thì chúng có thể dễ dàng được thêm vào.

Xem http://docs.codehaus.org/display/GROOVY/WrappingGroovyScript để biết toàn bộ tập lệnh và hướng dẫn.

Dưới đây là một ví dụ về cách sử dụng GroovyWrapper:

Giả sử bạn có kịch bản hấp dẫn HelloWorld.groovy, sử dụng cho việc xây dựng GroovyWrapper HelloWorld.jar, như sau:

$ groovy GroovyWrapper -c -m HelloWorld 

GroovyWrapper sẽ biên dịch kịch bản HelloWorld.groovy đến HelloWorld.class và tạo một jar tự thực hiện HelloWorld.jar.

Bây giờ bạn có thể sử dụng HelloWorld.jar cho tung ra kịch bản HelloWorld, chỉ đơn giản bằng cách chạy:

$ java -jar HelloWorld.jar 
+1

'GroovyWrapper' sử dụng' Ant' để tạo tập lệnh groovy thành tệp jar .Cấu trúc này cũng có thể được thực hiện bằng 'Gradle' way.See [this answer] (http://stackoverflow.com/a/9749869/2011291) nếu ai đó thích nó. – AvatarQing

1

Great câu trả lời bằng cách VonC:

....... Kể từ khi khách hàng của bạn không có biến môi trường đặc biệt, chỉ cần thay thế %GROOVY_HOME%/ ...với đường dẫn đầy đủ đến:

groovy.jar or 
goovy-all-VERSION.jar (to minimize any conflict with other libraries)........ 

này là dành cho windows Vista:

Trong System Properties | Biến môi trường | biến người dùng: Tên biến GROOVY_HOME thiết lập để C:\groovy\Groovy-1.8.5 và thiết lập các Tên biến CLASSPATH giá trị của để bao gồm .;%GROOVY_HOME%\embeddable\groovy-all-1.8.5.jar

Đừng mắc sai lầm khi tôi đã làm (quay bánh xe của tôi một chút), không chuẩn bị kết thúc con đường của 'groovy-all' với ".;" (dấu chấm và dấu chấm phẩy): khi đường dẫn cần thư mục cơ bản mà bạn đang tìm kiếm để tìm lớp chính (có vẻ như có vẻ lạ)

+1

Đây phải là nhận xét chứ không phải là câu trả lời riêng! – durron597

0

Xem trong số [~]!

java -cp .:~/path-to-groovy-all.jar YourClassName  # does not work 
java -cp ~/path-to-groovy-all.jar:. YourClassName  # works 
java -cp .:/full/path/to/goovy-all.jar YourClassName # works 

Trong dấu ngã dòng đầu tiên không được xử lý bởi bash và java không thể hiểu được.

Trong dấu ngã dòng thứ hai được thay thế bằng bash và mọi thứ hoạt động tốt.