java - 对依赖项共享的传递依赖项中的类的运行时 ClassNotFoundException
问题描述
我有一个使用 springboot 的 maven 项目,以及包含 datastax 的 cassandra 驱动程序的 spring data cassandra,它工作正常。
new-library
当我引入与 cassandra 驱动程序 ( ) 共享传递依赖关系的第三个库(我们称之为)依赖项时,com.typesafe:config
驱动程序为该传递依赖项中的类抛出 ClassNotFoundException。
现在,cassandra 驱动程序中的依赖项与第三个库的版本相同。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-cassandra</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>new-library</artifactId>
<version>1.0.0</version>
</dependency>
如果没有new-library
,则mvn dependency:tree
显示com.typesafe:config:jar:1.4.1
在 datastax 驱动程序下。
+- org.springframework.boot:spring-boot-starter-data-cassandra:jar:2.5.4:compile
| +- org.springframework:spring-tx:jar:5.3.9:compile
| \- org.springframework.data:spring-data-cassandra:jar:3.2.4:compile
| +- com.datastax.oss:java-driver-core:jar:4.11.3:compile
| +- com.typesafe:config:jar:1.4.1:compile
...
当我添加new-library
依赖项时,它会从 mvn 树中消失,但会显示在new-library
.
\- com.example:new-library:jar:1.0.0:compile
+- com.typesafe:config:jar:1.4.1:compile
我尝试在new-library
依赖项中设置一个排除项 - 这不起作用。
<exclusions>
<exclusion>
<groupId>com.typesafe</groupId>
<artifactId>config</artifactId>
</exclusion>
</exclusions>
我还尝试添加com.typesafe:config
作为独立依赖项,无论是否将范围设置为运行时。那没有用。
<dependency>
<groupId>com.typesafe</groupId>
<artifactId>config</artifactId>
<version>1.4.1</version>
<scope>runtime</scope>
</dependency>
例外
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.datastax.oss.driver.api.core.config.DriverConfigLoader]: Factory method 'cassandraDriverConfigLoader' threw exception; nested exception is java.lang.NoClassDefFoundError: com/typesafe/config/ConfigOriginFactory
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.3.9.jar:5.3.9]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.9.jar:5.3.9]
... 198 common frames omitted
Caused by: java.lang.NoClassDefFoundError: com/typesafe/config/ConfigOriginFactory
at com.datastax.oss.driver.internal.core.config.typesafe.TypesafeDriverConfig.<clinit>(TypesafeDriverConfig.java:45) ~[java-driver-core-4.11.3.jar:na]
at com.datastax.oss.driver.internal.core.config.typesafe.DefaultDriverConfigLoader.<init>(DefaultDriverConfigLoader.java:196) ~[java-driver-core-4.11.3.jar:na]
at com.datastax.oss.driver.internal.core.config.typesafe.DefaultDriverConfigLoader.<init>(DefaultDriverConfigLoader.java:182) ~[java-driver-core-4.11.3.jar:na]
at com.datastax.oss.driver.internal.core.config.typesafe.DefaultProgrammaticDriverConfigLoaderBuilder.build(DefaultProgrammaticDriverConfigLoaderBuilder.java:244) ~[java-driver-core-4.11.3.jar:na]
at org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration.cassandraDriverConfigLoader(CassandraAutoConfiguration.java:117) ~[spring-boot-autoconfigure-2.5.4.jar:2.5.4]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.9.jar:5.3.9]
Caused by: java.lang.ClassNotFoundException: com.typesafe.config.ConfigOriginFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:636) ~[na:na]
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182) ~[na:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519) ~[na:na]
解决方案
所以事实证明第三个库是由一个非常旧版本的 gradle 构建的。我在那里升级了 gradle 并重建并重试了这个项目,问题得到了解决。我猜 gradle 创建了某种无效的 pom。
推荐阅读
- wpf - 2wpf .net5 错误当前上下文中不存在名称“InitializeComponent”
- ansible - 找不到python模块防火墙
- javascript - 如何链接背景图像 [vue cli]
- version-control - 如果我的 Jenkinsfile 位于存储库本身,我为什么要在我的 Jenkinsfile 中指定 checkout 命令?
- c++ - 在 C++ 中使用 C 函数 使用 extern "C"
- sqlite - 在 sqlite 中,可以放入一页的最大 blob 大小是多少?
- react-native - 使用 expo 的 IOS 通用链接不起作用
- 3d - CGAl 3D 网格生成概念
- node.js - 当数据库表链接并且我需要同时查询两者时,如何在 MVC 中设计模型?(Nodejs,PostgreSQL)
- json - 我可以根据其他带有 json 对象的下拉菜单创建带有自动完成功能的下拉菜单吗