Maven的高级使用

私服仓库概述

在这里插入图片描述

中央仓库

目前来说: https://repo1.maven.org/maven2/是真正的Maven中央仓库的地址,该地址内置在Maven的源码中,其他的都是镜像。

什么是仓库镜像

如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像,使用镜像可以提高项目构建效率。

仓库的索引

中央仓库带有索引文件以方便用户对其进行搜索,索引每周更新一次,中央仓库的索引有几十M。

黑名单

如果某个IP地址恶意的下载中央仓库内容,例如全公司100台机器使用同一个IP反复下载,这个IP(甚至是IP段)会进入黑名单,因此稍有规模的使用Maven时,应该用Nexus架设私服。

私服

有些公司不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到这台私服上,这样的话就可以通过这台搭建了nexus私服的电脑访问maven的远程仓库。

搭建私服仓库

  • Nexus的官网: https://www.sonatype.com/

  • 默认是使用jetty做为web容器

在这里插入图片描述

在这里插入图片描述

安装:

  1. 在任意位置创建目录:nexus

  2. 解压到nexus目录下会出现两个目录,两个目录都有用

  3. 安装路径下etc目录中nexus-default.properties文件保存有nexus基础配置信息,例如默认访问端口,nexus默认的端口号是8081

  4. 安装路径下bin目录中nexus.vmoptions文件保存有nexus服务器启动对应的配置信息,例如默认占用内存空间

启动:

  1. 进入以下nexus安装文件夹的bin目录
  2. 输入cmd进入命令行
  3. 可以输入nexus /?查看所有的参数
  4. 输入nexus /run nexus在窗口下运行服务器
  5. 允许Window Defender防火墙的访问警报
  6. 启动成功,默认是8081,cmd窗口不可关闭,否则视为退出

访问:

  1. 当Nexus启动后,可以在浏览器中输入:http://localhost:8081/进入私服页面
  2. 点击右上角登录,输入默认的帐号:admin
  3. 密码:在nexus/sonatype-work/nexus3/admin.password文件中找
  4. 登录成功以后出现配置向导,修改密码,输入两次
  5. 允许匿名的账户登录->配置完成

私服类别

在这里插入图片描述

proxy:是远程仓库的代理。比如说在nexus中配置了一个central仓库的proxy,当用户向这个proxy请求一个组件,这个proxy就会先在本地查找,如果找不到的话,就会从远程仓库下载,然后返回给用户,相当于起到一个中转的作用。

Hosted:是宿主仓库,用户可以把自己的一些构件,deploy到hosted中,也可以手工上传构件到hosted里。比如说oracle的驱动程序,在central repository是获取不到的,就需要手动上传到hosted里。

Group:是仓库组,在maven里没有这个概念,是nexus特有的。目的是将上述多个仓库聚合,对用户暴露统一的地址,这样用户就不需要在pom中配置多个地址,只要统一配置group的地址就可以了。

注:公司内部通常只需关注hosted宿主仓库就可以了

Nexus配置

配置中央仓库:

Nexus的中央仓库,默认配置的是maven的中央仓库:https://repo1.maven.org/maven2/,为了提高速度可以配置成阿里云的中央仓库https://maven.aliyun.com/repository/central

在这里插入图片描述

在这里插入图片描述

​ !!!!注意:切记保存!!!!

修改RELEASES为可以重复部署:

在这里插入图片描述

在这里插入图片描述

​ !!!!注意:切记保存!!!!

上传至私服

  1. 配置本地仓库访问私服的权限,修改maven的conf/settings.xml配置文件,用户名和密码,复制如下片段到相应的位置,大约在111行。注意:密码要与你设置的密码相同
<server>
	<id>releases</id>
	<username>admin</username>
	<password>admin</password>
</server>
<server>
	<id>snapshots</id>
	<username>admin</username>
	<password>admin</password>
</server>
  1. 重新创建一个新的模块,配置要上传项目中的发布管理,坐标如下:
<groupId>com.lxl</groupId>
<artifactId>demo-maven-a</artifactId>
<version>1.0-SNAPSHOT</version>
<!--<version>1.0-RELEASE </version>-->
  1. 在pom.xml文件中添加以下代码段
<distributionManagement>
  	<repository>
  		<id>releases</id>
	    <url>http://localhost:8081/repository/maven-releases/</url>
  	</repository> 
  	<snapshotRepository>
  		<id>snapshots</id>
	    <url>http://localhost:8081/repository/maven-snapshots/</url>
  	</snapshotRepository> 
</distributionManagement>
<!--上面的url即仓库地址-->
  1. 执行deploy命令,上传项目到私服

  2. 查看上传日志结果

  3. 修改当前模块的坐标为RELEASE

  4. 再次执行deploy命令,上传到私服

  5. 去私服查看上传的结果

私服拉取依赖

  1. 假设上面的模块是A,创建另一个模块B,依赖于上面的模块A
<groupId>com.lxl</groupId>
<artifactId>demo-maven-b</artifactId>
<version>1.0-RELEASE</version>

<dependencies>
    <!-- b模块,依赖于a模块。先从本地仓库下载,如果没有就会从远程仓库下载 -->
    <dependency>
        <groupId>com.itheima</groupId>
        <artifactId>day38-01-maven-a</artifactId>
        <version>1.0-RELEASE</version>
    </dependency>
</dependencies>
  1. 删除本地仓库中A模块的jar包
  2. 修改%MAVEN_HOME%\conf\setttings.xml文件,项目B是依赖于私服仓库中模块A
