릴리스를 하나의 JAR 파일로 병합하는 가장 쉬운 방법
-
09-06-2019 - |
문제
여러 항목을 쉽게 병합할 수 있는 도구나 스크립트가 있습니까? 항아리 파일을 하나의 JAR 파일로 만드시겠습니까?보너스는 기본 파일 매니페스트를 쉽게 설정하고 실행 가능하게 만드는 것입니다.
구체적인 사례는 Java 재구성된 텍스트 도구.다음과 같이 실행하고 싶습니다.
자바 -jar 첫 번째.jar
내가 알 수 있는 한, 쉬운 단일 파일 도구가 되어서는 안 된다는 것을 나타내는 종속성이 없지만 다운로드한 ZIP 파일에는 많은 라이브러리가 포함되어 있습니다.
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
보시다시피, 이 작업을 수동으로 수행할 필요가 없는 것이 다소 바람직합니다.
지금까지 저는 AutoJar와 ProGuard만 사용해 보았지만 둘 다 실행하기 매우 쉬웠습니다.JAR 파일의 상수 풀에 문제가 있는 것 같습니다.
jrst가 약간 손상된 것 같으니 고치도록 하겠습니다.그만큼 메이븐 pom.xml
파일도 깨진 것 같으니 jrst를 고치기 전에 먼저 고쳐야 할 것 같아요...마치 벌레 자석 같은 느낌이에요 :-)
업데이트:이 응용 프로그램을 수정한 적이 없지만 확인했습니다. 식Fat JAR을 기반으로 하는 의 "Runnable JAR 내보내기 마법사"입니다.나는 이것이 내 자신의 코드를 배포하는 데 사용하기 매우 쉽다는 것을 알았습니다.
다른 훌륭한 제안 중 일부는 Eclipse가 아닌 환경의 빌드에 더 나을 수 있습니다. oss는 아마도 다음을 사용하여 멋진 빌드를 만들어야 할 것입니다. 개미.(Maven은 지금까지 나에게 고통을 주었지만 다른 사람들은 그것을 좋아합니다.)
해결책
Eclipse 3.4 JDT의 Runnable JAR 내보내기 마법사.
Eclipse 3.5에서는 이것이 확장되었습니다.이제 참조된 JAR 파일을 처리하는 방법을 선택할 수 있습니다.
다른 팁
개미 zipfileset
일을 한다
<jar id="files" jarfile="all.jar">
<zipfileset src="first.jar" includes="**/*.java **/*.class"/>
<zipfileset src="second.jar" includes="**/*.java **/*.class"/>
</jar>
몇 가지 다른 솔루션을 시도한 결과 One-JAR 가장 쉽게 작업할 수 있으며 정확히 다음과 같은 작업을 수행했습니다.필요한 모든 것을 포함하는 단일 실행 가능한 JAR을 생성합니다.
One-JAR은 중첩된 리소스를 탐색할 수 있는 사용자 정의 클래스 로더를 사용합니다.다운로드의 .bat 파일을 보면 jrst-0.8.1.jar의 org.codelutin.jrst.JRST가 메인 클래스이므로 매니페스트는 다음과 같아야 합니다.
Main-Class: com.simontuffs.onejar.Boot
One-Jar-Main-Class: org.codelutin.jrst.JRST
정말 멋진 점은 One-JAR가 명령줄 인수 전달을 처리한다는 것입니다.클래스 경로는 필요한 모든 리소스가 단일 JAR에 번들로 포함되어 있다고 가정하여 사용자 정의 클래스 로더에 의해 처리됩니다.
One-JAR을 사용하는 가장 쉬운 방법은 ant를 사용하는 것입니다.다음과 같이 작동하는 사용자 정의 "one-jar" 개미 작업이 있습니다(매니페스트가 "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>
당신이 메이븐 사용자는 일반적으로 어셈블리 플러그인이 원하는 작업을 수행하거나 잠재적으로 쉐이드 플러그인을 수행하며 경우에 따라 조합을 수행합니다.
어셈블리 플러그인을 사용하면 필요한 설정이 포함된 매니페스트 파일을 프로젝트에 넣을 수 있지만 일반적으로 기본값이 매우 좋습니다.그런 다음 건물이 완료됩니다.
mvn assembly:assembly
아니면 좀 더 특별한 처리해야 할 일이 있다면 다른 목표 중 하나를 선택하세요.포함할 모든 JAR 파일은 Maven의 종속성 해결 프로그램에 의해 선택됩니다.쉐이드 플러그인을 사용하는 경우 이는 일반적으로 설치 목표의 일부이며 제가 지금 하고 있는 특정 프로젝트에서는 그렇게 합니다.
mvn install
mvn assembly:single
그만큼 assembly:single
목표는 평생 문제를 해결하는 것입니다. 이 경우에는 봄 애플리케이션.
당신이 사용할 수있는 JarJar 패키지 섀도잉을 사용하여 JAR 파일이 다른 파일과 충돌하지 않는지 확인합니다.
있다 프로가드 이는 JAR 파일을 하나로 묶을 뿐만 아니라 클래스 파일을 최적화, 정리 또는 난독화하여 결과 JAR 파일을 이전의 모든 JAR 파일 합계보다 훨씬 작게 만듭니다.
실제로 JRST 도구를 사용하여 ProGuard를 사용해 보았는데, 보고하신 대로입니다.나는 문제를 추적하려고 노력했고 그것이 관련이 있음을 발견했습니다. 버그 jrst가 참조하는 ICU4J 라이브러리에 있습니다.문제는 사용된 ICU 버전이 현재 훨씬 구식이라는 것입니다.그래서 교체했어요 icu.jar
ICU4J 버전 3.2가 포함된 파일입니다.이제 ProGuard는 JRST 라이브러리의 불일치에 대한 여러 가지 다른 오류/경고를 찾습니다.
내 생각엔 ProGuard가 예상대로 작동하지만 jrst의 라이브러리가 일관성이 없는 것 같습니다.개발자가 프로젝트의 종속성을 확인하고 업데이트해야 하기 때문에 개발자와 대화하는 것보다 더 많은 일을 할 수 있는지 모르겠습니다.
(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>
One-JAR 0.97이 방금 출시되었습니다. http://one-jar.sourceforge.net, 다음과 같은 프레임워크에 대한 지원으로 확장되었습니다. 봄 그리고 기이스, 이는 다른 접근 방식에 문제를 일으킬 수 있습니다.또한 일부 JAR 파일이 One-JAR 외부에 있는 클래스 로더 반전도 처리합니다(예: JDBC 번들로 배송되지 않는 드라이버).
One-JAR은 명령줄입니다. 개미 그리고 메이븐 플러그인 2개."jar" 도구를 사용하여 빌드하는 것도 간단합니다.
또한 Ference Hechler가 작성한 Eclipse Jar 내보내기(실행 가능)를 추천할 수 있습니다.그는 JAR 파일 세트를 래핑하는 간단한 접근 방식을 고안하는 데 훌륭한 일을 했습니다.그와 나는 One-JAR 작업을 했지만 Jar 내보내기는 다른 코드베이스를 기반으로 합니다.
라는 도구가 있습니다. 자동항아리 그러면 바이트코드를 스캔하고 참조된(가져온) 클래스를 포함하여 찾은 클래스로 .jar 파일을 컴파일합니다.
그러나 구성에서 클래스 이름을 지정하고 프레임워크에 의해 로드되는 Spring과 같은 것과 항상 작동하는 것은 아닙니다.
또는 Maven 어셈블리 플러그인(mvn 어셈블리:어셈블리)을 사용합니다.
여기서 필요한 도구는 다음과 같습니다. JarSplice: http://ninjacave.com/jarsplice
그렇습니다 ~ 아니다 Ant 또는 Maven이 필요하고, 자체 GUI가 있으며, 사용하기 쉽고 요청한 대로 정확하게 수행할 수 있습니다. --> 여러 jar 파일의 내용을 하나의 파일로 병합합니다. (여전히 자체 클래스로더를 추가해야 합니다.)
이를 위해서는 Maven Shading 플러그인을 사용해야 합니다.나는 종종 독립 실행형 jar 파일을 만들기 위해 maven을 사용하는데, 그것은 매우 강력합니다.
더보기:
http://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html
처럼 들리다 아파치 앤트 당신이 찾고있는 것입니다.