2011-04-08 6 views
10

Xin chào tất cả Tôi đang viết một số phần mềm cho phép người dùng tạo các lớp Java của riêng họ để sử dụng cụ thể trong gói phần mềm của tôi. Rõ ràng, phần mềm của tôi sẽ cần để có thể gọi một trình biên dịch Java để biên dịch các lớp do người dùng tạo ra để sử dụng trong chương trình của tôi. Tuy nhiên, tôi không muốn yêu cầu người dùng tải xuống và cài đặt toàn bộ JDK để họ có thể truy cập trình biên dịch Java javac. Tôi hiểu rằng trong Jave 6 có một API trình biên dịch Java mới nhưng ngay cả khi đó, những người dùng chỉ có JRE và không phải JDK sẽ nhận được một đối tượng null khi họ cố gắng khởi tạo công cụ trình biên dịch Java.Sử dụng Java Compiler API mà không cần cài đặt JDK

Vì vậy, cách tốt nhất để cho phép chương trình của tôi biên dịch các lớp Java trong khi yêu cầu người dùng cuối chỉ cài đặt JRE trên máy của họ là gì? Nếu điều này là không thể, tập hợp thư viện/tệp jar tối thiểu tôi sẽ cần cài đặt trên máy người dùng là gì?

Tôi cho rằng một khả năng khác có thể là sử dụng JWS (javaws) để khởi chạy ứng dụng trên web. Trong trường hợp này, có thể cho phần mềm của tôi không yêu cầu JDK (chủ yếu là tools.jar tôi nghĩ) không? Tôi sẽ bằng cách nào đó phải đóng gói tools.jar với phần mềm của tôi?

Trả lời

5

Bạn có thể sử dụng độc lập Java compiler from Eclipse. Nó không cần cài đặt JDK, và nó là tệp JAR duy nhất mà bạn có thể sử dụng trong dự án của mình. Đây là trình biên dịch được sử dụng bên trong Eclipse, nhưng nó cũng có thể được tích hợp vào các chương trình khác. Bạn có thể tìm phiên bản ổn định mới nhất hiện tại tại http://download.eclipse.org/eclipse/downloads/drops/R-3.6.2-201102101200/index.php, tìm phần Tìm trình biên dịch hàng loạt JDT. Tài liệu có sẵn tại http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_api_compile.htm

Bạn cũng có thể sử dụng Janino, cũng có thể biên dịch các đơn vị nhỏ hơn các lớp Java đầy đủ: khối, biểu thức. Nó không hỗ trợ tất cả các tính năng của ngôn ngữ Java mà người dùng của bạn sử dụng (generics, annotations, enums, ...)

+1

java -jar ecj-3.6.2.jar -d gaevfs.bin \ gaevfs.src \ com \ newatlanta \ commons \ vfs \ provider \ gae \ GaeFileObject.java -cp D: \ ProgXP \ jre6 \ lib \ rt D: \ WorkSpace \ diyism.com.war \ WEB-INF \ lib \ appengine-api-1.0-sdk-1.5.5.jar; D: \ WorkSpace \ diyism.com.war \ WEB-INF \ lib \ commons-vfs-2.0-SNAPSHOT.jar; D: \ WorkSpace \ diyism.com.war \ WEB-INF \ lib \ gaevfs-0.3.jar; D: \ WorkSpace \ diyism.com.war \ WEB-INF \ lib \ commons-logging-1.1.1.jar – diyism

0

Có vẻ như một giải pháp tốt hơn là sử dụng một số ngôn ngữ kịch bản có thể chạy trong JVM mà không cần phải biên soạn.

Có thể Java Scripting API sẽ được sử dụng cho bạn. Tôi chắc chắn cũng có những lựa chọn khác.

3

Để sử dụng trình biên dịch java, bạn cần phải bao gồm tools.jar vào ứng dụng của bạn (ví dụ nó có thể truy cập được bởi trình nạp lớp, người muốn tải trình biên dịch - dễ dàng nhất bởi trình nạp lớp Hệ thống).

+2

".. bạn cần đưa' tools.jar' vào ứng dụng của bạn .. "Tôi đã suy nghĩ về khả năng này khi phát triển [SSCCE Text Based Compiler] (http: // pscode) .org/stbc /). Như tôi [đề cập đến trong sự giúp đỡ] (http://pscode.org/stbc/help.html#classpath) ".. nó có thể vi phạm giấy phép phân phối của Sun ..". Tôi nhận ra mọi người ở đây là 'không phải luật sư', nhưng nếu có ai đó có lý thuyết thay thế/giải thích về giấy phép, tôi rất muốn nghe họ. –

+2

Lấy một từ OpenJDK, và thêm một liên kết đến nguồn, sau đó. –

+2

Không nghĩ về điều đó! Nó gọn gàng bên bước 'vấn đề cấp phép'. :) –