【问题标题】:Intellij Maven: Create jar with all library dependenciesIntellij Maven:创建包含所有库依赖项的 jar
【发布时间】:2015-12-03 16:01:23
【问题描述】:

使用 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”文件夹中:

作为运行配置中的参数,我设置了“包”,见下面的截图:

解决方案:

感谢您的所有提示,我现在可以使用它了!诀窍是我没有将依赖项添加到 pom.xml 文件中(因为我认为在项目结构中设置它们后会自动完成,但没有)!!!另请参阅我的另一个问题:Intellij IDEA Maven Plugin - Manage Dependencieshttps://www.jetbrains.com/idea/help/maven.html!通过

添加依赖项
  1. 打开 pom.xml
  2. 菜单“代码”>“生成”>“依赖项”(或快捷键 ALT + INSERT)

【问题讨论】:

  • 你能显示你的 pom.xml 文件吗?您似乎没有声明依赖关系。
  • 我通过 UI 设置依赖关系,见上面的截图。我添加了我的 pom.xml 的屏幕截图...
  • 实际上依赖项没有包含在您的项目中。请注意,您的 pom.xml 文件中缺少 <dependencies/> 块。您必须手动包含它们。
  • 这里我必须同意@bigdestroyer,你需要将你的依赖项放在pom.xml中。否则 Maven 将不知道它们的任何信息,它们也不会被包含在内。

标签: java intellij-idea maven-plugin


【解决方案1】:

您需要使用 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

【讨论】:

  • 感谢您的快速答复,我会试一试。我应该在哪里输入“mvn clean compile assembly:single”命令?在我有“包”的参数选项卡中?抱歉,我是 Maven 新手...
  • 是的,在“命令行”输入中你必须输入clean compile assembly:single。这些是您要执行的目标clean 构建目录,compile 项目,最后是 assembly 它。
  • 谢谢你的回答,bigdestroyer!但现在我收到另一条错误消息,请参阅我对问题的编辑。
  • 谢谢,你拯救了我的一天 - 我跟随人们要求将这个和那个添加到 pom 文件中,我最终得到了一个便便文件。
  • OK 现在它只是不导出。
【解决方案2】:

我建议您使用插件shade。它比Assembly 更好,因为如果发生冲突,可以relocate classes

典型设置如下所示:(复制自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>

如果大小很重要,您可以尝试使用&lt;minimizeJar&gt;true&lt;/minimizeJar&gt; 来减小大小。

【讨论】:

  • 谢谢,但似乎我得到了与问题编辑中解释的相同的错误......我设置为“清理编译包”的目标 - 这是正确的???跨度>
  • 我没有阅读@bigdestroyer 的评论,但他是正确的,maven 只会包含它处理的依赖项。如果您有任何公开可用的存储库中不存在的 jar,则可以将其添加到本地存储库,或设置存储库(首选)。 mkyong.com/maven/…
  • 我添加了项目的.iml文件,其中列出了依赖项。
【解决方案3】:

按照 Hector 的建议添加 maven 程序集插件后,他提到要运行 mvn clean compile assembly:single。我不知道在 Intellij 中的何处运行此命令。

这就是我最终做的事情并成功创建了我的xxx-SNAPSHOT-jar-with-dependencies.jar 文件。

查看 -> 工具窗口 -> Maven -> -> 生命周期 -> 右键单击​​编译 -> 修改运行配置 -> 使用 'compile assembly:single -f pom.xml' 更新命令行-> 好的

这在 Maven 工具窗口中创建了一个新的运行配置。在那里,双击最近创建的[compile]

您会看到在目标目录下创建了 jar。附上我的 IntelliJ 的屏幕截图以供参考。

【讨论】:

    猜你喜欢
    • 2014-06-08
    • 2014-10-06
    • 2012-04-01
    • 2014-01-08
    • 2023-03-30
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多