maven的scop作用域依赖问题导致idea社区版报错

2024-01-08 18:04

本文主要是介绍maven的scop作用域依赖问题导致idea社区版报错,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 错误:代码没改,卸了专业版后改用社区版出现以下报错

2024-01-08 16:34:29.374 ERROR [main] org.springframework.boot.SpringApplication.reportFailure:823 Application run failed
java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration.propertySourcesPlaceholderConfigurer

Caused by: java.lang.IllegalStateException: Failed to introspect Class [org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport] from ClassLoader [sun.misc.Launcher$AppClassLoader@18b4aac2]
at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:507)

Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext
Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContext

java.lang.IllegalStateException: Failed to introspect Class [org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport] from ClassLoader [sun.misc.Launcher$AppClassLoader@18b4aac2]

Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext

2.解决过程

针对错误进行分析:
(1)首先第一个错误:【Error processing condition on org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration.propertySourcesPlaceholderConfigurer

对于这个错误,查阅了网上的教程反馈为:1.启动类的位置不对,2.配置文件是否存在且位置是否对,以及内容是否有错误
我的代码是因为卸载了专业版idea换成社区版idea才出现的,仔细看了代码也确实不是这个问题造成的。
(2)对于第二个问题毫无头绪,直接往下看第三个错误【Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext】
这个问题很明显了就是没有依赖,直接pom添加依赖:

<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>

没解决问题:修改provided为runtime
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>runtime</scope> </dependency>

也可以直接删除runtime,就是采用默认的complie了,两者在运行都会生效,解决了servlet报错问题。

(3)解决了之后出现的报错是:
org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.
Caused by: org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.
参考这个教程:https://blog.csdn.net/weixin_44299027/article/details/113590189
虽然教程没解决我的问题,但是给了我思路。
问题应该是tomcat的依赖出现问题了,参考了教程的第五种解决方案,没能解决我的问题,猜测应该是这个作用域的问题,把原pom文件中的scop直接删了,问题解决
原来的

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope>
</dependency>

修改后

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>

最后复盘一下,推测servlet出现的问题应该是由于tomcat这里的问题引起的,因为专业版本能运行说明依赖不存在缺失问题,我就回去把javax.servlet的依赖给删了,最终确实是可以正常启动运行的。所有的问题就是在provided这里,只要把这个作用域改成包含运行状态即可,就是可以选择runtime,也可以直接删了provided。

至于为何是这样。特意问了一下AI:
AI回答:IntelliJ IDEA 的专业版和社区版对于 Maven 项目的处理有些差异。

在专业版中,当你在 pom.xml 中使用 provided 作用域时,IDEA 会将该依赖标记为 “Provided”,这表示该依赖由容器(如 Tomcat)提供,而不需要在构建过程中包含在最终的构建结果中。这对于 Web 应用程序来说是很常见的,因为 Tomcat 这样的 Web 容器会提供 Servlet API。

而在社区版中,IDEA 不会特别标记 provided 依赖,并且默认行为是将该依赖包含在构建结果中。这可能是为了简化使用体验和适应更广泛的项目需求。

所以,对于你提到的这个例子,在专业版中强制去掉 provided 作用域是不必要的,而在社区版中可能需要去掉 provided 作用域,以便将相应的依赖包含在构建结果中。

请注意,这仅仅是由于 IDEA 不同版本对 Maven 项目处理的差异导致的。在实际构建和部署项目时,还是需要根据相应的环境和要求进行适当的设置和配置。
最后附一下作用域的作用范围:

下面是 <scope> 可能的取值以及对应的作用:

  • compile:默认的作用范围。这意味着依赖项在编译、测试、运行项目时都是可用的。
  • provided:这个作用范围表示依赖项会被编译时和测试时使用,但在运行时(部署到容器中)将由容器或其他类似的环境提供。比如 Servlet API 就是一个典型的 provided 依赖。
  • runtime:这表示依赖项在运行时是可用的,但在编译时不会被使用。比如 JDBC 驱动程序可以被设置为 runtime 作用范围,因为编译代码并不会依赖到它,但在运行时是需要的。
  • test:这表示依赖项只会在测试编译和运行测试时使用,不会在项目的主代码中使用。
  • system:这个作用范围被认为是非常危险的,应该尽量避免使用。它表示依赖项在本地系统中可用,并通过 <systemPath> 元素指定路径。这意味着 Maven 将不会去仓库中查找该依赖项,而是直接使用指定路径中的 JAR 文件。

<scope> 元素省略时,默认的作用范围是 compile

这篇关于maven的scop作用域依赖问题导致idea社区版报错的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/584346

相关文章

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

Springboot如何正确使用AOP问题

《Springboot如何正确使用AOP问题》:本文主要介绍Springboot如何正确使用AOP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录​一、AOP概念二、切点表达式​execution表达式案例三、AOP通知四、springboot中使用AOP导出

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM