gpt4 book ai didi

java - 运行 jar 时出现 ClassNotFoundException,但直接运行应用程序时不会出现 ClassNotFoundException

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

我的应用在尝试访问外部依赖项时遇到 NoClassDefFoundError,但仅限于作为 jar 运行时。

使用 Intellij,我有一个带有主类的简单应用程序,其中包含一些对外部依赖项(例如 slf4j)的调用。

public class Main {
private static final Logger logger = LoggerFactory.getLogger(Main.class);
///
public static void main(String[] args) {
logger.debug("start");
}

}

pom.xml包含相关依赖项,应用程序已成功编译。

当从 intellij 作为常规应用程序运行该应用程序时,它运行没有问题。

但是当用它创建可执行 jar 并尝试运行它时,它崩溃并且找不到外部依赖项:

 java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at com.example.Main.<clinit>(Main.java:18)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
Exception in thread "main"
Process finished with exit code 1

我将其添加到 pom 中尝试解决问题,但没有帮助:

    <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<!-- Build an executable JAR -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.example.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>

list 文件位于 src/main/resources/META-INF/MANIFEST.MF:

Manifest-Version: 1.0
Main-Class: com.example.Main

最佳答案

很容易理解。您正在创建的 jar 仅包含 .class您的代码的文件,而不是您正在导入的其他库的文件。因此,当您运行代码时,它无法找到您在代码中引用的外部库(在本例中为 org.slf4j)。

我不知道您正在使用的 maven jar 插件,但请尝试使用 maven assembly 插件。该插件用于捆绑您与代码一起使用的所有其他库,并创建一个“捆绑”jar。将以下内容添加到您的 pom.xml 。您可以将此部分添加到 <plugins> 之间和</plugins> .

<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>example</id>
<configuration>
<archive>
<manifest>
<mainClass>com.example.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>

这还将此“组装”目标绑定(bind)到 package Maven 阶段。所以mvn package应该创建你的 jar。

关于java - 运行 jar 时出现 ClassNotFoundException,但直接运行应用程序时不会出现 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49629989/

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