독립 실행 형 응용 프로그램에서 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 폴더에 있습니다. 서사시.
============= 예 저는 이것이 오래된 스레드라는 것을 알고 있지만 여전히 검색 결과가 높아지고 있으므로 저 같은 사람에게 도움이 될 것이라고 생각했습니다.
