Tomcat 在 Intellij idea 中调试时加载低版本 spring 库
Tomcat loaded the lower version spring libraries when debug in Intelli j idea
我有一个 Maven spring web(3.2.*) 项目构建目标 war,我想用 tomcat(web:war 在 intellij idea 中调试它exploded artifact),但是网络应用总是加载失败,
[ERROR]..|Context initialization failed java.lang.NoSuchMethodError:
org.springframework.web.context.ConfigurableWebApplicationContext.getEnvironment()Lorg/springframework/core/env/ConfigurableEnvironment;
at
org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:404)
因为在某些 pom 依赖项中,它们引用了较低版本 spring(3.0.7),我可以在 ware 中使用 maven-war-plugin(2.3) 排除它们):packagingExcludes,但我如何在 web:war exploded.
中排除它们
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<packagingExcludes>
WEB-INF/lib/org.springframework.core-3.0.7.RELEASE.jar,
// others springframework jars
</packagingExcludes>
</configuration>
</plugin>
这不是插件,您应该排除关于 IDE 的依赖关系,它是依赖关系图。使用 mvn dependency:tree 查看哪个模块、依赖包含了旧的 spring 版本。当您弄清楚它时,将其从构建中排除。
这是一个如何使用直接来自 maven 的依赖项排除的示例 documentation。
<dependency>
<groupId>sample.ProjectA</groupId>
<artifactId>Project-A</artifactId>
<version>1.0</version>
<scope>compile</scope>
<exclusions>
<exclusion> <!-- declare the exclusion here -->
<groupId>sample.ProjectB</groupId>
<artifactId>Project-B</artifactId>
</exclusion>
</exclusions>
</dependency>
Maven 有一个不容易理解的解决依赖冲突的方法。
它称为 nearest-wins strategy,这可能导致使用旧版本。
如果您没有明确定义依赖版本,请尝试使用 Maven Dependency Management in combination with the Maven Enforcer Plugin 固定版本并使构建失败。
简单的方法是 analyse the dependency graph with
mvn dependency:tree
检查哪个依赖项依赖于旧的 spring 库,并排除那些已经在他的回答中发布的@alexandar-petrov。
从您正在构建的工件中排除依赖项不会对 Intellij 或任何其他 IDE 将使用的类路径产生任何影响。
我有一个 Maven spring web(3.2.*) 项目构建目标 war,我想用 tomcat(web:war 在 intellij idea 中调试它exploded artifact),但是网络应用总是加载失败,
[ERROR]..|Context initialization failed java.lang.NoSuchMethodError: org.springframework.web.context.ConfigurableWebApplicationContext.getEnvironment()Lorg/springframework/core/env/ConfigurableEnvironment; at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:404)
因为在某些 pom 依赖项中,它们引用了较低版本 spring(3.0.7),我可以在 ware 中使用 maven-war-plugin(2.3) 排除它们):packagingExcludes,但我如何在 web:war exploded.
中排除它们<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<packagingExcludes>
WEB-INF/lib/org.springframework.core-3.0.7.RELEASE.jar,
// others springframework jars
</packagingExcludes>
</configuration>
</plugin>
这不是插件,您应该排除关于 IDE 的依赖关系,它是依赖关系图。使用 mvn dependency:tree 查看哪个模块、依赖包含了旧的 spring 版本。当您弄清楚它时,将其从构建中排除。
这是一个如何使用直接来自 maven 的依赖项排除的示例 documentation。
<dependency>
<groupId>sample.ProjectA</groupId>
<artifactId>Project-A</artifactId>
<version>1.0</version>
<scope>compile</scope>
<exclusions>
<exclusion> <!-- declare the exclusion here -->
<groupId>sample.ProjectB</groupId>
<artifactId>Project-B</artifactId>
</exclusion>
</exclusions>
</dependency>
Maven 有一个不容易理解的解决依赖冲突的方法。 它称为 nearest-wins strategy,这可能导致使用旧版本。
如果您没有明确定义依赖版本,请尝试使用 Maven Dependency Management in combination with the Maven Enforcer Plugin 固定版本并使构建失败。
简单的方法是 analyse the dependency graph with
mvn dependency:tree
检查哪个依赖项依赖于旧的 spring 库,并排除那些已经在他的回答中发布的@alexandar-petrov。
从您正在构建的工件中排除依赖项不会对 Intellij 或任何其他 IDE 将使用的类路径产生任何影响。