[java] Maven 2로 실행 가능한 jar 빌드

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

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



답변

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


답변

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

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

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

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


답변

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

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

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


답변

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


답변

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>


답변