<mirror>
   <id>nexus</id>
   <mirrorOf>*</mirrorOf>
   <url>http://localhost:8081/repository/maven-public/</url>
</mirror>
  1. clean清除项目B,再complie编译一次

  2. 查看日志信息是从私服仓库中下载

  3. 修改回原来的阿里云配置,私服mirror地址只是临时配置

依赖关系

依赖传递:

  • compile, runtime 在运行时中起作用中范围会产生依赖传递

依赖可选

  • A项目依赖了junit,B项目依赖了A项目,根据依赖传递特性,默认情况下B项目会依赖junit,可以在A项目通过可选依赖,让B项目不能依赖junit
  • 配置方式:A项目的依赖配置中,通过optional子标签进行配置。它有两个取值:
    • true:是可选依赖,不进行依赖传递

    • false:默认值,进行依赖传递。

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
	<scope>compile</scope>
<!-- 依赖可选,取值是true或false,这个包不会传递下去,我要决定给不给 -->
<!--<optional>true</optional>-->
</dependency>

依赖排除

  • A项目依赖了junit,B项目依赖了A项目,根据依赖传递特性,默认情况下B项目会依赖junit,我们可以在B项目通过排除依赖,配置B项目不依赖junit
  • 配置步骤:通过在B项目中配置 exclusions标签进行配置:
    1. 在依赖A项目下的version标签下编写exclusions
    2. exclusions中每个exclusion是一个要排除的jar包
    3. 只需指定groupId和artifactId就可以了,不用指定version版本
<!--依赖于项目A-->
<dependency>
	<groupId>com.itheima</groupId>
	<artifactId>day51_02_A</artifactId>
	<version>1.0-SNAPSHOT</version>
	<!-- 依赖排除,我来决定要不要 -->
	<exclusions>
	<!-- 可以设置多个 -->
		<exclusion>
		<!-- 要写排除的坐标,不用写version -->
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
		</exclusion>
	</exclusions>
</dependency>

依赖冲突

依赖冲突的三种情况依赖如何处理的
两个直接依赖以下面配置的为准
一个直接依赖一个间接依赖以直接为准
两个间接依赖以上面配置的为准

多环境配置

在这里插入图片描述

配置多环境流程

  1. 创建的maven工程,复制jdbc.properties到resources目录下

  2. 修改jdbc.properties中的jdbc.url=${jdbc.url}

  3. 在pom.xml中profiles下配置三个不同的环境:开发,生产,测试

  4. 在profile的properties中分别指定不同的jdbc.url属性值

  5. 分别选择不同的profile

<profiles>
    <!-- 1.开发环境 -->
    <profile>
        <!-- 开发环境的唯一标识 -->
        <id>env_dev</id>
        <!-- 定义不同的属性 -->
        <properties>
            <jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm</jdbc.url>
        </properties>
        <!-- 设置默认开启 -->
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <!-- 2. 生产环境 -->
    <profile>
        <!-- 开发环境的唯一标识 -->
        <id>env_pro</id>
        <!-- 定义不同的属性 -->
        <properties>
            <jdbc.url>jdbc:mysql://127.2.2.2:3306/ssm</jdbc.url>
        </properties>
    </profile>
    <!-- 3. 测试环境 -->
    <profile>
        <!-- 开发环境的唯一标识 -->
        <id>env_test</id>
        <!-- 定义不同的属性 -->
        <properties>
            <jdbc.url>jdbc:mysql://127.3.3.3:3306/ssm</jdbc.url>
        </properties>
    </profile>
</profiles>
  1. 指定resource的目录地址和开启替换的参数
<build>
    <resources>
        <!-- 指定资源的配置 -->
        <resource>
            <!-- 必须指定resource所在的目录 -->
            <directory>${basedir}/src/main/resources</directory>
            <!-- 指定是否替换 -->
            <filtering>true</filtering>
        </resource>
    </resources>
</build>
  1. 运行package命令,查看target中的jar包中jdbc.properties中的url是否不同
  2. 也可以使用命令行方式执行,mvn 指令 –P 环境定义id

三种开发模式

传统模式开发:传统开发方式是将这些业务集中在1个web项目中, 缺点是代码量大, 业务插拔不方便 。

在这里插入图片描述

模块开发:模块化开发业务清晰,维护方便,业务插拔较简单,缺点是各模块间仍然存在依赖 。

在这里插入图片描述

微服务开发:将各个业务拆分成多个独立的系统。

在这里插入图片描述

继承与聚合

分模块的作用:

  1. 项目架构一目了然,更清晰
  2. 有利于团队合作开发,不同的成员开发一个模块
  3. 代码的可维护性更强
  4. 更方便重用,例如:所有的工具类都写到一个utils工程中,不仅当前项目可以用,其他项目也可以用。

继承作用:

  1. 父项目:

    1. 抽取所有项目公用的配置和插件

    2. 锁定当前项目中各个子项目依赖的版本

  2. 子项目:

    继承父项目,父项目的公用的配置就可以直接使用了

dependencyManagement元素:

  • 作用:一旦在父项目中使用了版本锁定,就是统一控制各个组件的版本。
  • 如果子项目继承父项目,父项目中版本锁定的包子项目是不能直接使用的。
  • 如果要使用,需要在子项目添加依赖,但不需要指定版本号。
  • 注:父项目中版本锁定的jar包,子项目中可以使用,也可以不使用
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值