具有 Maven 依赖系统范围的 ClassNotFoundException

ClassNotFoundException with Maven dependency system scoped

当我尝试使用 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 项目

但是当我部署应用程序时,依赖项丢失了

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

maven中的system作用域有点像provided,即依赖只在编译时使用。您有责任确保 jar 在运行时位于类路径中。

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

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

This scope is similar to provided except that you have to provide the JAR which contains it explicitly.

provided 范围状态:

This is much like compile, but indicates you expect the JDK or a container to provide the dependency at runtime.

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

问题出在您的 Maven“system”范围上。 这意味着依赖项必须在部署应用程序的应用程序服务器上可用(与范围'provided'相同)。范围 'system' 有附加要求,即依赖项必须作为 jar 文件可用。

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

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

这里是关于此问题的 Maven 文档的 link