Java使用Maven依赖出现ClassNotFoundException问题

47

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

我将涉及的jar包添加到了pom.xml文件中,并使用以下声明:

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

在Eclipse中,这将相关的JAR文件添加到我的Maven依赖项文件夹中。我可以在代码中访问类,但运行应用程序时出现了上述异常。

该jar文件已在我的Java build path下的Maven依赖项中引用:

Java build path

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

screenshot

当我尝试运行应用程序时,我会得到以下两个异常:

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

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

有谁能指点我一下方向吗?

5个回答

37

provided 改为 compile

Compile

provided 类似,但表示您希望JDK或容器在运行时提供依赖项。例如,在构建Java Enterprise Edition的Web应用程序时,将Servlet API和相关的Java EE API的依赖关系设置为范围为 compile ,因为Web容器提供这些类。此范围仅适用于编译和测试类路径,不是传递性的。


1
非常感谢,这确实起作用了。我直接从他们的网站上抄袭了那个声明,并没有多想;我不知道为什么他们会这样声明。 - Vex

10
<scope>provided</scope>

"Provided" 依赖范围意味着这些依赖项仅在编译时可用,并且在运行时它们将可在其他地方使用,Maven 不应将它们与当前应用程序的其余 jar 和类一起打包。

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


1
我遇到了同样的问题,但我的POM中没有定义<javax.servlet-api>标签。这个问题一直很好地工作,直到有一天在本地机器上突然出现了这个错误,虽然依赖项在POM中正确设置,并且jar包也存在于本地的maven存储库中。
我尝试过清理项目和更新maven项目,但是什么都没有用,其他帖子中提供的解决方法也都无法解决我的问题。
最后,我通过转到服务器选项卡->右键单击Tomcat v8.0->浏览部署位置来解决了它。
这应该会引导您进入一个类似于 metadata.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps 的临时文件夹
然后你浏览到你的项目文件夹 -> WEB-INF -> lib -> 这里我发现造成错误的库中的jar文件缺失,所以我只是从.m2\repository复制了这个文件。
重新启动服务器,它就像往常一样开始工作了。
我希望这对于遇到相同问题的人有所帮助。

0

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


0

我之前也遇到了同样的问题,在尝试各种解决方案后,按照以下步骤解决了该问题...

  1. 点击服务器 >打开启动配置 >参数 (复制 "本地路径\temp0\wtpwebapps" 路径)。

  2. 进入 "本地路径\temp0\wtpwebapps\项目名称\WEB-INF\lib"。

  3. 从 .m2 中复制 JAR 文件 (导致 ClassNotFoundException 的文件),并将其放在 "本地路径\temp0\wtpwebapps\项目名称\WEB-INF\lib" 路径中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接