具有Maven依赖关系系统作用域的ClassNotFoundException

时间:2017-07-28 07:44:01

标签: java maven noclassdeffounderror

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

我使用以下声明将我对相关jar的maven依赖项添加到我的pom.xml文件中:

<dependency>
  <groupId>ldap</groupId>
  <artifactId>com.novell.ldap</artifactId>
  <systemPath>${local.lib.dir}/ldap.jar</systemPath>
  <scope>system</scope>
  <version>1</version>
</dependency>

将jar正确添加到Dependencies NetBeans项目

enter image description here

但是当我部署应用程序时,缺少依赖性

java.lang.NoClassDefFoundError: com/novell/ldap/LDAPException

3 个答案:

答案 0 :(得分:2)

如果您阅读有关此范围的Maven documentation,如果您的应用程序服务器在运行时未提供此库,则似乎是预期的行为:

  

此范围类似于提供的,但您必须提供   明确包含它的JAR。

provided范围说明:

  

这很像编译,但表示你期望JDK或者   容器在运行时提供依赖

不建议的解决方案:将此库添加到应用程序服务器的lib文件夹中 更清洁的解决方案:手动或使用mvn install:install-file在maven存储库中添加此maven依赖项 并删除此依赖项的system范围。它将使用default范围。

答案 1 :(得分:1)

maven中的 system 范围有点像提供,即依赖仅在编译时使用。您有责任确保jar在运行时位于类路径中。

此外,系统范围实际上已弃用,请考虑其他替代方案。 见introduction to dependency mechanism

答案 2 :(得分:0)

问题在于你的maven&#39; 系统&#39;范围。 这意味着必须在部署应用程序的应用程序服务器上提供依赖关系(与范围&#39; 提供&#39;相同)。范围&#39; 系统&#39;还要求依赖项必须作为jar文件提供。

我建议删除范围元素。像这样,依赖项将被下载到您的maven存储库中,并且可以在您生成的包文件中找到,该文件可以部署在您的应用程序服务器上。

另一个解决方案是将jar文件放在应用程序服务器的库文件夹中。

这里有关于此问题的maven文档link