运行jar时ClassNotFoundException但直接运行app时没有

时间:2018-04-03 12:21:38

标签: java jar

我的应用在尝试访问外部依赖项时面临Uninstall for All users,但仅在作为jar运行时才会面临。

使用Intellij,我有一个带有主类的简单应用程序,可以调用外部依赖项,例如slf4j。

NoClassDefFoundError

}

public class Main { private static final Logger logger = LoggerFactory.getLogger(Main.class); /// public static void main(String[] args) { logger.debug("start"); } 包含相关的依赖项,并且应用程序已成功编译。

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

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

pom.xml

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

 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

清单文件位于src / main / resources / META-INF / MANIFEST.MF中:

    <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>

2 个答案:

答案 0 :(得分:1)

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

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

java -jar example.jar

答案 1 :(得分:1)

理解起来很简单。您正在创建的jar只包含代码的.class个文件,而不包含您要导入的其他库。因此,当您运行代码时,它无法找到您在代码中引用的外部库(在这种情况下为org.slf4j)。

我不知道您正在使用的maven jar插件,但请尝试使用maven程序集插件。此插件用于捆绑您使用的所有其他库以及代码,并创建一个&#34;捆绑的&#34;罐。将以下内容添加到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>

这另外绑定了这个&#34;组装&#34;迈向package阶段的目标。所以mvn package应该创建你的jar。