使用IntelliJ Idea,我想实现以下内容:
我想将应用程序导出到jar,其中包含所有需要的库。例如。我需要用于S3访问的AWS Java SDK库,但是如果我将jar上传到服务器并运行jar我得到NoClassDefFoundError,请参阅下文:
Exception in thread "main" java.lang.NoClassDefFoundError: com/amazonaws/auth/AWSCredentials
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2625)
at java.lang.Class.getMethod0(Class.java:2866)
at java.lang.Class.getMethod(Class.java:1676)
at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: com.amazonaws.auth.AWSCredentials
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 6 more
比较:我在Eclipse中创建了相同的项目并且没有错误! jar文件大小非常不同(Eclipse:~35 MB对比IntelliJ Idea:~5,5 MB)!
我通过Maven包含了这些库,并将它们也下载到我项目的“lib”文件夹中:
SOLUTION:
感谢您的所有提示,我现在就开始工作了!诀窍是我没有将依赖项添加到pom.xml文件中(因为我认为这将在项目结构中设置后自动完成,但它没有)!另请参阅我的其他问题:Intellij IDEA Maven Plugin - Manage Dependencies和https://www.jetbrains.com/idea/help/maven.html!通过
添加依赖项答案 0 :(得分:8)
您需要使用Maven Assembly Plugin来包含依赖项:
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>your.package.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
然后:mvn clean compile assembly:single
答案 1 :(得分:1)
我建议您使用插件shade
。它优于Assembly
,因为如果发生冲突,relocate classes可能会发生。{/ p>
典型设置可能如下所示:(从official documentation复制)
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<excludes>
<exclude>classworlds:classworlds</exclude>
<exclude>junit:junit</exclude>
<exclude>jmock:*</exclude>
<exclude>*:xml-apis</exclude>
<exclude>org.apache.maven:lib:tests</exclude>
<exclude>log4j:log4j:jar:</exclude>
</excludes>
</artifactSet>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
如果尺寸很重要,您可以尝试使用<minimizeJar>true</minimizeJar>
来缩小尺寸。
答案 2 :(得分:0)
按照 Hector 的建议添加 maven assembly 插件后,他提到运行 mvn clean compile assembly:single
。我不知道在 Intellij 中在哪里运行这个命令。
这就是我最终所做的并成功创建了我的 xxx-SNAPSHOT-jar-with-dependencies.jar
文件。
View -> Tool Windows -> Maven ->
这会在 Maven 工具窗口中创建一个新的运行配置。在那里,双击最近创建的[compile]。
您将看到在目标目录下创建了 jar。附上我的 IntelliJ 的屏幕截图以供参考。