답변:
응용 프로그램과 필요한 라이브러리가 포함 된 단일 jar을 만들려고하면 두 가지 방법이 있습니다. 첫 번째는 One-Jar 이며, 특수 클래스 로더를 사용하여 항아리를 중첩 할 수 있습니다. 두 번째는 UberJar (또는 Shade )이며 포함 된 라이브러리를 분해 하고 모든 클래스를 최상위 jar에 넣습니다.
또한 UberJar와 Shade는 각각 Maven1과 Maven2 용 플러그인입니다. 아래에서 언급했듯이 어셈블리 플러그인을 사용할 수도 있습니다 (실제로는 훨씬 강력하지만 올바르게 구성하기가 훨씬 어렵습니다).
이러한 "JAR 컨텐츠 분해"솔루션을 사용하지 않으려 고합니다. 그것들은 확실히 물건을보기 어렵게 만듭니다 (모든 것이 같은 레벨에서 폭발하기 때문에). 또한 이름 충돌이있을 수 있습니다 (사람들이 적절한 패키지를 사용하는 경우에는 발생하지 않아야하지만 항상이를 제어 할 수는 없습니다).
원하는 기능은 상위 25 개의 Sun RFE 중 하나입니다 . RFE 4648386 Sun이 무한한 지혜로 우선 순위가 낮은 것으로 지정한 . 우리는 태양이 깨어나기를 바랄뿐입니다 ...
한편, 내가 찾은 최고의 솔루션 (Sun이 JDK로 복사하기를 원함 )은 사용자 정의 클래스 로더 JarClassLoader 를 사용하는 것 입니다.
activation.jar
).
몇 가지 연구를 한 후에 maven 또는 타사 확장 프로그램을 필요로하지 않는 방법을 찾았습니다.
매니페스트 파일에서 "클래스 경로"를 사용할 수 있습니다.
예를 들면 다음과 같습니다.
매니페스트 파일 MANIFEST.MF 만들기
Manifest-Version: 1.0
Created-By: Bundle
Class-Path: ./custom_lib.jar
Main-Class: YourMainClass
모든 클래스를 컴파일하고 실행 jar cfm Testing.jar MANIFEST.MF *.class custom_lib.jar
c
아카이브 생성을
f
의미하는 것은 파일 v
을 자세하게 입력하기위한
것임을 나타냅니다.
m
은 사용자 정의 매니페스트 파일을 전달 함을 의미합니다.
jar 패키지에 lib를 포함했는지 확인하십시오. 일반적인 방법으로 jar를 실행할 수 있어야합니다.
기반으로 : http://www.ibm.com/developerworks/library/j-5things6/
custom_lib.jar
항아리를 더 이상 실행할 수 없습니다 :(
zipgroupfileset 태그를 사용하십시오 ( 파일 세트 태그 와 동일한 속성을 사용함 ). 디렉토리의 모든 파일을 압축 해제하고 새 아카이브 파일에 추가합니다. 추가 정보: http://ant.apache.org/manual/Tasks/zip.html
이것은 jar-in-a-jar 문제를 해결하는 매우 유용한 방법입니다. 무엇을 해야할지 알아 내려고 하면서이 정확한 StackOverflow 질문을 봤기 때문에 알고 있습니다. 항아리 또는 항아리 폴더를 Ant가있는 하나의 빌드 된 항아리에 패키지하려면이 클래스 경로 또는 타사 플러그인을 잊어 버려라.
<jar destfile="your.jar" basedir="java/dir">
...
<zipgroupfileset dir="dir/of/jars" />
</jar>
개미로 빌드하는 경우 (나는 개미의 개미를 사용하고 있습니다) 개미에게 추가하여 추가 jar 파일을 추가 할 수 있습니다 ... 여러 사람이 프로젝트를 관리하지만 작동하는 경우 반드시 가장 좋은 방법은 아닙니다. 한 사람의 프로젝트를 위해 쉽고 쉽습니다.
예를 들어 .jar 파일을 작성하는 대상은 다음과 같습니다.
<jar destfile="${plugin.jar}" basedir="${plugin.build.dir}">
<manifest>
<attribute name="Author" value="ntg"/>
................................
<attribute name="Plugin-Version" value="${version.entry.commit.revision}"/>
</manifest>
</jar>
방금 한 줄을 추가하여 만들었습니다.
<jar ....">
<zipgroupfileset dir="${external-lib-dir}" includes="*.jar"/>
<manifest>
................................
</manifest>
</jar>
어디
<property name="external-lib-dir"
value="C:\...\eclipseWorkspace\Filter\external\...\lib" />
외부 항아리가있는 디렉토리였습니다. 그리고 그게 다야...
maven assembly plugin 이라는 플러그인이있는 Java 빌드에 maven을 사용합니다. 합니다.
그것은 당신이 요구하는 것을하지만 다른 제안들과 같이 설명합니다-본질적으로 모든 종속 항아리를 폭발시키고 그것들을 단일 항아리로 재조합
Winstone은 http://blog.jayway.com/2008/11/28/ executable-war-with-winstone-maven-plugin /입니다 . 그러나 복잡한 사이트에는 적합하지 않습니다. 플러그인 만 포함하면되기 때문에 부끄러운 일입니다.
Eclipse를 사용하는 경우 매우 쉬운 방법이 있습니다.
프로젝트를 "실행 가능"Jar 파일로 내보내십시오 (Eclipse 내에서 프로젝트 폴더를 마우스 오른쪽 단추로 클릭하고 "내보내기 ..."를 선택하십시오). 내보내기 설정을 구성 할 때 "필요한 라이브러리를 생성 된 Jar로 추출"을 선택하십시오. "... 추출"을 선택, 마음에 유지하고 있지"패키지 필수 라이브러리 ..."가 " .
또한 : 내보내기 설정에서 실행 구성을 선택해야합니다. 따라서 어떤 클래스에서는 항상 빈 main ()을 만들어 실행 구성에 사용할 수 있습니다.
어쨌든,이되지 보장 사업에 100 %의 시간을 - 당신은 당신이 당신이 포함하고있는 Jar 파일의 라이센스를 확인하기 위해 알려주는 팝업 메시지가 나타납니다 및 서명 파일을 복사하지에 대해 뭔가 것 같은. 그러나 나는 수년간 이것을 해 왔으며 결코 문제가 발생하지 않았습니다.
Uber-dir로 추출하면 root : \ java를 사용하고 버전이있는 패키지에 콘센트 코드가 있어야하므로 나에게 효과적입니다. 즉 ca.tecreations-1.0.0. 항아리는 다운로드 한 위치에서 그대로 유지되므로 서명해도됩니다. 타사 서명은 그대로, c : \ java로 추출하십시오. 내 프로젝트 디렉토리가 있습니다. 실행기에서 실행하므로 java -cp c : \ java 실행기