使用IntelliJ Idea,我想实现以下内容:
我想将应用程序导出到包含所有所需库的jar中。例如,我需要AWS Java SDK库才能进行S3访问,但如果我将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相比理念:~ 5,5 MB)!
我通过Maven包含了这些库,并将它们下载到了项目的“lib”文件夹中:
作为运行配置中的参数,我设置了“package”,请参见下面的屏幕截图:
解决方案:
谢谢你们的提示,我现在可以使用了!诀窍在于我没有将依赖项添加到pom.xml文件中(因为我以为在项目结构中设置依赖项后,这会自动完成,但实际上没有)!!!另请参阅我的另一个问题:Intellij IDEA Maven Plugin - Manage Dependencies和https://www.jetbrains.com/idea/help/maven.html!添加依赖项
1.打开pom.xml
1.菜单“代码”〉“生成”〉“依赖关系”(或快捷键ALT + INSERT)
4条答案
按热度按时间smdnsysy1#
您需要使用Maven程序集插件来包含依赖项:
然后:
mvn clean compile assembly:single
kmb7vmvb2#
我建议你使用
shade
插件,它比Assembly
好,因为如果发生冲突,它可以relocate classes。典型设置如下所示:(复制自official documentation)
如果大小很重要,您可以尝试使用
<minimizeJar>true</minimizeJar>
来减小大小。ekqde3dh3#
在按照Hector的建议添加了maven汇编插件之后,他提到要运行
mvn clean compile assembly:single
,我不知道在Intellij中的哪里运行这个命令。这就是我最终所做的,并成功地创建了我的
xxx-SNAPSHOT-jar-with-dependencies.jar
文件。这将在Maven工具窗口中创建一个新的运行配置。在那里,双击最近创建的 [compile]。
您将看到在目标目录下创建的jar。附上我的IntelliJ的屏幕截图以供参考。x1c 0d1x
hmtdttj44#
对于maven汇编插件编译问题,如果您添加
<executions>
块,则会自动创建SNAPSHOT-jar-with-dependencies.jar,因此您不需要修改maven编译命令。请参见https://medium.com/@randilfernando/when-to-use-maven-jar-maven-assembly-or-maven-shade-ffc3f76ba7a6#:~:text= maven %2D汇编%2D插件%20%3A%20这是Java%20class%20name%20conflict%20问题。