Intellij Maven:创建包含所有库依赖项的jar

时间:2015-12-03 16:01:23

标签: java intellij-idea maven-plugin

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

enter image description here

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

SOLUTION:

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

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

3 个答案:

答案 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 -> -> Lifecycle -> 右键单击​​ compile -> Modify Run Configuration -> 使用 'compile assembly:single -f pom.xml' 更新命令行-> 好的

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

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