具有 maven 依赖项的 Java ClassNotFoundException

Posted

技术标签:

【中文标题】具有 maven 依赖项的 Java ClassNotFoundException【英文标题】:Java ClassNotFoundException with maven dependency 【发布时间】:2012-09-30 10:55:07 【问题描述】:

当我尝试使用 maven 定义的依赖项运行我的应用程序时,我收到了 ClassNotFoundExceptionNoClassDefFoundError 异常。

我将相关 jar 的 maven 依赖项添加到我的 pom.xml 文件中,声明如下:

<dependency>
    <groupId>spy</groupId>
    <artifactId>spymemcached</artifactId>
    <version>2.8.4</version>
    <scope>provided</scope>
</dependency>

这会将相关的 JAR 文件添加到我在 Eclipse 中的 Maven Dependencies 文件夹中。我可以在代码中访问这些类,但是一旦我运行应用程序就会出现上述异常。

在我的 Java 构建路径中引用了 Maven 依赖项下的 jar:

我的本​​地 maven 存储库已添加到我的类路径中:

当我尝试运行应用程序时,出现以下两个异常:

java.lang.NoClassDefFoundError: Lnet/spy/memcached/MemcachedClient;

java.lang.ClassNotFoundException: net.spy.memcached.MemcachedClient

谁能指出我正确的方向?

【问题讨论】:

【参考方案1】:

我也遇到了同样的问题,在尝试了各种解决方案后,通过以下步骤解决了问题...

    单击服务器>打开启动配置>参数(复制 “LocalPath\temp0\wtpwebapps”路径)。

    转到“LocalPath\temp0\wtpwebapps\ProjectName\WEB-INF\lib”。

    从 .m2 复制 JAR(导致 ClassNotFoundException)并将其放置在“LocalPath\temp0\wtpwebapps\ProjectName\WEB-INF\lib”路径中。

【讨论】:

【参考方案2】:

回答与您的问题有些相关,但仍然可以帮助其他人。 在我的情况下,将 &lt;scope&gt;compile&lt;/scope&gt; 添加到依赖项是不够的。我还必须将&lt;packaging&gt;jar&lt;/packaging&gt; 添加到目标模块的 pom 中。

【讨论】:

【参考方案3】:

我遇到了同样的问题,但我没有在我的 POM 上定义标签,它一直工作正常,直到有一天突然开始在我的本地机器上无缘无故地给我这个错误,依赖是在 POM 中正确设置,并且 jar 存在于本地 maven 存储库中。

我尝试清理项目并更新 maven 项目,但没有任何效果,其他帖子中建议的其他解决方案也对我不起作用。

我终于能够通过转到服务器选项卡 -> 右键单击​​ Tomcat v8.0 -> 浏览部署位置来解决它

这应该会引导您进入一个临时文件夹,例如

.metadata.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps

然后你浏览到你的项目文件夹 -> WEB-INF -> lib -> 在这里我发现库中给出错误的 jar 丢失了,所以我只是从 .m2\repository 复制它

重新启动服务器,它又开始像往常一样工作了。

我希望这可以帮助一些面临同样问题的机构。

【讨论】:

【参考方案4】:
<scope>provided</scope>

“已提供”范围意味着依赖项应该仅在编译阶段可用,它们将在运行时在其他地方可用,Maven 不应将它们与当前应用程序的其余 jar 和类一起打包。

您的依赖项似乎不在“提供”范围内。从您的依赖定义中删除该范围,jar 将出现在您打包的 jar/war/ear 中。

【讨论】:

【参考方案5】:

provided 更改为compile

提供

这很像编译,但表示您希望 JDK 或容器在运行时提供依赖项。例如,在为 Java Enterprise Edition 构建 Web 应用程序时,您可以将 Servlet API 和相关 Java EE API 的依赖设置为提供的范围,因为 Web 容器提供了这些类。此范围仅在编译和测试类路径上可用,并且不可传递。

【讨论】:

非常感谢,这确实有效。我从他们的网站上逐字复制了该声明,并没有三思而后行;我不知道他们为什么这样宣布。

以上是关于具有 maven 依赖项的 Java ClassNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章

具有依赖项的 Maven2 + JMeter + JUnit

具有变量的 maven 依赖项的 Ivy/sbt 错误,是不是有修复?

具有依赖项的 Maven 2 程序集:不包括范围“系统”下的 jar

JAVA_HOME 和 Maven 依赖项的奇怪问题

Java / Maven如何使用使用项目中已使用的另一个依赖项的旧版本的依赖项

使用 Maven 依赖项的 Spark 版本不匹配