Maven高级

Maven高级

复习SpringBoot

Spring-IoC
	IoC是什么:控制反转。反转的是创建对象的控制权
		原来:需要什么对象,就自己主动创建对象
		反转:需要什么对象,就从Spring容器里被动接收一个对象
	IoC的作用:用于解耦
	IoC的底层:使用反射 + 工厂模式
	注册bean的方式
		自己写的类:使用@Component或衍生注解,类要放到扫描范围内
			@Component:可以用在任意类上
			@Controller或@RestController:用在web层的类上
			@Service:用在service层的类上
			@Repository:用在dao层的类上
			@Configuration:用在配置类上
		第三方jar包里的类:使用@Configuration + @Bean
			@Configuration
			public class AppConfig{
				@Bean
				public Xxx xxx(){
					return Xxx对象;
				}
			}
		扫描范围之外的类:@Import
			@Import({类名.class, 类名.class, ....})
			@Import(ImportSelector接口的实现类.class):
				由ImportSelector接口的实现类重写selectImports方法
				方法里返回的是全限定类名的数组
				Spring将会找到这些类名对应的类,创建对象放到容器里
	配置bean的方式
		bean的作用域:@Scope("作用域"),作用域的取值
			singleton:单例的。默认的
				何时创建:在Spring容器一启动,就创建了(非Lazy的)单例bean对象
				何时销毁:在Spring容器关闭时,会销毁容器里的单例bean对象
			prototype:多例的
				何时创建:每次获取bean对象,Spring都会创建新的
				何时销毁:这个对象长时间不使用,JVM垃圾回收
			request
			session
			application
		@PostConstruct:加在方法上,方法将在bean对象被创建之后执行的
		@PreDestroy:加在方法上,方法将在bean对象被销毁之前执行的
	依赖注入的方式
		@Autowired:byType注入
		@Qualifier:在byType基础上,实现byName注入的
		@Resource:byName注入
		@Value:注入简单值
Spring-AOP
SpringBoot-介绍
	SpringBoot是什么:对Spring再封装的一个脚手架,不是为了取代Spring,而是为了让Spring的使用更简单方便
	SpringBoot的好处:
		提供了依赖的版本锁定:减少了依赖冲突
		提供了起步依赖:一个起步依赖,就是一批依赖的集合体,让pom.xml配置更精简
		提供了大量的默认配置:很多功能只需要很少的配置参数,甚至不需要配置参数就可以运行
		提供了自动装配功能:让SpringBoot和其它框架的整合,变得非常简单轻松
		内置了Tomcat
	SpringBoot启动过程:
		1. 先运行引导类的main方法,main方法里会执行SpringApplication.run(引导类.class, args);
		2. SpringApplication.run(引导类.class, args)会先创建Spring容器,然后读取引导类上的注解
		3. 引导类上的注解@SpringBootApplication将会生效,这个注解是个组合注解,包含三个主要注解
			@ComponentScan:引导类会开始组件的扫描,默认扫描的是“引导类所在的”
			@SpringBootConfiguration:其实引入的是@Configuration,说明引导类也是个配置类
			@EnableAutoConfiguratoin:引导类将会开始自动装配功能
	SpringBoot的自动装配:
		引导类上的注解,包含了@EnableAutoConfiguratoin
		@EnableAutoConfiguratoin注解,使用了@Import(AutoConfigurationImportSelector.class)
		AutoConfigurationImportSelector是ImportSelector的实现类,重写了接口的selectImports方法,在方法里
			将会扫描所有jar包的类路径里的META-INF/spring.factories文件
			读取文件里使用...EnableAutoConfiguration=类名,类名,类名,...
			Spring会找到这些类,如果满足类上@Conditional的条件时,将会创建对象放到Spring容器里
		然后我们的代码就可以使用@Autowired直接注入需要的bean对象
	自定义启动器:自己创建一个Module,在这个Module放一些公用的类。如果某个项目需要使用这些类,就直接在pom.xml引入这个Module就能用了
		把类放到Module里去
		在Module里提供一个文件:META-INF/spring.factories,在文件里编写  ...EnableAutoConfiguration=全限定类名,全限定类名,..
		

SpringBoot-配置参数
	项目内的配置文件:application.yaml  <  application.yml < application.properties
	项目外修改配置:VM Options  <  Program Arguments
		在命令行里使用:java -D参数名=值 -D参数名=值 -jar jar包名称 --参数名=值 --参数名=值
		其中:-D的参数就是VM Options;  --的参数就是Program Arguments
	项目内的配置 < 项目外的配置

一、Maven复习

以后创建的每个项目,都要创建成Project,不能是Module

1. Maven基本概念

1.1 Maven的作用

