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