Maven:java.lang.NoClassDefFoundErrorexception,但是jars在.m2中下载

时间:2018-10-29 19:23:42

标签: java linux maven tomcat

我有一个tomcat项目:tomcat/webapps/Project。该项目使用org.json库,相关性写在pom.xml文件中:

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20180813</version>
</dependency>

我已经在maven目录中的服务器上安装了Project并运行此命令: mvn install

然后我检查了/root/.m2/repository/org/json/20180813文件夹,并且文件json-20180813.jar在那里!

但是,当我重新启动服务器:shutdown.sh并尝试使用我的应用程序时,错误仍然存​​在:

javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/json/JSONObject

为什么会发生这种情况以及如何解决?

编辑:人们指出将jar复制到tomcat/lib目录。我做到了,它奏效了。但是,我也希望有一个更永久的解决方案,这样以后就不会再被其他罐子强迫这样做了。

2 个答案:

答案 0 :(得分:1)

如果将.jar文件放入tomcat文件夹lib,它将像超级按钮一样工作!

答案 1 :(得分:1)

命令mvn install将编译您的项目库并将其安装到本地存储库。此外,它还将在该.m2/repository目录下下载并复制所有依赖项。有关mvn install的更多详细说明,请参见this question

但是,它与Tomcat无关或与将应用程序部署到Tomcat实例无关。它将不会直接使任何库可用于Tomcat。

要使Tomcat使用任何库,至少有以下两个选项:

  1. 您可以将它们作为依赖项添加到war打包项目中。因此,如果您已经部署了WAR,但Tomcat似乎仍然找不到该库,那么您的pom.xml中可能会有问题。

  2. 按照其他答案的建议,您可以手动将依赖项复制到tomcat/lib目录中,并在POM <scope>provided</scope>中创建依赖项,以防止将其打包到WAR中。

如果您不希望通过网络进行整体开发,则每5分钟就要部署一次整体(例如100MB),则后一种选择可能比较明智。