(maven中的scope问题)SpringBoot启动报错: No active profile set, falling back to default profiles: default

1.(maven中的scope问题)SpringBoot启动报错: No active profile set, falling back to default profiles: default

经验证,系 pom 文件配置的 tomcat 发生错误导致,原配置tomcat如下:

<dependency>
	<groupId>org.springframework.bootgroupId>
	<artifactId>spring-boot-starter-tomcatartifactId>
	<scope>providedscope>
dependency>

修改后:(删去scope)完美运行

出现这个问题,我百度很快解决但我不理解于是我重新复习了maven

知识点:maven

1.maven两个主要功能:

1.依赖管理

maven把jar放在仓库,自己放jar包

仓库类:

1.本地(仓库) 2.远程(私服,公司的) 3.中央(联网的)

一个项目找顺序:1-》3(没私服)或者1-》2(没网络)或者1—》2-》3(两者都有)

2的来源可以是1/3

2.一键构建

编译—》测试-》打包-》安装-》发布

(maven中的scope问题)SpringBoot启动报错: No active profile set, falling back to default profiles: default_第1张图片

install–>安装到本地仓库

deploy–>打包上私服

3.整合(重要 需要理解)

(maven中的scope问题)SpringBoot启动报错: No active profile set, falling back to default profiles: default_第2张图片

如:每一个构建项目的命令都对应了maven底层的一个插件

2.maven中解决jar包冲突的方式

直接依赖/传递依赖

方式一:若直接导入某个依赖,那么项目的jar包就是用导入的这个,方式二不生效

方式二:两个都是传递依赖,那我就看谁优先生命,谁优先生命我就用谁的

方式三:排除【推荐使用 】

<exclusions>

	<exclusion>

        <groupID>groupID>

       	<artifactid>artifactid>

	exclusion>

exclusions>

方式四:见下面

3.重头戏:scope的理解

1.出现场景

了解完上面这些内容之后,我们考虑这样的一个场景

(maven中的scope问题)SpringBoot启动报错: No active profile set, falling back to default profiles: default_第3张图片

我们用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.jspgroupId>
    <artifactId>jsp-apiartifactId>
    <version>2.1version>
    <scope>providedscope>
dependency>
3.runtime

这种作用域的依赖只会在测试和运行期可用,不需要参与项目的编译。这些依赖将会被打包到最终的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>
4.test

只参与测试工作过程中的测试和执行,典型的例子就是:JUnit,但是这些依赖不会被打包到最终的artifact中。

<dependency>
    <groupId>junitgroupId>
    <artifactId>junitartifactId>
    <version>4.11version>
    <scope>testscope>
dependency>
5.system

和provided scope很像。唯一的区别在于,在system scope中,你需要告诉Maven如何去找到这个依赖(方法是通过systemPath属性来指定依赖的路径),如果你要引用的依赖在Maven仓库中不存在时,就可以用这个scope。不推荐使用system依赖。

(maven中的scope问题)SpringBoot启动报错: No active profile set, falling back to default profiles: default_第4张图片

6.import

从其它的pom文件中导入依赖设置,它只在dependencyManagement元素下使用,表示从其他pom中导入dependency的配置。

你可能感兴趣的:(Java,Springboot,maven)