idea启动服务报错Application run failed
现象是这样,在宝兰德部署报错: NoClassDefFoundError: org/apache/tomcat/util/codec/binary/Base64
本地启动报错:Application run failed:Failed to parse configuration class [***.WebApplication]; nested exception is java.lang.IllegalStateException:Failed to introspect annotated methods on class org.springframework.boot.web.servlet.support.SpringBootServletInitializer
以及从Caused by : java.lang.ClassNotFOUNDeXCEPTION : JAVAX.SERVLET.
java.lang.ClassNotFoundException : Javax.servlet.ServletContext
下面是报错的部分截图
Maven中的scope元素用于定义依赖项的作用范围,它决定了依赖项在项目构建的不同阶段(如编译、测试、运行)的可用性。
Maven中的Scope类型及其用途
compile:这是默认值,表示被依赖包需要参与当前项目的编译、测试和运行阶段,通常会被包含在最终的打包文件中。例如,JUnit库通常使用compile范围,因为它需要在编译和运行时都可用12。
provided:这种范围的依赖项在编译和测试阶段可用,但在运行时不需要。通常用于服务器提供的库,如Servlet API,因为服务器已经提供了这些库,不需要在应用中再次包含23。
runtime:这种范围的依赖项在运行时可用,但不参与编译。适用于那些在编译时不需要但在运行时必须的库,如JDBC驱动。这种范围可以减少编译时间并避免不必要的依赖23。
test:这种范围的依赖项仅在测试阶段可用,不会被包含在最终的打包文件中。适用于测试框架和测试相关的库23。
system:这种范围的依赖项从本地系统路径获取,通常用于那些不在Maven仓库中的库。需要指定本地路径23。
import:这种范围用于POM继承,允许一个POM文件继承另一个POM文件中的依赖管理配置2。
Scope的使用场景和示例
compile:适用于所有阶段需要的库,如JUnit。
provided:适用于服务器提供的库,如Servlet API。
runtime:适用于运行时需要的库,如JDBC驱动。
test:适用于测试阶段的库,如JUnit测试框架。
system:适用于本地系统路径的库,如某些特定硬件相关的库。
import:适用于POM继承,简化依赖管理。
本地环境启动的修改scope
修改spring-boot-starter-tomcat的scope属性
将上面图片中的scope这行注释掉。然后刷新一些maven,就可以启动了。
这里是因为宝兰德打包的时候需要排除这个jar包,但是idea里面用的是tomcat,所以不能排除这个jar包。对于打包到宝兰德中间件的时候,需要这个中间件单独的jar包,需要用宝兰德的那个jar包来替换这个jar包。(也就是将这个包排除掉,然后再引入宝兰德的jar包。)
打包的时候要排除tomcat的一些包的依赖,但是没有去干净。对于引用的其它的jar包或者本地的maven项目要把jar包排除干净。