经验证,系 pom 文件配置的 tomcat 发生错误导致,原配置tomcat如下:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-tomcatartifactId>
<scope>providedscope>
dependency>
修改后:(删去scope)完美运行
出现这个问题,我百度很快解决但我不理解于是我重新复习了maven
maven把jar放在仓库,自己放jar包
仓库类:
1.本地(仓库) 2.远程(私服,公司的) 3.中央(联网的)
一个项目找顺序:1-》3(没私服)或者1-》2(没网络)或者1—》2-》3(两者都有)
2的来源可以是1/3
编译—》测试-》打包-》安装-》发布
install–>安装到本地仓库
deploy–>打包上私服
如:每一个构建项目的命令都对应了maven底层的一个插件
直接依赖/传递依赖
方式一:若直接导入某个依赖,那么项目的jar包就是用导入的这个,方式二不生效
方式二:两个都是传递依赖,那我就看谁优先生命,谁优先生命我就用谁的
方式三:排除【推荐使用 】
<exclusions>
<exclusion>
<groupID>groupID>
<artifactid>artifactid>
exclusion>
exclusions>
方式四:见下面
了解完上面这些内容之后,我们考虑这样的一个场景
我们用maven实现一个servlet,那我们就得导入这个依赖,这样子写必定报错:MyServlet cannot be cast to javax.servlet.Servlet
为什么会找不到Servlet呢?
原因是这样子的:
1.maven本身就是有tomcat插件,该插件的依赖里面也有和我导入的一样的包,也就是上图打红色框的那两个包
2.maven的第二个核心功能是一键构建,这么被红色框的那两个包就会被放上tomcat,放上tomcat的包就和原本tomcat的包重复了
如此一来,就出现了jar包冲突
这种jar包冲突不同于上面第二点的jar包冲突,那应该如何解决呢?
我们能不能考虑这样一种方式解决,让这就导入的jar包,只在编译期间有用,这样旧
这就引入了scope
scope是限制Dependency的作用范围的
在Maven编译、测试、运行的生命周期过程中
提供指定scope,就可以让某个jar包或者插件只在一定是生命周期中有效
(这里补充,上面的常见解决方式是在dependency中加入scope指定为provide,即编译期间)
自2.0.9版本发布后,新增了一种:import,现在已经有了6种scope
下面对六种作用范围进行解析:
不声明scope元素的情况下的默认值。compile表示被依赖包需要参与当前项目的编译,包括后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。
这个scope假定对应的依赖会由运行这个应用的JDK或者容器来提供。最好的例子就是servletAPI。相当于compile-减去打包的操作,在打包阶段做了exclude的动作,不会被打包到最终的artifact中。
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>2.1version>
<scope>providedscope>
dependency>
这种作用域的依赖只会在测试和运行期可用,不需要参与项目的编译。这些依赖将会被打包到最终的artifact中。与compile相比,跳过了编译而已。典型的例子是:JDBC驱动,适用运行和测试阶段。比如你有一个基于web的应用需要在运行时才访问MySQL数据库。你的代码仅仅是基于JDBC API来编写,也就是说只在编译期需要JDBC API JAR,而在运行的时候才需要JDBC的驱动实现。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jdbcartifactId>
<scope>providedscope>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<scope>runtimescope>
dependency>
只参与测试工作过程中的测试和执行,典型的例子就是:JUnit,但是这些依赖不会被打包到最终的artifact中。
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.11version>
<scope>testscope>
dependency>
和provided scope很像。唯一的区别在于,在system scope中,你需要告诉Maven如何去找到这个依赖(方法是通过systemPath属性来指定依赖的路径),如果你要引用的依赖在Maven仓库中不存在时,就可以用这个scope。不推荐使用system依赖。
从其它的pom文件中导入依赖设置,它只在dependencyManagement元素下使用,表示从其他pom中导入dependency的配置。