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