2011-04-29 6 views
2

모든 종속성을 가진 maven-assembly-plugin을 사용하여 실행 파일 jar를 빌드하려고합니다. 항아리 내부의/jar 디렉토리와 항아리의 동일한 레벨에있는 설정 파일들을/lib/디렉토리에 저장하고 싶습니다.실행 파일 jar 파일에 클래스 경로 설정에 대한 도움말

내 pom.xml 파일은 다음과 같습니다

<plugin> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <version>2.2.1</version> 
       <configuration> 
        <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <classpathPrefix>lib/</classpathPrefix> 
         <mainClass>org.main.Class</mainClass> 
        </manifest> 
        <manifestEntries> 
         <Class-Path>/ MainClass.jar</Class-Path> 
        </manifestEntries> 
        </archive> 
        <descriptors> 
        <!--Relative path to your descriptor --> 
        <descriptor>src/main/assembly/packagejar.xml</descriptor> 

        </descriptors> 
       </configuration> 
</plugin> 

packagejar.xml은 다음과 같습니다

<id>eval</id> 
    <formats> 
    <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <fileSets> 
    <fileSet> 
     <directory>${project.build.directory}</directory> 
     <outputDirectory>/</outputDirectory> 
     <includes> 
     <include>MainClass.jar</include> 
     </includes> 
    </fileSet> 
    </fileSets> 
    <files> 
    <file> 
     <source>/src/main/resource/logging.properties</source> 
     <outputDirectory>/</outputDirectory> 
    </file> 
    <file> 
     <source>/src/main/resource/log4j.properties</source> 
     <outputDirectory>/</outputDirectory> 
    </file> 
    <file> 
     <source>/src/main/resource/hibernate.cfg.xml</source> 
     <outputDirectory>/</outputDirectory> 
    </file> 
    </files> 
    <dependencySets> 
    <dependencySet> 
     <outputDirectory>/lib/</outputDirectory> 
     <useProjectArtifact>false</useProjectArtifact> 
     <unpack>false</unpack> 
     <scope>runtime</scope> 
    </dependencySet> 
    </dependencySets> 
    </assembly> 

그리고 결과 MANIFEST.MF 파일이 :이

Manifest-Version: 1.0 
Archiver-Version: Plexus Archiver 
Created-By: Apache Maven 
Built-By: German 
Build-Jdk: 1.6.0_22 
Main-Class: org.main.Class 
Class-Path:/MainClass.jar lib/dependency1.jar lib/dependency2.jar etc... 

, 나는 실행할 mainclass를 얻지 만, lib 디렉토리 안에있는 jar 파일을 찾지 못한다. 아마 뭔가 기본적인 것을 놓치고있을거야. 또한 pom.xml manifestEntries에 lib/, lib/ .jar,/lib 및/lib /를 추가하려고했습니다.

아이디어가 있으십니까?

미리 감사드립니다.

+0

?? 나는 또한이 문제에 갇혀 있거나 이런 식으로 할 수 없다. – firefox784

+0

이 발견했습니다. Java 자습서에서 발췌 한 내용 ... http://docs.oracle.com/javase/tutorial/deployment/jar/downman.html 클래스 경로 헤더는 클래스 또는 JAR 파일을 가리 킵니다. 로컬 네트워크, JAR 파일 내의 JAR 파일 또는 인터넷 프로토콜을 통해 액세스 가능한 클래스가 아닙니다. JAR 파일 내의 JAR 파일에있는 클래스를 클래스 경로에로드하려면 해당 클래스를로드하는 사용자 정의 코드를 작성해야합니다. 예를 들어 MyJar.jar에 MyUtils.jar이라는 다른 JAR 파일이 들어 있으면 MyJar.jar의 매니페스트에있는 Class-Path 헤더를 사용하여 MyUtils.jar의 클래스를 클래스 경로로로드 할 수 없습니다. – firefox784

+0

고마워, firefox784. 그래서 나는 실행 가능한 jar를 릴리즈하는 가장 좋은 방법은 그 jar 바깥의 lib 디렉토리에있는 의존성을 가지고 있다고 생각한다. – greguren

답변

1

Java Tutorial을 원하는 방식으로 수행 할 수없는 이유를 참조하십시오. 실행 가능한 jar를 해제하는 방법에 대한 질문은 가능한 한 방법이지만 항상 종속성을 별도로 보내려는 것은 아닙니다. 의존성을 가진 실행 가능한 jar를 빌드하는 플러그인이 몇 가지 있습니다 (그러나 예상 한대로는 아닙니다). OneJARMaven Shade을 살펴보십시오. 하나의 JAR은 lib 디렉토리의 종속성을 가진 실행 가능 jar를 작성하지만 실행 가능한 jar에는 사용자 정의 클래스 로더 클래스가 있습니다. Maven shade plugin은 실행 가능한 jar 내의 의존성 라이브러리를 unjars합니다. 스프링 종속성과 함께 실행 파일을 빌드 할 때 약간의 변환 작업이 필요했기 때문에 Maven Shade를 사용했습니다.

+0

감사합니다. firefox784! – greguren

관련 문제