文章目录
私服仓库概述
中央仓库
目前来说: 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容器
安装:
在任意位置创建目录:nexus
解压到nexus目录下会出现两个目录,两个目录都有用
安装路径下etc目录中nexus-default.properties文件保存有nexus基础配置信息,例如默认访问端口,nexus默认的端口号是8081
安装路径下bin目录中nexus.vmoptions文件保存有nexus服务器启动对应的配置信息,例如默认占用内存空间
启动:
- 进入以下nexus安装文件夹的bin目录
- 输入cmd进入命令行
- 可以输入nexus /?查看所有的参数
- 输入
nexus /run nexus
在窗口下运行服务器- 允许Window Defender防火墙的访问警报
- 启动成功,默认是8081,cmd窗口不可关闭,否则视为退出
访问:
- 当Nexus启动后,可以在浏览器中输入:http://localhost:8081/进入私服页面
- 点击右上角登录,输入默认的帐号:admin
- 密码:在nexus/sonatype-work/nexus3/admin.password文件中找
- 登录成功以后出现配置向导,修改密码,输入两次
- 允许匿名的账户登录->配置完成
私服类别
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为可以重复部署:
!!!!注意:切记保存!!!!
上传至私服
- 配置本地仓库访问私服的权限,修改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>
- 重新创建一个新的模块,配置要上传项目中的发布管理,坐标如下:
<groupId>com.lxl</groupId>
<artifactId>demo-maven-a</artifactId>
<version>1.0-SNAPSHOT</version>
<!--<version>1.0-RELEASE </version>-->
- 在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即仓库地址-->
-
执行deploy命令,上传项目到私服
-
查看上传日志结果
-
修改当前模块的坐标为RELEASE
-
再次执行deploy命令,上传到私服
-
去私服查看上传的结果
私服拉取依赖
- 假设上面的模块是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>
- 删除本地仓库中A模块的jar包
- 修改%MAVEN_HOME%\conf\setttings.xml文件,项目B是依赖于私服仓库中模块A
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
-
clean清除项目B,再complie编译一次
-
查看日志信息是从私服仓库中下载
-
修改回原来的阿里云配置,私服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标签进行配置:
- 在依赖A项目下的version标签下编写exclusions
- exclusions中每个exclusion是一个要排除的jar包
- 只需指定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>
依赖冲突
依赖冲突的三种情况 | 依赖如何处理的 |
---|---|
两个直接依赖 | 以下面配置的为准 |
一个直接依赖一个间接依赖 | 以直接为准 |
两个间接依赖 | 以上面配置的为准 |
多环境配置
配置多环境流程
-
创建的maven工程,复制jdbc.properties到resources目录下
-
修改jdbc.properties中的jdbc.url=${jdbc.url}
-
在pom.xml中profiles下配置三个不同的环境:开发,生产,测试
-
在profile的properties中分别指定不同的jdbc.url属性值
-
分别选择不同的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>
- 指定resource的目录地址和开启替换的参数
<build>
<resources>
<!-- 指定资源的配置 -->
<resource>
<!-- 必须指定resource所在的目录 -->
<directory>${basedir}/src/main/resources</directory>
<!-- 指定是否替换 -->
<filtering>true</filtering>
</resource>
</resources>
</build>
- 运行package命令,查看target中的jar包中jdbc.properties中的url是否不同
- 也可以使用命令行方式执行,
mvn 指令 –P 环境定义id
三种开发模式
传统模式开发:传统开发方式是将这些业务集中在1个web项目中, 缺点是代码量大, 业务插拔不方便 。
模块开发:模块化开发业务清晰,维护方便,业务插拔较简单,缺点是各模块间仍然存在依赖 。
微服务开发:将各个业务拆分成多个独立的系统。
继承与聚合
分模块的作用:
- 项目架构一目了然,更清晰
- 有利于团队合作开发,不同的成员开发一个模块
- 代码的可维护性更强
- 更方便重用,例如:所有的工具类都写到一个utils工程中,不仅当前项目可以用,其他项目也可以用。
继承作用:
父项目:
抽取所有项目公用的配置和插件
锁定当前项目中各个子项目依赖的版本
子项目:
继承父项目,父项目的公用的配置就可以直接使用了
dependencyManagement元素:
- 作用:一旦在父项目中使用了版本锁定,就是统一控制各个组件的版本。
- 如果子项目继承父项目,父项目中版本锁定的包子项目是不能直接使用的。
- 如果要使用,需要在子项目添加依赖,但不需要指定版本号。
- 注:父项目中版本锁定的jar包,子项目中可以使用,也可以不使用