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

mnemlml8  于 2022-12-17  发布在  Maven
关注(0)|答案(4)|浏览(217)

使用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 Dependencieshttps://www.jetbrains.com/idea/help/maven.html!添加依赖项
1.打开pom.xml
1.菜单“代码”〉“生成”〉“依赖关系”(或快捷键ALT + INSERT)

smdnsysy

smdnsysy1#

您需要使用Maven程序集插件来包含依赖项:

<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

kmb7vmvb

kmb7vmvb2#

我建议你使用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>

如果大小很重要,您可以尝试使用<minimizeJar>true</minimizeJar>来减小大小。

ekqde3dh

ekqde3dh3#

在按照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的屏幕截图以供参考。x1c 0d1x

hmtdttj4

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问题。

<plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
            <archive>
                <manifest>
                    <mainClass>com.xxx.Main</mainClass>
                </manifest>
            </archive>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
        </configuration>
        <executions>
            <execution>
                <id>make-assembly</id>
                <!-- bind to the packaging phase -->
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

相关问题