gpt4 book ai didi

java-maven-idea : including external library in jar

转载 作者:行者123 更新时间:2023-12-05 07:02:36 25 4
gpt4 key购买 nike

我正在制作电报机器人,我需要 .jar 将其部署到云端。
我正在使用 intellij idea 中的 maven 构建它,但是当尝试在我的机器上执行时它会抛出这个:

Exception in thread "main" java.lang.NoClassDefFoundError: org/telegram/telegrambots/bots/TelegramLongPollingBot<br>

据我所知,发生这种情况是因为 Maven 没有将此库打包到 .jar 中。
我该怎么做?

最佳答案

粗略地说,你有两个选择

  1. 制作一个包含所有必需类的“胖”JAR
  2. 制作一个引用其他 JAR 文件的“瘦”JAR

什么最适合您的情况只有您才能决定。方法如下:

制作一个包含所有必需类的“胖”JAR

要遵循这种方法,您可以使用 Maven Shade Plugin .在打包阶段,您将调用它的 shade goal .这会将依赖项中的类以及应用程序类一起复制到一个 JAR 文件中。在 POM 中它可能看起来像这样:

<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<finalName>my-packaged-application</finalName>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.mycompany.MyApplication</mainClass>
</transformer>
</transformers>
<filters>
<filter>
<!--
Shading signed JARs will fail without this.
http://stackoverflow.com/questions/999489/invalid-signature-file-when-attempting-to-run-a-jar
-->
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>

这种方法的优点是您的应用程序被打包为一个文件。缺点是比较大。即使您只为新版本更改几行代码,整个文件也会有所不同。

制作一个引用其他 JAR 文件的“瘦”JAR

在这种方法中,JAR 只包含您的应用程序类。它的 list 文件引用类路径,但您还需要为依赖项提供 JAR 文件。要收集这些,请使用 Maven Dependency Plugin ,更具体地说 copy-dependencies goal .您可以这样配置它:

<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/libs</outputDirectory>
<stripVersion>true</stripVersion>
</configuration>
</execution>
</executions>

现在您在 target/lib 中拥有所有依赖 JAR 文件,最后一件事是确保“瘦”JAR 引用这些文件。为此,配置 Maven Jar Plugin :

<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.mycompany.MyApplication</mainClass>
</manifest>
</archive>
</configuration>

在这种方法中,如果您只更改几行应用程序代码,则只会替换应用程序 JAR - 依赖项 JAR 保持不变。不利的一面是,它要求您分发的不是一个文件,而是一个目录结构:应用程序 JAR 文件以及包含其内容的 lib/ 文件夹。

关于java-maven-idea : including external library in jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63522466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com