2010-01-07 7 views
77

Maven mantra에 비교적 익숙하지만 Maven을 사용하여 명령 행 runnable jar를 빌드하려고합니다. 내 의존성을 설정했지만 mvn install을 실행하고 jar를 실행하려고하면 두 가지 일이 발생합니다. 첫째, 수정 가능한 메인 클래스가 발견되지 않습니다. 이 문제를 해결하면 클래스를 찾을 수 없다는 오류가 발생합니다.Maven 2를 사용하여 실행 가능한 jar 작성하기

Maven은 내 종속성 라이브러리를 jar 파일로 패키징하지 않으므로 jar 파일을 독립 실행 형 응용 프로그램으로 실행할 수 없습니다. 이 문제를 어떻게 해결합니까?

+0

당신은 Netbenas – SjB

+7

@SjB 같은 받는다는위한 IDE를 사용할 수 있습니다 부여되어 있는지 확인? 나는 그렇게 생각하지 않는다. –

+1

정확한 복제본은 정확히? –

답변

105

가장 쉬운 방법은 maven-assembly-plugin과 미리 정의 된 jar-with-dependencies 설명자를 사용하여 어셈블리를 만드는 것입니다. 또한이 uber jar에 대한 메인 클래스 항목이있는 매니페스트를 생성해야합니다. 아래의 코드 조각은 이렇게 조립 플러그인을 구성하는 방법을 보여줍니다 :

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
     <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <archive> 
      <manifest> 
      <mainClass>fully.qualified.MainClass</mainClass> 
      </manifest> 
     </archive> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 

을 그리고, 어셈블리를 생성하기 위해, 단지 실행

mvn assembly:assembly 

당신이 빌드의 일부로 어셈블리를 생성하려면

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
     <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <archive> 
      <manifest> 
      <mainClass>fully.qualified.MainClass</mainClass> 
      </manifest> 
     </archive> 
     </configuration> 
     <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
      <goal>single</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

을 간단하게 실행 : 단순히 패키지 상에 assembly:single 모조 결합

내가 요아킴 사우어에 동의 0
mvn package 
+1

maven-shade-plugin도 이와 비슷하게 작동하며이 용도로만 사용됩니다. –

+4

봄과 클래스 경로에서 같은 이름의 여러 리소스를 필요로하는 다른 라이브러리에서는 작동하지 않습니다. 스프링의 경우 META-INF \ spring.schemas는 여러 jar (beans, jdbc 등)에 포함되어 있으며 XML 파서에 대한 XML 네임 스페이스 지원을 구성하는 데 사용됩니다. 'jar-with-dependencies'를 시도하면 application-context.xml을 실행하면 런타임에 "org.xml.sax.SAXParseException : cvc-elt.1 : Bean '요소의 선언을 찾을 수 없습니다."와 같은 오류가 발생합니다. –

+0

@David Maven은 Java "제한 사항"을 해결하지 않습니다. 이 경우 응용 프로그램을 깨끗하게 정리하면됩니다 (즉, uberjar가 아닌 경우). –

25

Maven은 Java 프로그램에서 일반적으로 그렇게하지 않으므로 jar 파일 내부에 종속성을 패키징하지 않습니다.

대신 jar 파일과 함께 종속성을 제공하고 the Class-Path header of the Manifest에 언급하십시오.

이 경로를 진행하려면 maven-jar-pluginaddClasspath 속성 (문서 번호 : here)을 사용 설정해야합니다.

jar 파일에 모든 종속성을 포함 시키려면 Maven 어셈블리 플러그인을 사용하여 jar-with-dependencies을 생성 할 수 있습니다.

+4

+1 Java 프로그램을 빌드하는 방법에 대한 정보를 찾는 데 어려움을 겪었습니다. 특히 Maven과 함께 배포됩니다. –

6

,

대신 당신이 당신의 pom.xml에서 그런 항아리 플러그인 구성해야합니다 항아리-와 의존성을 사용

:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.4</version> 
    <configuration> 
     <archive> 
      <index>true</index> 
      <manifest> 
       <addClasspath>true</addClasspath> 
       <mainClass>[mainClassFullName]</mainClass> 
      </manifest> 
      <manifestEntries> 
       <mode>development</mode> 
       <url>${project.url}</url> 
       <key>value</key> 
      </manifestEntries> 
     </archive> 
    </configuration> 
</plugin> 

를 그리고이 조립 구성을 사용 jar 종속성을 어셈블리에 추가하십시오.

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 
    <id>zip-with-jars</id> 
    <formats> 
    <format>zip</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySets> 
    <dependencySet> 
    <outputDirectory>/</outputDirectory> 
    <useProjectArtifact>true</useProjectArtifact> 
    <unpack>false</unpack> 
    <scope>runtime</scope> 
    </dependencySet> 
</dependencySets> 
    </dependencySets> 
</assembly> 
8

이것은 작은 프로젝트에서 수행 할 작업입니다. 대부분의 경우에는 거대한 항아리 하나가 필요하지 않습니다.

구축 : MVN 깨끗한 의존성 : 복사 - 종속 패키지

은 (목표 DIR에 )을 실행 ./ 의존성/* com.something : -cp myjar.jar 자바 .MyClass

+0

+1 no-configuration no-pom-modification 솔루션입니다. –

+0

좋아요! 이 파일을 pom.xml과 같은 디렉토리에있는 Makefile에 저장했습니다. 빌드 : \ n mvn .... (당신이 말한) – Roboprog

+0

고마워. 이 2 시간 이상 인터넷을 검색 한 결과 매우 유용한 대답을 찾았습니다 .... – Shekhar

2

pom.xml에 다음 코드를 추가하고 다음 이름으로 실행 : maven : install.jar 파일은 "java -jar Hello.jar"로 사용할 수있는 eclipse의 대상 폴더에 생성됩니다. 그 마술 문제를 해결 :하지만 메인 클래스의 이름이

<build> 
<plugins> 
<plugin> 
<groupid>org.apache.maven.plugins</groupid> 
<artifactid>maven-shade-plugin</artifactid> 
<executions> 
<execution> 
<phase>package</phase> 
<goals> 
<goal>shade</goal> 
</goals> 
<configuration> 
<finalname>HelloW</finalname> 
<transformers> 
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
<manifestentries> 
<main-class>com.abc.HelloWorld.java</main-class> 
<build-number>1</build-number> 
</manifestentries> 
</transformer> 
</transformers> 
</configuration> 
</execution> 
</executions> 
</plugin> 
</plugins> 

</build> 
com.abc.HelloWorld.java

관련 문제