it-swarm-vi.com

Cách dễ nhất để hợp nhất một bản phát hành vào một tệp JAR

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

Trường hợp cụ thể là một công cụ văn bản cấu trúc lại Java . 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 nào cho thấy nó không nên là một công cụ tập tin đơn giản, nhưng tệp Zip đã tải xuống chứa rất 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, nó là một phần mong muốn để không cần phải làm điều này bằng tay.

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

Rõ ràng jrst hơi bị hỏng, vì vậy tôi sẽ tiến hành sửa nó. Tệp Mavenpom.xml rõ ràng cũng bị hỏng, vì vậy tôi sẽ phải sửa nó trước khi sửa jrst ... Tôi cảm thấy như một nam châm lỗi :-)


Cập nhật: Tôi chưa bao giờ sửa lỗi ứng dụng này, nhưng tôi đã kiểm tra "Trình hướng dẫn xuất JAR có thể chạy" của Eclipse dựa trên JAR 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 là Eclipse, có lẽ nên tạo một bản dựng Nice bằng cách sử dụng Ant . (Maven, cho đến nay chỉ mang đến cho tôi nỗi đau, nhưng những người khác thích nó.)

70
tovare

Trình hướng dẫn xuất JAR Runnable JAR của Eclipse 3.4.

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 mình.

33
Stephen Denne

Ant's zipfileset thực 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>
62
akuhn

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

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

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

Điều thực sự thú vị là One-JAR sẽ xử lý 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ói vào một tệp JAR duy nhất.

Cách dễ nhất để sử dụng One-JAR là với kiến; có một tác vụ ant "one-jar" tùy chỉnh hoạt động như sau (giả sử tệp kê khai 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>
27
Ashley Mercer

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

Với plugin hội, bạn đặt một tệp kê khai trong dự án của bạn với bất kỳ cài đặt cần thiết nào, mặc dù các giá trị mặc định thường khá tốt. Xây dựng sau đó được thực hiện với

mvn Assembly:assembly

Hoặc nếu bạn có nhiều điều đặc biệt hơn để giải quyết, một trong những mục tiêu khác. Tất cả các tệp JAR cần bao gồm, được chọn bởi trình giải quyết phụ thuộc của Maven. Nếu bạn sử dụng 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à giải quyết các vấn đề trọn đời, trong trường hợp này là trong ứng dụng Spring .

14
larsivi

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

8
Steve g

ProGuard không chỉ gói các tệp JAR của bạn thành một mà còn 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 đó.

Tôi thực sự đã thử ProGuard với công cụ JRST và nó như bạn đã báo cáo. Tôi đã cố gắng theo dõi vấn đề và thấy nó liên quan đến một lỗi trong thư viện ICU4J được tham chiếu bởi jrst. Vấn đề là, phiên bản ICU đã sử dụng hiện đã lỗi thời. Vì vậy, tôi đã thay thế tệp icu.jar bằng ICU4J phiên bản 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ự không phù hợp với các thư viện của JRST.

Tôi đoán là ProGuard hoạt động như mong đợi, nhưng các thư viện của jrst thì không nhất quán. Tôi không biết liệ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ó hay không vì họ nên kiểm tra và cập nhật các phụ thuộc của dự án.

8
jrudolph

(dựa trên Andrian):

<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>
7
象嘉道

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

One-JAR là dòng lệnh, với AntMaven 2 plugin. Thật đơ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 Trình xuất Jar Jar (Runnable) mà Ference Hechler đã viết: anh ấy đã làm rất tốt khi đưa ra một cách tiếp cận đơn giản để gói một tập các tệp JAR. Anh ấy và tôi đã làm việc trên One-JAR, nhưng Jar Exporter dựa trên một cơ sở mã khác nhau.

5
simontuffs

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

3
Philip Helger

Có một công cụ đượ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).

Tuy nhiên, không phải lúc nào cũng hoạt động với một cái gì đó như Spring, nơi bạn chỉ định các tên lớp trong cấu hình và nó được tải bởi khung công tác.

3
user7094

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

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

2
Nadir

Bạn nên sử dụng plugin maven shading để làm điều đó. Tôi thường sử dụng maven để xây dựng tệp jar độc lập và nó rất mạnh

Xem thêm:

http://maven.Apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html

0
hoang