2008-09-17 26 views
70

Có một công cụ hoặc tập lệnh nào dễ dàng kết hợp một loạt các tệp JAR vào một tệp JAR không? Tiền thưởng sẽ dễ dàng thiết lập tệp kê khai chính và làm cho tệp thực thi.Cách dễ nhất để hợp nhất một bản phát hành vào một tệp JAR

Vỏ bê tông là Java restructured text tool. Tôi muốn chạy nó với một cái gì đó như:

java -jar rst.jar

Theo như tôi có thể nói, nó không có phụ thuộc mà chỉ ra rằng nó không phải là một đơn giản công cụ tệp, nhưng tệp ZIP đã tải xuống chứa nhiều thư viện.

 0 11-30-07 10:01 jrst-0.8.1/ 
    922 11-30-07 09:53 jrst-0.8.1/jrst.bat 
    898 11-30-07 09:53 jrst-0.8.1/jrst.sh 
    2675 11-30-07 09:42 jrst-0.8.1/readmeEN.txt 
108821 11-30-07 09:59 jrst-0.8.1/jrst-0.8.1.jar 
    2675 11-30-07 09:42 jrst-0.8.1/readme.txt 
     0 11-30-07 10:01 jrst-0.8.1/lib/ 
    81508 11-30-07 09:49 jrst-0.8.1/lib/batik-util-1.6-1.jar 
2450757 11-30-07 09:49 jrst-0.8.1/lib/icu4j-2.6.1.jar 
559366 11-30-07 09:49 jrst-0.8.1/lib/commons-collections-3.1.jar 
    83613 11-30-07 09:49 jrst-0.8.1/lib/commons-io-1.3.1.jar 
207723 11-30-07 09:49 jrst-0.8.1/lib/commons-lang-2.1.jar 
    52915 11-30-07 09:49 jrst-0.8.1/lib/commons-logging-1.1.jar 
260172 11-30-07 09:49 jrst-0.8.1/lib/commons-primitives-1.0.jar 
313898 11-30-07 09:49 jrst-0.8.1/lib/dom4j-1.6.1.jar 
1994150 11-30-07 09:49 jrst-0.8.1/lib/fop-0.93-jdk15.jar 
    55147 11-30-07 09:49 jrst-0.8.1/lib/activation-1.0.2.jar 
355030 11-30-07 09:49 jrst-0.8.1/lib/mail-1.3.3.jar 
    77977 11-30-07 09:49 jrst-0.8.1/lib/servlet-api-2.3.jar 
226915 11-30-07 09:49 jrst-0.8.1/lib/jaxen-1.1.1.jar 
153253 11-30-07 09:49 jrst-0.8.1/lib/jdom-1.0.jar 
    50789 11-30-07 09:49 jrst-0.8.1/lib/jewelcli-0.41.jar 
324952 11-30-07 09:49 jrst-0.8.1/lib/looks-1.2.2.jar 
121070 11-30-07 09:49 jrst-0.8.1/lib/junit-3.8.1.jar 
358085 11-30-07 09:49 jrst-0.8.1/lib/log4j-1.2.12.jar 
    72150 11-30-07 09:49 jrst-0.8.1/lib/logkit-1.0.1.jar 
342897 11-30-07 09:49 jrst-0.8.1/lib/lutinwidget-0.9.jar 
2160934 11-30-07 09:49 jrst-0.8.1/lib/docbook-xsl-nwalsh-1.71.1.jar 
301249 11-30-07 09:49 jrst-0.8.1/lib/xmlgraphics-commons-1.1.jar 
    68610 11-30-07 09:49 jrst-0.8.1/lib/sdoc-0.5.0-beta.jar 
