[java] Maven을 사용하여 최종 JAR 파일 내의 라이브러리 폴더에 필요한 모든 JAR 파일을 어떻게 넣습니까?

독립 실행 형 응용 프로그램에서 Maven을 사용하고 있으며 여기 답변 중 하나에서 언급했듯이 JAR 파일의 모든 종속성을 라이브러리 폴더 안에 패키징하고 싶습니다.

Maven을 사용하여 종속성이있는 실행 가능한 JAR을 어떻게 만들 수 있습니까?

최종 JAR 파일에 maven-shade-plugin.m2 폴더의 Maven 계층과 같은 폴더 형태로 종속성을 넣는 것과는 달리 JAR 파일로 종속성을 포함하는 라이브러리 폴더가 있어야 합니다.

글쎄, 실제로 현재 구성은 내가 원하는 것을 수행하지만 응용 프로그램을 실행할 때 JAR 파일을로드하는 데 문제가 있습니다. 수업을로드 할 수 없습니다.

내 구성은 다음과 같습니다.

<plugins>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
            <execution>
                <id>copy-dependencies</id>
                <phase>prepare-package</phase>
                <goals>
                    <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                    <outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
                    <overWriteReleases>false</overWriteReleases>
                    <overWriteSnapshots>false</overWriteSnapshots>
                    <overWriteIfNewer>true</overWriteIfNewer>
                </configuration>
            </execution>
        </executions>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
            <archive>
                <manifest>
                    <addClasspath>true</addClasspath>
                    <classpathPrefix>lib/</classpathPrefix>
                    <mainClass>com.myapp.MainClass</mainClass>
                </manifest>
            </archive>
        </configuration>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.6</source>
            <target>1.6</target>
        </configuration>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
            <execution>
                <id>install</id>
                <phase>install</phase>
                <goals>
                    <goal>sources</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.5</version>
        <configuration>
            <encoding>UTF-8</encoding>
        </configuration>
    </plugin>

</plugins>

프로젝트는 Eclipse에서 잘 실행되고 JAR 파일은 원하는대로 최종 JAR 파일 내의 라이브러리 폴더에 저장되지만 대상 폴더에서 최종 JAR 파일을 실행하면 항상 다음을 얻습니다 ClassNotFoundException.

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: com.myapp.MainClass. Program will exit.

이 예외를 어떻게 수정할 수 있습니까?



답변

다음은 내 솔루션입니다. 그것이 당신을 위해 작동하는지 테스트하십시오.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
                <overWriteReleases>false</overWriteReleases>
                <overWriteSnapshots>false</overWriteSnapshots>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <!-- <classpathPrefix>lib</classpathPrefix> -->
                <!-- <mainClass>test.org.Cliente</mainClass> -->
            </manifest>
            <manifestEntries>
                <Class-Path>lib/</Class-Path>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>

첫 번째 플러그인은 모든 종속성을 target / classes / lib 폴더에 넣고 두 번째 플러그인은 최종 JAR 파일에 라이브러리 폴더를 포함하고 파일을 구성 Manifest.mf합니다.

하지만 JAR 파일을로드하려면 사용자 정의 클래스 로딩 코드를 추가해야합니다.

또는 사용자 정의 클래스 로딩을 방지하기 위해 “$ {project.build.directory} / lib를 사용할 수 있지만이 경우 최종 JAR 파일 내에 종속성이 없어 목적에 맞지 않습니다.

질문을받은 지 2 년이 지났습니다. 그럼에도 불구하고 중첩 된 JAR 파일의 문제는 지속됩니다. 누군가에게 도움이되기를 바랍니다.


답변

업데이트 :

<build>
  <plugins>
    <plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
      <execution>
        <phase>install</phase>
          <goals>
            <goal>copy-dependencies</goal>
          </goals>
          <configuration>
             <outputDirectory>${project.build.directory}/lib</outputDirectory>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build> 


답변

가장 간단하고 효율적인 방법은 다음과 같은 uber 플러그인을 사용하는 것입니다.

          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <finalName>uber-${artifactId}-${version}</finalName>
            </configuration>
        </plugin>

하나의 JAR 파일에서 모두 비정규 화됩니다.


답변

실행 포장 받는다는 플러그인은 정확히 그 목적을 위해 사용할 수 있습니다 특정 폴더에 JAR 파일로 모든 종속성을 포함하는 독립형 자바 응용 프로그램을 만드는.

섹션 pom.xml내부에 다음을 추가하기 만하면됩니다 <build><plugins>( mainClass그에 따라 값을 바꾸십시오 ).

<plugin>
    <groupId>de.ntcomputer</groupId>
    <artifactId>executable-packer-maven-plugin</artifactId>
    <version>1.0.1</version>
    <configuration>
        <mainClass>com.example.MyMainClass</mainClass>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>pack-executable-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

내장 된 JAR 파일은 다음 위치에 target/<YourProjectAndVersion>-pkg.jar당신이 실행 한 후 mvn package. 모든 컴파일 시간 및 런타임 종속성은 lib/JAR 파일 내의 폴더에 포함 됩니다.

면책 조항 : 나는 플러그인의 작성자입니다.


답변

이 링크를 따라 :

방법 : Eclipse Maven에서 종속성이있는 빌드 jar 설치

클래스 로더가 항아리 내에서 항아리를로드하지 않기 때문에 이것이 실행 가능한 솔루션이 아니라는 것을 알았으므로 항아리 내부의 종속성을 풀 것이라고 생각합니다.


답변

방법은 다음과 같습니다.

    <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>com.project.MainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

그런 다음 실행합니다.

mvn assembly:assembly


답변

질문에 대한 답을 찾았습니다.

http://padcom13.blogspot.co.uk/2011/10/creating-standalone-applications-with.html

lib 폴더에 종속 lib 파일을 가져올뿐만 아니라 unix 및 dos 실행 파일이 모두 포함 된 bin 디렉터도 제공됩니다.

실행 파일은 궁극적으로 모든 종속 라이브러리를 나열하는 -cp 인수로 java를 호출합니다.

전체 부지는 대상 폴더 내의 appasembly 폴더에 있습니다. 서사시.

============= 예 저는 이것이 오래된 스레드라는 것을 알고 있지만 여전히 검색 결과가 높아지고 있으므로 저 같은 사람에게 도움이 될 것이라고 생각했습니다.