具有 Maven 依赖系统范围的 ClassNotFoundException
ClassNotFoundException with Maven dependency system scoped
当我尝试使用 Maven 定义的依赖项 运行 我的应用程序时,我收到 ClassNotFoundException
和 NoClassDefFoundError
异常。
我使用以下声明将我对相关 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。
当我尝试使用 Maven 定义的依赖项 运行 我的应用程序时,我收到 ClassNotFoundException
和 NoClassDefFoundError
异常。
我使用以下声明将我对相关 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。