3149655 11-30-07 09:49 jrst-0.8.1/lib/xalan-2.6.0.jar 
1010675 11-30-07 09:49 jrst-0.8.1/lib/xercesImpl-2.6.2.jar 
194205 11-30-07 09:49 jrst-0.8.1/lib/xml-apis-1.3.02.jar 
    78440 11-30-07 09:49 jrst-0.8.1/lib/xmlParserAPIs-2.0.2.jar 
    86249 11-30-07 09:49 jrst-0.8.1/lib/xmlunit-1.1.jar 
108874 11-30-07 09:49 jrst-0.8.1/lib/xom-1.0.jar 
    63966 11-30-07 09:49 jrst-0.8.1/lib/avalon-framework-4.1.3.jar 
138228 11-30-07 09:49 jrst-0.8.1/lib/batik-gui-util-1.6-1.jar 
216394 11-30-07 09:49 jrst-0.8.1/lib/l2fprod-common-0.1.jar 
121689 11-30-07 09:49 jrst-0.8.1/lib/lutinutil-0.26.jar 
    76687 11-30-07 09:49 jrst-0.8.1/lib/batik-ext-1.6-1.jar 
124724 11-30-07 09:49 jrst-0.8.1/lib/xmlParserAPIs-2.6.2.jar 

Như bạn có thể thấy, có phần mong muốn không cần phải thực hiện việc này theo cách thủ công.

Cho đến giờ tôi chỉ thử AutoJar và ProGuard, cả hai đều khá dễ dàng để chạy. Có vẻ như có một số vấn đề với hồ bơi không đổi trong các tệp JAR.

Rõ ràng jrst bị hỏng một chút, vì vậy, tôi sẽ sửa chữa nó. Các tập tin Mavenpom.xml rõ ràng đã bị hỏng quá, vì vậy tôi sẽ phải khắc phục điều đó trước khi sửa chữa jrst ... Tôi cảm thấy giống như một lỗi-nam châm :-)


Cập nhật: Tôi không bao giờ có xung quanh để sửa chữa ứng dụng này , nhưng tôi đã xem "Thuật sĩ xuất JAR Runnable JAR" của Eclipse "dựa trên một JAR chất béo. Tôi thấy điều này rất dễ sử dụng để triển khai mã của riêng tôi.

Một số đề xuất tuyệt vời khác có thể tốt hơn cho các bản dựng trong môi trường không phải Eclipse, oss có lẽ nên tạo một bản dựng đẹp bằng cách sử dụng Ant. (Maven, cho đến nay đã chỉ cho tôi đau, nhưng những người khác thích nó.)

+0

http://www.jdotsoft.com/JarClassLoader.php – gorokhmn

+0

