Java 运行jar时发生ClassNotFoundException,但直接运行应用程序时发生ClassNotFoundException

Java 运行jar时发生ClassNotFoundException,但直接运行应用程序时发生ClassNotFoundException,java,jar,Java,Jar,我的应用程序在尝试访问外部依赖项时遇到NoClassDefFoundError,但仅在作为jar运行时 使用Intellij,我有一个简单的应用程序,其中包含一些对外部依赖项的调用,如slf4j public class Main { private static final Logger logger = LoggerFactory.getLogger(Main.class); /// public static void main(String[] args) {

我的应用程序在尝试访问外部依赖项时遇到
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

您的meta inf应该具有以下属性 清单版本:1.0
创建人:xxxx
主类:com.sample.Main
ClassPath:path/to/jars/your.jar

java-cp yourpath/example.jar com.sample.Main


java-jarexample.jar

您的meta-inf应该具有以下属性 清单版本:1.0
创建人:xxxx
主类:com.sample.Main
ClassPath:path/to/jars/your.jar

java-cp yourpath/example.jar com.sample.Main


java-jarexample.jar

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

我不知道你正在使用的maven jar插件,但是试试maven汇编插件。这个插件用于将您与代码一起使用的所有其他库捆绑起来,并创建一个“捆绑”jar。将以下内容添加到您的
pom.xml
。您可以在
之间添加此部分


maven汇编插件
例子
com.example.Main
带有依赖项的jar
假的
包裹
单一的

这还将此“组装”目标绑定到maven的
阶段。因此,mvn包应该创建您的jar。

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

我不知道你正在使用的maven jar插件,但是试试maven汇编插件。这个插件用于将您与代码一起使用的所有其他库捆绑起来,并创建一个“捆绑”jar。将以下内容添加到您的
pom.xml
。您可以在
之间添加此部分


maven汇编插件
例子
com.example.Main
带有依赖项的jar
假的
包裹
单一的

这还将此“组装”目标绑定到maven的
阶段。因此,
mvn包
应该创建您的jar。

jar中可能不包含依赖项。在IDE之外运行jar时,您应该在构建路径中添加slf4j jar,IDE将自动管理构建路径并在pom.xml中添加依赖项声明@jar中可能不包含RIO依赖项。在IDE之外运行jar时,您应该在构建路径中添加slf4j jar,IDE将自动管理构建路径并在pom.xml中添加依赖项声明@里奥里奥
    <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>
Manifest-Version: 1.0
Main-Class: com.example.Main
<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>