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

相关文章

解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题

《解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题》在Spring开发中,@Autowired注解常用于实现依赖注入,它可以应用于类的属性、构造器或setter方法上,然... 目录1. 为什么 @Autowired 在属性上被警告?1.1 隐式依赖注入1.2 IDE 的警告:

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

关于Nginx跨域问题及解决方案(CORS)

《关于Nginx跨域问题及解决方案(CORS)》文章主要介绍了跨域资源共享(CORS)机制及其在现代Web开发中的重要性,通过Nginx,可以简单地解决跨域问题,适合新手学习和应用,文章详细讲解了CO... 目录一、概述二、什么是 CORS?三、常见的跨域场景四、Nginx 如何解决 CORS 问题?五、基

python安装whl包并解决依赖关系的实现

《python安装whl包并解决依赖关系的实现》本文主要介绍了python安装whl包并解决依赖关系的实现,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、什么是whl文件?二、我们为什么需要使用whl文件来安装python库?三、我们应该去哪儿下

MySQL安装时initializing database失败的问题解决

《MySQL安装时initializingdatabase失败的问题解决》本文主要介绍了MySQL安装时initializingdatabase失败的问题解决,文中通过图文介绍的非常详细,对大家的学... 目录问题页面:解决方法:问题页面:解决方法:1.勾选红框中的选项:2.将下图红框中全部改为英

Nginx启动失败:端口80被占用问题的解决方案

《Nginx启动失败:端口80被占用问题的解决方案》在Linux服务器上部署Nginx时,可能会遇到Nginx启动失败的情况,尤其是错误提示bind()to0.0.0.0:80failed,这种问题通... 目录引言问题描述问题分析解决方案1. 检查占用端口 80 的进程使用 netstat 命令使用 ss

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多