[Trình cắm Eclipse Plugin chất béo] (http://fjep.sourceforge.net/) –

+0

[One-Jar] (http: // một-jar. sourceforge.net/) –

Trả lời

33

Eclipse 3.4 Thuật sĩ xuất JAR Runnable của JDT.

Trong Eclipse 3.5, điều này đã được mở rộng. Bây giờ bạn có thể chọn cách bạn muốn xử lý các tệp JAR được tham chiếu của bạn.

+0

Bạn có thể kiểm tra xem kịch bản kiến ​​được tạo có thể sử dụng được không? Đã xảy ra sự cố trước đó với các tệp nội dung tuyệt đối thay vì tương đối. –

14

Nếu bạn là người dùng Maven, thường plugin lắp ráp làm những gì bạn muốn, hoặc có khả năng plugin bóng râm và trong một số trường hợp là sự kết hợp.

Với plugin lắp ráp, bạn đặt tệp kê khai trong dự án của mình với mọi cài đặt cần thiết, mặc dù các giá trị mặc định thường khá tốt. Sau đó, tòa nhà được thực hiện với

mvn assembly:assembly 

Hoặc nếu bạn có nhiều điều đặc biệt để giải quyết, một trong các mục tiêu khác. Tất cả các tệp JAR cần bao gồm đều được trình phân giải phụ thuộc của Maven chọn. Nếu bạn sử dụng các plugin bóng râm, nó thường là một phần của mục tiêu cài đặt, và trong một dự án cụ thể tôi đang làm bây giờ tôi làm

mvn install 
mvn assembly:single 

Mục tiêu assembly:single là để làm việc xung quanh vấn đề đời, trong trường hợp này trong một Spring ứng dụng.

3

Có một công cụ gọi là autojar sẽ quét mã byte của bạn và biên dịch tệp .jar với các lớp mà nó tìm thấy, bao gồm các lớp được tham chiếu (đã nhập).

Không phải lúc nào cũng hoạt động với thứ gì đó như Spring, trong đó bạn chỉ định tên lớp trong cấu hình và nó được khung tải.

+0

Cảm ơn con trỏ, có vẻ như một số .jars trong ứng dụng cụ thể này đang cho tôi một số nhức đầu làm việc này. – tovare

27

Đã thử một vài giải pháp khác nhau, tôi đã tìm thấy One-JAR dễ dàng nhất để làm việc và quản lý để thực hiện chính xác điều đó: tạo một JAR đơn, có thể chứa mọi thứ tôi cần.

One-JAR sử dụng trình tải lớp tùy chỉnh có thể điều hướng tài nguyên lồng nhau. Nhìn vào file .bat trong việc tải xuống, nó trông giống như org.codelutin.jrst.JRST trong jrst-0.8.1.jar là lớp chính, vì vậy bạn manifest sẽ trông như thế này:

Main-Class: com.simontuffs.onejar.Boot 
One-Jar-Main-Class: org.codelutin.jrst.JRST 

Các điều thực sự thú vị là One-JAR sẽ xử lý việc truyền các đối số dòng lệnh cho bạn. Đường dẫn lớp được xử lý bởi trình nạp lớp tùy chỉnh, giả sử tất cả các tài nguyên bạn cần được gộp vào một JAR duy nhất.

Cách dễ nhất để sử dụng One-JAR là kiến; có một tùy chỉnh "một lọ" ant nhiệm vụ mà hoạt động như sau (giả sử biểu hiện của bạn được gọi là "rst.mf"):

<target name="jar-rst"> 
    <one-jar destfile="rst.jar" manifest="rst.mf"> 
     <main jar="jrst-0.8.1.jar" /> 
     <lib> 
      <fileset dir="${pathToJars}"> 
       <include name="batik-util-1.6-1.jar" /> 
       <include name="icu4j-2.6.1.jar" /> 
       <include name="commons-collections-3.1.jar" /> 
       <!-- Snip --> 
      </fileset> 
     </lib> 
    </one-jar> 
</target> 
+1

Kịch bản của một-jar với kiến ​​làm cho nó có thể sử dụng trong các hệ thống xây dựng liên tục. –

+0

1. Một-JAR có khả năng nếu có một số ứng dụng (một số lớp nhập điểm) bên trong bình của tôi không? 2. Nếu bình này được sử dụng bởi ứng dụng khác, nó có thể sử dụng các lớp trong các lồng lồng bên trong "One-JAR" không? – MRalwasser

8

ProGuard mà không chỉ gói file JAR của bạn thành một, nhưng nó cũng có thể tối ưu hóa, dọn dẹp hoặc làm xáo trộn các tệp lớp của bạn, làm cho tệp JAR kết quả nhỏ hơn nhiều so với tổng của tất cả các tệp JAR trước đây.

Tôi thực sự đã thử ProGuard bằng công cụ JRST và như bạn đã báo cáo. Tôi đã cố gắng theo dõi vấn đề và tìm thấy nó liên quan đến a bug trong thư viện ICU4J được tham chiếu bởi jrst. Vấn đề là, phiên bản ICU đã qua sử dụng hiện đã lỗi thời. Vì vậy, tôi đã thay thế tệp icu.jar bằng phiên bản ICU4J 3.2. Bây giờ ProGuard tìm thấy một loạt các lỗi/cảnh báo khác về sự mâu thuẫn với các thư viện của JRST.

Tôi đoán ProGuard hoạt động như mong đợi, nhưng các thư viện của jrst không nhất quán. Tôi không biết nếu bạn có thể làm nhiều hơn là nói chuyện với các nhà phát triển của nó vì họ nên kiểm tra và cập nhật các phụ thuộc của dự án.

+0

Cảm ơn! tôi đã tải xuống và thử, nhưng trong trường này, nó đã bị đánh bom với trường không xác định trên icu4j-2.6.1.jar, – tovare

3

Hoặc sử dụng lắp ráp plugin Maven (lắp ráp mvn: lắp ráp)

8

Bạn có thể sử dụng JarJar mà sẽ sử dụng gói shadowing để đảm bảo tập tin JAR của bạn không xung đột với người khác.

+0

+1. Dễ sử dụng và hoạt động tốt. – Eelco

63

Ant zipfileset hiện công việc

<jar id="files" jarfile="all.jar"> 
    <zipfileset src="first.jar" includes="**/*.java **/*.class"/> 
    <zipfileset src="second.jar" includes="**/*.java **/*.class"/> 
</jar> 
+1

+1 vì điều này cũng cho phép một thẻ thêm thẻ và đặt lớp chính. – Shirkrin

+0

Có thể thực hiện điều này cho tất cả các tệp jar trong một thư mục nào đó không. Sẽ rất gọn gàng. Tránh cần cập nhật build.xml khi các thư viện thay đổi. –

+3

Hãy thử phương pháp này, bạn sẽ không phải lo lắng về việc bổ sung các lọ mới: https://github.com/anupamsaini/Trie/blob/master/src/build.xml#L42 –

5

One-JAR 0,97 vừa được phát hành tại http://one-jar.sourceforge.net, và nó đã được mở rộng wih hỗ trợ cho các khuôn khổ như SpringGuice, có thể trình bày khó khăn để tiếp cận khác. Nó cũng xử lý sự nghịch đảo của trình nạp lớp - nơi mà một số tệp JAR nằm ngoài One-JAR (ví dụ, các trình điều khiển JDBC có thể không được gói đi kèm).

One-JAR là dòng lệnh, với AntMaven 2 plugin. Nó cũng đơn giản để xây dựng chỉ bằng cách sử dụng công cụ "jar".

Tôi cũng có thể đề xuất Nhà xuất bản Jar Eclipse (Runnable) mà Ference Hechler đã viết: ông đã làm một công việc tuyệt vời để đưa ra một phương pháp đơn giản để gói một tập hợp các tệp JAR.Anh ấy và tôi đã làm việc với One-JAR, nhưng Jar Exporter dựa trên một codebase khác.

+0

+1 cho One-JAR ... –

+0

+1 cho một-jar, -1 để đề cập đến hỗ trợ Maven: p – Manius

7

(dựa trên Andrian của):

<jar id="files" jarfile="all.jar"> 
    <zipgroupfileset dir="${library.dir}" includes="*.jar" excludes="test-helper.jar"/> 
    <zipfileset src="first.jar" includes="**/*.java **/*.class"/> 
    <zipfileset src="second.jar" includes="**/*.java **/*.class"/> 
    <fileset dir="."> 
    <include name="LICENSE"/> 
    <include name="NOTICE"/> 
    </fileset> 
</jar> 
2

Tôi nghĩ rằng công cụ mà bạn cần ở đây là JarSplice: http://ninjacave.com/jarsplice

không phải yêu cầu Ant hoặc Maven, có giao diện riêng của mình, việc sử dụng và thực hiện chính xác những gì bạn đã yêu cầu ->Nó kết hợp nội dung của một số j các tệp ar thành một tệp đơn lẻ (xin lưu ý rằng nó vẫn cần phải thêm trình nạp lớp của riêng nó).

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