programing

JAR 내에 JAR을 포함한 클래스 패스

sourcetip 2022. 10. 28. 23:23
반응형

JAR 내에 JAR을 포함한 클래스 패스

" " " " " " 를 할 수 ?classpath른른른른 파른른 ???

어플리케이션과 필요한 라이브러리를 포함하는 단일 jar를 작성하려면 두 가지 방법이 있습니다.첫 번째는 One-Jar로, 특별한 클래스 로더를 사용하여 항아리를 둥지로 만들 수 있습니다.두 번째는 UberJar(또는 Shade)로, 포함된 라이브러리를 폭발시켜 모든 클래스를 최상위 레벨의 항아리에 넣습니다.

또한 UberJar와 Shade는 각각 Maven1과 Maven2의 플러그인임을 언급해야 합니다.아래와 같이 어셈블리 플러그인을 사용할 수도 있습니다(실제로는 훨씬 강력하지만 올바르게 구성하기는 훨씬 어렵습니다).

이러한 "JAR 콘텐츠 분석" 솔루션은 사용하지 않는 것이 좋습니다.(모든 것이 같은 레벨로 폭발하기 때문에) 확실히 물건을 보는 것을 어렵게 만듭니다.또한 이름 경합이 발생할 수 있습니다(사용자가 적절한 패키지를 사용하는 경우 발생해서는 안 되지만 항상 이를 제어할 수는 없습니다).

원하는 기능은 상위 25개의 Sun RFE 중 하나입니다.RFE 4648386은 Sun이 무한한 지혜로 낮은 우선순위로 지정한 기능입니다.태양이 깨어나길 바랄 수 밖에...

그 사이에, Sun이 JDK로 복사해 주었으면 하는 최고의 솔루션은 커스텀 클래스 로더 JarClassLoader를 사용하는 것입니다.

조사 결과, 메이븐이나 서드 파티의 확장/프로그램이 필요 없는 방법을 발견했습니다.

매니페스트 파일에서 "Class-Path"를 사용할 수 있습니다.

예를 들어 다음과 같습니다.

매니페스트 파일을 만듭니다.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 archive create archive의 .f는, 파일 「파일명」을하는 것을 나타내고 있습니다.v 입력용입니다.m 매니페스트 을 패스하는 것을 합니다.

jar 패키지에 lib가 포함되어 있는지 확인하십시오.당신은 평범한 방법으로 독을 다룰 수 있을 겁니다.

기준: http://www.ibm.com/developerworks/library/j-5things6/

클래스 경로에 대해 필요한 기타 모든 정보는 여기를 참조하십시오.

zipgroup fileset 태그를 사용합니다(파일 세트 태그와 동일한 속성을 사용). 그러면 디렉토리 내의 모든 파일이 압축 해제되고 새 아카이브 파일에 추가됩니다.상세정보 : http://ant.apache.org/manual/Tasks/zip.html

이것은 jar-in-a-jar 문제를 회피하기 위한 매우 유용한 방법입니다.스택오버플로우 문제를 검색하면서 어떻게 해야 할지 생각해 봤기 때문에 알고 있습니다.항아리 또는 항아리 폴더를 Ant와 함께 만든 하나의 항아리에 패키징하고 싶다면 클래스 패스나 서드파티 플러그인 같은 것은 모두 잊어버리고 다음 작업만 하면 됩니다.

<jar destfile="your.jar" basedir="java/dir">
  ...
  <zipgroupfileset dir="dir/of/jars" />
</jar>

만약 당신이 개미와 함께 만들고 있다면(나는 이클립스의 개미를 사용하고 있다), 당신은 단지 개미에게 그것들을 추가하라고 말함으로써 여분의 항아리 파일을 추가할 수 있다.여러 사람이 관리하는 프로젝트를 가지고 있지만 1인용 프로젝트에서 사용할 수 있고 쉬운 경우 반드시 최선의 방법은 아닙니다.

예를 들어.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" />

외부 항아리가 있는 디르입니다.그리고 그게 다야...

당신만의 클래스 로더를 쓰지 않고서는 안 됩니다.항아리의 클래스 경로에 항아리를 추가할 수 있지만 항아리는 메인 항아리에 포함되지 않고 같은 위치에 있어야 합니다.

