Maven 2로 실행 가능한 jar 빌드


82

나는 Maven 만트라에 비교적 익숙하지 않지만 Maven을 사용하여 명령 줄 실행 가능한 jar를 빌드하려고합니다. 종속성을 설정했지만 mvn install항아리를 실행하고 실행하려고하면 두 가지 일이 발생합니다. 첫째, 수정 가능한 메인 클래스가 없습니다. 이 문제를 수정하면 실행시 클래스를 찾을 수 없다는 오류가 발생합니다.

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


Netbenas 같은 받는다는 위해 당신은 IDE를 사용할 수
사 야드 Bahmani

7
@SjB : 그게 마법처럼 문제를 해결하나요? 나는 그렇게 생각하지 않는다.
Joachim Sauer

1
정확히 무엇을 복제합니까?
Stefan Kendall

어쩌면이 하나 stackoverflow.com/questions/1832853/... , 또는이 하나 stackoverflow.com/questions/574594/... (하지만 허용 대답은 잘못된 것입니다), 또는이 하나 stackoverflow.com/questions/1814526/... . 사실, 이것은 maven에서 가장 자주 묻는 질문 중 하나 인 것 같습니다 ...
Pascal Thivent

1
다른 답변은 깨끗하지 않으며 uber jar (ueber 철자가 잘못됨)는 실행 가능성을 언급하지 않습니다. 또한 다른 주제는 소스 수준 등과 같은 관련없는 자료로 가득 차 있습니다.
Stefan Kendall

답변:


113

이를 수행하는 가장 쉬운 방법은 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

빌드의 일부로 어셈블리를 생성하려면 assembly:singlemojo를 패키지 단계에 바인딩하면 됩니다.

<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>

그리고 간단히 실행하십시오.

mvn package

1
maven-shade-plugin도 유사하게 작동하며이 목적에 전념합니다.
Dominic Mitchell

4
이것은 spring 및 클래스 경로에서 동일한 이름을 가진 여러 리소스를 기대하는 다른 라이브러리에서는 작동하지 않습니다. Spring의 경우 META-INF \ spring.schemas는 여러 jar (beans, jdbc 등)에 포함되며 XML 파서에 대한 XML 네임 스페이스 지원을 구성하는 데 사용됩니다. 'jar-with-dependencies'를 시도하면 "org.xml.sax.SAXParseException : cvc-elt.1 : 'beans'요소의 선언을 찾을 수 없습니다."와 같이 런타임시 application-context.xml 패싱이 실패합니다.
David Roussel

@David Maven은 Java "제한"을 해결하지 않습니다. 이 경우 애플리케이션을 깔끔하게 (즉, uberjar가 아닌) 패키지화하십시오.
Pascal Thivent

이것은 아무런 문제없이 Spring 구성으로 작동합니다. 내 메인 클래스는 Classpath Application 컨텍스트를 사용하여 다른 모든 클래스를로드하며이 솔루션은 완벽하게 작동합니다.
vsingh 2010

2
assembly:assembly목표는되어 사용되지 않는
자레드 벡

25

Maven은 일반적으로 Java 프로그램에서 수행하지 않기 때문에 jar 파일 내에 종속성을 패키징하지 않습니다.

대신 당신은 당신의 jar 파일과 함께 종속성을 제공하고 그들을 언급 매니페스트의 헤더 .Class-Path

이 경로로 이동하려면 .NET Framework에 대한 addClasspath속성 ( 여기에 문서화 됨 ) 을 활성화해야 합니다 maven-jar-plugin.

jar 파일에 모든 종속성을 정말로 포함하려면 Maven Assembly 플러그인을 사용하여 jar-with-dependencies.


4
+1 특히 Maven을 사용 하여 Java 프로그램이 일반적으로 빌드되고 배포 되는 방식에 대한 정보를 찾는 데 어려움을 겪었습니다 .
Ed Brannin 2012

8

이것이 제가 작은 프로젝트를 위해 할 일입니다. 대부분의 경우 당신은 하나의 큰 병을 원하지 않습니다.

빌드하려면 : mvn clean dependency : copy-dependencies package

실행할 ( 대상 dir ) : java -cp myjar.jar : ./ dependency / * com.something.MyClass


큰! 나는 이것을 pom.xml과 같은 디렉토리의 Makefile에 저장했습니다. 빌드 : \ n mvn .... (당신이 말한 것)
Roboprog

감사. 2 시간 이상 인터넷을 검색 한 후 ....이 매우 유용한 답변을 발견
Shekhar

6

나는 Joachim Sauer와 동의합니다.

jar-with-dependency를 사용하는 대신 pom.xml에서 다음과 같이 jar 플러그인을 구성해야합니다.

<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>

2

pom.xml에 아래 코드를 추가하고 다음으로 실행 : maven : install. jar는 "java -jar Hello.jar"로 사용할 수있는 eclipse의 대상 폴더에 생성됩니다. 그러나 주 클래스의 이름이 com.abc.HelloWorld.java로 지정되었는지 확인하십시오.

<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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.