Maven是Apache提供的一个项目管理工具

Maven的作用:

  • 可以帮我们管理依赖

    这里的“依赖”,通常指的是jar包,也可以是一个Module(一个Module完全可以被打包成jar)

    可以减少jar包的多次拷贝,导致的重复

    可以辅助我们分析jar包之间的依赖关系,当出现依赖冲突时,解决起来相对容易一些

    maven自动帮我们下载jar包,不需要我们自己查找、下载了

  • 可以帮我们构建项目

    “构建”是一个项目代码编写之后,所经历的一系列的编译、测试、打包、安装、发布等等一系列的过程

    如果没有idea,要构建一个项目是非常麻烦的

    而如果有maven软件,只要通过简单的maven命令就可以实现项目构建了

  • 可以实现项目的分模块开发

    项目可以分模块,就具备了开发大型项目的条件了

1.2 Maven的仓库

Maven的仓库:指的是jar包的仓库。maven始终从本地仓库里加载jar包

  • 本地仓库
  • 私服
  • 中央仓库

在这里插入图片描述

1.3 坐标的概念

什么是坐标:用于精准定位到一个jar包的标识,可以理解为jar包的唯一标识

注意:被maven管理的所有jar包、工程、模块等等,都必须有坐标,而且坐标不能重复

坐标的组成:

  • groupId:通常是公司名、组织名 域名倒写。比如:com.jd, com.baidu, com.itheima

  • artifactId:通常是包名

  • version:通常是版本号,完全可以自定义。不约而同的有两种常见的后缀

    1.0-SNAPSHOT:通常指的是 快照版本、不稳定版、尝鲜版

    1.0-RELEASE:通常指的是发行版、稳定版

2. Maven安装配置

修改maven的settings.xml,配置阿里云仓库镜像:在==mirrors标签内部==增加以下内容

<mirror>
  <id>aliyunmaven</id>
  <mirrorOf>*</mirrorOf>
  <name>阿里云公共仓库</name>
  <url>https://maven.aliyun.com/repository/public</url>
</mirror>

3. Maven构建项目

通过一些命令实现项目的构建的:

  • mvn clean:用于清理之前编译的结果(删除target文件夹)
  • mvn compile:用于编译项目的,maven会把编译的结果,放到自动生成的target文件夹里
  • mvn test:用于批量执行所有的单元测试类和测试方法。要求
    • 单元测试类名,必须以Test结尾。否则不会自动运行这个测试类的
    • 单元测试方法名,建议以test开头。只是建议,即使不以test开头,也会被test命令正常执行
  • mvn package:用于打包。一个项目会被打成什么格式的包:
    • jar包:如果pom.xml里有<packaging>jar<packaging>,或者没有这个标签,都会打成jar包
    • war包:在不使用SpringBoot的情况下,我们开发的应用,都要打成war包,然后部署到Tomcat里才能够运行
  • mvn install:把打包之后的包文件,安装到本地仓库里
  • mvn deploy:把jar包发布到远程仓库里

4. Maven依赖管理

项目里要导入的jar包,只要在pom.xml配置坐标就可以了

<dependencies>
	<dependency>
        <groupId>org.dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>2.1.4</version>
        <scope>配置依赖范围</scope>
    </dependency>
</dependencies>

scope依赖范围:

  • compile:默认的,全范围有效。编译时有效(写代码时能用jar包里的类),运行时有效,单元测试里有效
  • provided:编译时有效,运行时忽略。通常用于开发时必须提供,但是开发完成部署到生产环境时,生产环境里有这个包。比如Servlet包
  • runtime:编译时忽略,运行时有效。比如数据库驱动包,写代码时如果没有驱动包,也不耽误写,但是程序运行时必须有驱动包
  • test:仅在单元测试时有效。比如spring-boot-starter-test可以设置为test范围有效
  • system:让maven引用仓库之外的本地的jar包

实际使用时:

  • 绝大多数jar包都使用默认的依赖范围compile,全范围有效
  • 单元测试相关的包,设置为test

5. Maven依赖传递

依赖传递:项目依赖于A,而A依赖于B,那么我们可以认为:项目也依赖于B

好处是:可以在pom.xml少写一些

坏处有:可能产生依赖冲突

  • 项目–>A–>X1
  • 项目–>B–>X2
  • 项目引用的X,就出现了版本冲突

依赖冲突:maven有自动调解冲突的原则

  • 最短路径优先。比如下面的例子,X2会生效

    项目–>A–>B–>X1

    项目–>C–X2

  • 第一声明优先。如果路径长度相同,哪个依赖先声明,哪个依赖就生效

    • 项目–>A–>X1
    • 项目–>B–>X2
  • 手动排除法:不依靠maven的自动调解

    • 项目–>A–>X1。导入A的时候,可以手动排除掉X1不导入
    • 项目–>B–>X2

