我在 STS 中遇到以下错误:
org.springframework.core.env.EnvironmentCapable 类型无法解析。它是从所需的 .class 文件中间接引用的
我在 STS 中遇到以下错误:
org.springframework.core.env.EnvironmentCapable 类型无法解析。它是从所需的 .class 文件中间接引用的
这听起来像是一个传递依赖问题。这意味着您的代码依赖于 jar 或库来做某事——显然,您依赖于 Spring 框架代码。好吧,所有的 Spring 代码也依赖于库和 jars。
最有可能的是,您需要将经过正确版本控制的org.springframework.core
jar 添加到您的类路径中,以便EnvironmentCapable
在您的 IDE 尝试构建您的项目时可以找到该类。
这也可能是一个 jar 碰撞问题,尽管这听起来不太可能。当应用程序遇到 jar 冲突(也称为“dll 地狱”)时,编译器会查找具有相同完全限定名称的多个 jar 和类。例如,假设您将 Spring 以及整个 Tomcat 服务器库添加到类路径中。好吧,这两个 jar 可能包含完全相同的命名类,可能是相同的版本,也可能是不同的版本。但无论哪种方式,当编译器查找EnvironmentCapable
该类时,它会找到两个(在这个人为的示例中) - 一个在 Spring jar 中,一个在 Tomcat jar 中。好吧,它不知道该选择哪一个,因此它会抛出一个ClassDefNotFoundException
,这将/可能表现为您遇到的错误。
我在spring-security-config.i上使用spring security时遇到了同样的错误。我在maven repo中删除了那个jar,并在eclipse中给出了maven->update Project。已解决。请尝试一次。
从命令行运行“mvn clean install”,您会看到项目失败,并且您会在日志中看到导致此类问题的工件。之后,从 .m2/repository 中删除工件,然后从 eclipse 中更新 maven。
为避免 jar 冲突,请确保在聚合 pom.xml 中的 properties 标记下声明依赖版本,并在整个项目中使用属性名称作为占位符。例如父 pom 中的 4.2.5.RELEASE,然后在子模块中只需使用 ${spring.version} 而不是 4.2.5.RELEASE。这样,您可以避免在类路径上有同一个库的两个不同版本。
另外建议与spring依赖的版本保持一致。对 spring-core、spring-web 等使用相同的版本。
如果您使用的是 maven,那么您可以使用 maven enforcer 插件来确保依赖收敛,并避免传递依赖的进一步问题。