이를 위해 사용자 정의 클래스 로더를 구축하거나 이를 지원하는 타사 라이브러리를 구축해야 합니다.실행 시 jar를 추출하여 클래스 경로에 추가하는 것이 가장 좋습니다(또는 클래스 경로에 이미 추가).

maven 어셈블리 플러그인이라는 플러그인이 있는 자바 빌드에 maven을 사용합니다.

고객의 요구에 따라 동작하지만, 다른 제안과 마찬가지로 기본적으로 모든 의존적인 병을 폭발시켜 1개의 병으로 재결합합니다.

eclpise IDE가 있는 경우 JAR을 내보내고 "Package Required Librarys into generated JAR"를 선택하면 됩니다.이클립스는 자동으로 생성된 JAR에 필요한 종속 JAR을 추가하고 이러한 JAR을 자동으로 로드하는 이클립스 커스텀 클래스 로더를 생성합니다.

모든 파일을 같은 레벨로 추출하고, 그 결과로부터 항아리를 만들 것을 조언하려고 했습니다.패키지 시스템은 그것들을 깔끔하게 분리해 둘 것이기 때문입니다.수동적인 방법일 거예요, 스티브가 지시한 도구들이 잘 해내리라 생각해요.

Winstone은 꽤 좋은 http://blog.jayway.com/2008/11/28/executable-war-with-winstone-maven-plugin/입니다.그러나 복잡한 사이트에는 해당되지 않습니다.플러그인만 포함하면 되는데 아쉽네요.

음, 만약 당신이 이클립스를 사용한다면 매우 쉬운 방법이 있습니다.

프로젝트를 "실행 가능" Jar 파일로 내보냅니다(Eclipse 내에서 프로젝트 폴더를 마우스 오른쪽 버튼으로 클릭하고 "내보내기..내보내기 설정을 구성할 때 "Extract required library into generated Jar"를 선택합니다.Extract.."패키지 필수 라이브러리"가 아닌 "..".

기타:내보내기 설정에서 실행 구성을 선택해야 합니다.따라서 일부 클래스에서는 항상 빈 메인()을 생성하여 실행 Configuration에 사용할 수 있습니다.

어쨌든, 이것은 100% 동작하는 것은 아닙니다.포함하고 있는 Jar 파일의 라이선스를 확인하도록 지시하는 팝업메시지와 시그니처 파일을 복사하지 않는 것에 관한 것을 확인할 수 있습니다.하지만, 저는 이것을 몇 년 동안 해왔고 문제를 만난 적이 없습니다.

Uber-dir로 압축 해제하는 것은 모두 root:\java를 사용하고 버전 관리를 포함한 패키지에 아웃렛 코드가 포함되어 있어야 하기 때문에 도움이 됩니다.즉, ca.tecreations-1.0.0 입니다.다운로드한 위치에서 항아리가 손상되지 않았기 때문에 서명도 괜찮습니다.서드파티제의 시그니처는 온전하고, c:\timeout에 압축을 풉니다.이게 내 프로젝트야.런처로부터 실행하므로 Java -cp c:\java 런처

스프링 부트를 사용하고 있는 경우는, 다음의 메뉴얼을 참조해 주세요.실행 가능한 Jar 형식

Java는 중첩된 jar 파일(즉, jar 안에 포함된 jar 파일)을 로드하는 표준 방법을 제공하지 않습니다.이는 압축을 풀지 않고 명령줄에서 실행할 수 있는 자체 포함 응용 프로그램을 배포해야 하는 경우 문제가 발생할 수 있습니다.

이 문제를 해결하기 위해 많은 개발자들은 "그림자" 항아리를 사용합니다.음영 처리된 항아리는 모든 항아리의 모든 클래스를 하나의 "우버 항아리"로 패키징합니다.음영 처리된 항아리의 문제는 응용 프로그램에 실제로 어떤 라이브러리가 있는지 알아보기 어렵다는 것입니다.또한 여러 개의 jar에서 동일한 파일 이름을 사용하는 경우에도 문제가 발생할 수 있습니다.Spring Boot에서는 다른 접근방식을 사용하여 실제로 병을 직접 네스트할있습니다.

Spring 문서에는 다음과 같은 대체 단일 Jar 솔루션도 나와 있습니다.

언급URL : https://stackoverflow.com/questions/183292/classpath-including-jar-within-a-jar

반응형