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

4 篇文章 0 订阅
1 篇文章 0 订阅

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.一键构建

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

E:\6.2_idea_java\文档\JavaWeb\课程资料\day24_maven\maven基础\图\maven生命周期.png

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的配置。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值