Java ClassNotFoundException with maven dependency

当我尝试使用 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 文件夹中。我可以在代码中访问类,但是一旦运行应用程序,我就会得到提到的异常。

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

Java build path

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

screenshot

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

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

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

任何人都可以为我指出正确的方向吗?


答案 1

更改为providedcompile

提供

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


答案 2
<scope>provided</scope>

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

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


推荐