maven dependency中provided和compile的区别

本文探讨了在IntelliJ IDEA环境下启动SpringBoot项目时遇到的java.lang.ClassNotFoundException错误,详细解释了该问题产生的原因及解决方案,涉及到提供的servlet-api.jar包与IDEA配置之间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在本地启动一个新项目时,

报错: java.lang.ClassNotFoundException: javax.servlet.Filter
环境intellJ idea,我同事的myeclipse就可以直接启动

最后搜了下问题
问题原因是:spring boot项目中引入使用的是scope=provided
       
<dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>

而默认情况下,idea是不会提供对应的servlet-api.jar包eclipse会提供

网上有人说这是idea的bug,这么说显然是不对的,是完全没有理解provided和compile的区别

对于scope=compile的情况(默认scope),也就是说这个项目在编译,测试,运行阶段都需要这个artifact对应的jar包在classpath中。而对于scope=provided的情况,则可以认为这个provided是目标容器已经provide这个artifact。

        这么说可能不是很好理解:换个简单的,就是你在把这个项目打成war包时,scope=provided的jar包,不会出现在WEB-INFO/lib目录下,而scope=compile的jar包,会放到WEB-INFO/lib目录

        这样可以避免想servlet-api.jar这样的jar包冲突,但是如果遇到idea下默认不提供servlet-api.jar时,使用scope=provided就会缺少对应的jar包,也就是我遇到的问题找不到类
### Maven Dependency 参数详解及用法 #### 1. 基本结构 Maven依赖项通常在`pom.xml`文件中声明,基本结构如下: ```xml <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>example-artifact</artifactId> <version>1.0.0</version> <scope>compile</scope> <type>jar</type> <optional>true</optional> <exclusions> <exclusion> <groupId>*</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> </dependencies> ``` 此配置指定了一个具体的依赖项及其属性[^1]。 #### 2. 关键参数说明 ##### groupId, artifactId version 这三个是最基础也是最重要的字段。它们共同唯一标识了一个特定的库或组件。 - `groupId`: 定义了项目所属组的ID。 - `artifactId`: 表示实际构件的名字。 - `version`: 明确指出使用的具体版本号。 这些信息用于定位远程仓库中的资源位置并下载到本地环境[^3]。 ##### scope (作用范围) 决定了该依赖将在哪个阶段被引入以及如何影响编译过程: - **compile**: 默认值;适用于所有阶段(编译、测试、运行)。 - **provided**: 编译期有效但在部署时不打包入最终产物内。 - **runtime**: 运行时期间才需要用到,在编译期间不需要。 - **test**: 只有执行单元测试时才会加载进来。 - **system**: 类似于 provided ,但是还需要指定 systemPath 属性来指向确切的位置。 ##### type (类型) 默认为 jar 文件形式,默认情况下可以省略。如果要引用其他类型的包,则需显式设定,比如 war 或 pom 等特殊格式。 ##### optional (可选标志) 当设为 true 时表示当前模块并不强制要求这个依赖存在,即下游使用者可以选择忽略它而不必担心构建失败的问题。 ##### exclusions (排除列表) 允许开发者从传递性依赖链条里移除某些不必要的子依赖,从而减少潜在冲突的可能性。通过定义 exclusion 节点实现这一点[^2]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值