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

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

IDEA中Git版本回退的两种实现方案

《IDEA中Git版本回退的两种实现方案》作为开发者,代码版本回退是日常高频操作,IntelliJIDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择... 目录一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py