二、工程分模块开发(能看懂)

1. 分模块开发介绍

  1. 一切功能,一切代码,一切业务模块全部放到一个项目里
    • 不同功能代码之间的耦合性强。
    • 不能对不同功能做针对性的增强。

在这里插入图片描述

  1. 把一个项目拆分成多个子系统

    可以针对不同子系统,做针对性的增强

    可以降低不同子系统之间的耦合性

    问题:有重复类

在这里插入图片描述

  1. 把一个项目拆分成多个子系统,并且把重复类提取到公用Module里

    可以针对不同子系统,做针对性的增强

    可以降低不同子系统之间的耦合性

    减少重复代码:哪个子系统需要使用公用模块里的类,只要在pom.xml里引用它的坐标就可以用了

在这里插入图片描述

2. 工程分模块示例

需求

针对之前完成的tlias项目,改造成工程分模块的方式

分析

在这里插入图片描述

实现

项目的整体目录结构:

在这里插入图片描述

1) 创建父工程
  1. 创建project,设置名称为tlias-parent
  2. 创建后,删除src文件夹。因为父工程里不需要放代码
  3. 修改pom.xml,添加依赖如下:
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.3</version>
</parent>

<!--锁定版本号-->
<dependencyManagement>
    <dependencies>
        <!--锁定Mybatis起步依赖的版本号-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>
        <!--锁定mysql驱动的版本号-->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>8.0.33</version>
        </dependency>
        <!--锁定PageHelper起步依赖的版本号-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.2</version>
        </dependency>
        <!--锁定FastJson的版本号-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <!--Lombok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>
2) 创建pojo模块
效果

在这里插入图片描述

步骤
  1. 在父工程tlias-parent上右键,新建Module,名称为 tlias-pojo
  2. 创建包com.itheima.pojo,把实体类拷贝到包里
3) 创建utils模块
效果

在这里插入图片描述

步骤
  1. 在父工程tlias-parent上右键,新建Module,名称为tlias-utils
  2. 创建包com.itheima.util,把工具类拷贝到包里
  3. 修改pom.xml,添加依赖如下:
<dependencies>
    <!--阿里云OSS-->
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
        <version>3.15.1</version>
    </dependency>

    <!--JWT-->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>

    <!--web起步依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
4) 创建tlias-management模块
效果

在这里插入图片描述

步骤
  1. 在父工程tlias-parent上右键,新建Module,名称为tlias-managenent
  2. 创建包com.itheima,把剩余的包和类(除了pojo和util之外的)全部拷贝进来
  3. 修改pom.xml,添加依赖如下:
<dependencies>
    <!--pojo依赖坐标-->
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>tlias-pojo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <!--utils起步依赖-->
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>tlias-utils</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

    <!--AOP起步依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

    <!--web起步依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!--mybatis起步依赖-->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
    </dependency>

    <!--mysql驱动-->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
    </dependency>

    <!--PageHelper分页插件-->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
    </dependency>

    <!--fastJSON-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
    </dependency>
</dependencies>

测试

运行tlias-management里的引导类,启动服务

启动nginx

打开浏览器访问 http://localhost:90,重新登录后测试功能

3. 聚合与继承

3.1 聚合

3.1.1 介绍

为什么要聚合:

​ 项目开发通常是分组分模块开发, 每个模块开发完成要运行整个工程需要将每个模块聚合在 一起运行,比如: tlias-pojo、tlias-utils、tlias-management 三个模块最终会打一个独立的工程jar包运行。

聚合的特性:

  • 通过Maven命令操作一个模块,会同时操作其聚合的所有子模块
3.1.2 聚合语法

在这里插入图片描述

3.1.3 效果演示

针对day15-tlias-parent执行maven的命令,实际上操作的是自己+所有的子模块

3.2 继承

3.2.1 介绍

为什么要继承:

​ 继承是为了消除重复。如果多个模块的pom.xml中都要相同的配置(例如编译版本、依赖版本锁定等),则提取到父模块的pom.xml中配置即可,就避免了重复配置。

继承的特性:

  • 子模块继承父工程,可以直接使用父工程里的依赖
  • 如果父工程和子模块都引入了同一个依赖,则子模块自己的生效
3.2.2 继承语法

在这里插入图片描述

3.2.3 效果演示

父工程里导入了lombok,那么子模块里不需要再导lombok,就能直接使用

4. 版本锁定

4.1 版本锁定

版本锁定:可以在父工程或父模块里,提前使用<dependencyManagement>锁定某些依赖的版本号。这样的话,子模块在真正引入依赖时,就不需要再写版本号了

