我在独立应用程序中使用Maven,并且我想将我的JAR文件中的所有依赖项打包到库文件夹中,如下面的答案中所述:
How can I create an executable JAR with dependencies using Maven?
我希望我的最终JAR文件有一个库文件夹,其中包含作为JAR文件的依赖项,而不是将依赖项放在.m2文件夹中的Maven层次结构等文件夹形式的maven-shade-plugin
。
嗯,实际上当前的配置是我想要的,但我在运行应用程序时遇到加载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
:< / p>
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.
如何修复此异常?
答案 0 :(得分:73)
以下是我的解决方案。测试它是否适合您:
<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文件。
或者,为了避免自定义类加载,您可以使用&#34; $ {project.build.directory} / lib,但在这种情况下,您不会在最终的JAR文件中包含依赖项,从而导致失败目的
问题问题已经过去两年了。尽管如此,嵌套JAR文件的问题仍然存在。我希望它有所帮助。
答案 1 :(得分:27)
更新:
<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>
答案 2 :(得分:23)
最简单,最有效的方法是使用这样的超级插件:
<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文件中对所有内容进行反规范化。
答案 3 :(得分:12)
executable packer maven plugin可用于此目的:创建包含所有依赖项的独立Java应用程序作为特定文件夹中的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>
运行target/<YourProjectAndVersion>-pkg.jar
后,构建的JAR文件位于mvn package
。它的所有编译时和运行时依赖项都将包含在JAR文件中的lib/
文件夹中。
免责声明:我是该插件的作者。
答案 4 :(得分:6)
点击此链接:
How To: Eclipse Maven install build jar with dependencies
我发现这不是可行的解决方案,因为类加载器不会从jar中加载jar,所以我认为我将解压缩jar中的依赖项。
答案 5 :(得分:3)
以下是我的表现:
<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
答案 6 :(得分:2)
我找到了这个问题的答案:
http://padcom13.blogspot.co.uk/2011/10/creating-standalone-applications-with.html
您不仅可以在lib文件夹中获取依赖的lib文件,还可以获得包含unix和dos可执行文件的bin控制器。
可执行文件最终使用-cp参数调用java,该参数列出了所有依赖库。
整批位于目标文件夹内的appasembly文件夹中。史诗。
============= 是的我知道这是一个老线程,但它在搜索结果中仍然很高,所以我认为这可能会对像我这样的人有所帮助。
答案 7 :(得分:1)
这显然是类路径问题。考虑到在IDE外部运行程序时类路径必须稍微改变一下。这是因为IDE相对于项目的根文件夹加载其他JAR,而在最终JAR的情况下,这通常不是真的。
在这些情况下我喜欢做的是手动构建JAR。它花了我最多5分钟,它总能解决问题。我不建议你这样做。找到一种使用Maven的方法,这就是它的目的。