好处:如果要修改某个依赖的版本号,只要去父工程的pom.xml修改锁定的版本号,之后所有的子模块里的依赖版本号就自动随之改变了

在这里插入图片描述

4.2 定义properties

说明:我们可以把pom.xml里的一些配置,提取到properties标签里统一进行维护。在pom.xml要使用这些配置时,按照请求${标签名}可以取值

示例:

在这里插入图片描述

三、Maven私服(了解)

注意:练习maven私服前,先把settings.xml复制一个副本作为备份;练习后再恢复回去,否则影响后续开发

1. 什么是maven私服

  • 公司在自己的局域网内搭建自己的远程仓库服务器,称为私服
  • 私服服务器即是公司内部的 maven 远程仓库, 每个员工的电脑上安装 maven 软件并且连接私服服务器,员工将自己开发的项目打成 jar 并发布到私服服务器,其它项目组从私服服务器下载所依赖的构件(jar)。
  • 私服还充当一个代理服务器,当私服上没有 jar 包会从互联网中央仓库自动下载,如下图 :

在这里插入图片描述

私服的使用模式

在这里插入图片描述

2. 搭建maven私服

2.1 解压nexus程序包

在这里插入图片描述

2.2 启动nexus

进入nexus的nexus-3.39.0-01/bin目录下,双击 start.bat 即可启动nexus

注意:启动后不要关闭黑窗口

在这里插入图片描述

2.3 进入nexus管理界面

打开浏览器,输入地址 http://localhost:8081并回车。nexus的帐号密码是 admin/admin

点击左侧菜单栏的Browse,可以浏览nexus里的私服仓库

在这里插入图片描述

3. 发布jar包到私服

并不是任何人都可以随便把jar包发布到私服上的,那会造成私服混乱。所以如果要把一个项目,或者把一个jar包发布到私服上,需要提供私服的地址、帐号和密码。

3.1 配置私服地址

在项目的父工程pom.xml里配置私服的地址,如下:

<distributionManagement>
    <!-- release版本的发布地址 -->
    <repository>
        <!-- 仓库名称 -->
        <id>maven-releases</id>
        <!-- 仓库地址 -->
        <url>http://localhost:8081/repository/maven-releases/</url>
    </repository>

    <!-- snapshot版本的发布地址 -->
    <snapshotRepository>
        <!-- 仓库名称 -->
        <id>maven-snapshots</id>
        <!-- 仓库地址 -->
        <url>http://localhost:8081/repository/maven-snapshots/</url>
    </snapshotRepository>
</distributionManagement>

3.2 配置私服帐号和密码

修改maven的settings.xml文件,在servers标签内部添加如下内容:

<!-- release仓库的帐号密码 -->
<server>
    <!-- 仓库id,要和上一步配置仓库地址时的id相同 -->
    <id>maven-releases</id>
    <username>admin</username>
    <password>admin</password>
</server>

<!-- snapshots仓库的帐号密码 -->
<server>
    <!-- 仓库id,要和上一步配置仓库地址时的id相同 -->
    <id>maven-snapshots</id>
    <username>admin</username>
    <password>admin</password>
</server>

3.3 把项目发布到私服

针对项目父工程,执行deploy命令,即可把项目发布到私服上

  • 因为我们的项目坐标里,版本号后缀是snapshot,所以项目会发布到maven-snapshots仓库里

打开nexus的管理界面,找到maven-snapshots仓库,可以看到刚刚上传的jar包

4. 从私服下载jar包

要从私服里下载jar包到本地仓库,只要有私服的地址就可以了

4.1 配置私服地址

注意:如果之前配置了阿里云仓库镜像,需要把阿里云仓库镜像的配置删除掉或者注释掉

修改maven的settings.xml,找到其中的profiles标签,在标签内部添加以下内容

<profile>
    <id>allow-snapshots</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <repositories>
        <repository>
            <id>maven-public</id>
            <url>http://localhost:8081/repository/maven-public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
</profile>

4.2 测试效果

找到maven本地仓库,删除tlias-pojo对应的jar包

里云仓库镜像的配置删除掉或者注释掉

修改maven的settings.xml,找到其中的profiles标签,在标签内部添加以下内容

<profile>
    <id>allow-snapshots</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <repositories>
        <repository>
            <id>maven-public</id>
            <url>http://localhost:8081/repository/maven-public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
</profile>

4.2 测试效果

找到maven本地仓库,删除tlias-pojo对应的jar包

找到任意一个maven工程,在pom.xml里添加tlias-pojo的依赖坐标,编译项目,会自动从私服上把tlias-pojo对应的jar下载到本地仓库里

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值