第一节 Maven传递依赖
1.1 什么是传递依赖?
当项目依赖一个jar包时,与这个jar包关联的其他jar包也会关联到当前项目,这种现象就是传递依赖。 比如A项目依赖B项目,B又依赖C项目, 此时A中也包含了C的依赖。
案例演示:
步骤1:创建Maven项目project01
project01的基本信息如下
groupId:com.qf.maven
artifactId:project01
version:1.0-SNAPSHOT
在pom文件中添加mysql jdbc驱动的依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
步骤2:创建Maven项目project02,在pom文件中添加project01的依赖
<dependency>
<groupId>com.qf.maven</groupId>
<artifactId>project01</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
观察 project02中的依赖:包含有mysql的驱动依赖
1.2 依赖传递出现的问题
依赖传递出现的问题: 经常出现jar包冲突, 解决方案: 1 直接排除指定的jar包 2 版本号限定原则
1.3 解决jar包冲突的方式(4种)
1.3.1 排除原则(常用)
<exclusions> <exclusion> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </exclusion> </exclusions>
1.3.2 版本号限定原则(常用)
<!-- 标记版本号 -->
<!--添加属性-->
<properties>
<mysql.version>5.1.42</mysql.version>
</properties>
<!--02版本锁定-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 依赖管理 -->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
1.3.3 路径就近原则(基本不用)
1.3.4 第一声明优先原则(基本不用)
注意:如果是直接依赖,不遵循第一声明原则,后面会覆盖前面的依赖
1.4 传递依赖对依赖范围的影响
A项目直接依赖 B项目 (最左边一列 A和B的依赖范围)
B项目直接依赖C 项目 (最上面一行B和C的依赖范围)
交叉点A和C的依赖范围
第二节 分模块构建项目
理解继承和聚合
继承
开发中多个项目有共同的jar包依赖,可以采用继承方式简化各个项目的pom文件,在父类的pom文件中依赖共同拥有的jar。继承是为了消除重复,如果将dao、service、web分开创建独立的工程则每个工程的pom.xml文件中的内容存在重复,比如:设置编译版本、锁定mysql的版本的等,可以将这些重复的配置提取出来在父工程的pom.xml中定义。 注意: 1.父级项目只能是pom打包方式。 2.子项目是一个Maven Module
聚合
项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在一起运行,比如:dao、service、web三个工程最终会打一个独立的war运行。 能够把项目的各个模块聚合在一起构建。一般用于分模块开发,最后整体打包发布。 注意: 1.根项目(模块)是一个pom项目。 2.子模块:Maven Module 3.每个模块写完后需要上传到私服 4.打包,需要整体打包找到最后的war项目使用Tomcat加载 实际中,我们会将一些庞大的项目拆分为若干模块进行开发 三层+MVC 如下: dao (包含实体类、utils)----------jar service------jar web----------war
2.2 案例演示继承和聚合
第一步:创建父工程,修改pom.xml文件
第二步:创建dao,并继承父工程
第三步:创建service,并继承父工程
第四步:创建web,并继承父工程
第五步:运行
注意:分模块开发项目编译、打包、安装需要使用使用父工程来整体操作。如果要操作单个子模块,最后先整体安装一次,因为单个子模块需要依赖信息。
方法1:在maven-web工程的pom.xml中配置tomcat插件运行 运行maven-web工程它会从本地仓库下载依赖的jar包,所以当maven-web依赖的jar包内容修改了必须及时发布到本地仓库,比如:maven-web依赖的maven-service修改了,需要及时将maven-service发布到本地仓库。 方法2:在父工程的pom.xml中配置tomcat插件运行,自动聚合并执行 推荐方法2,如果子工程都在本地,采用方法2则不需要子工程修改就立即发布到本地仓库,父工程会自动聚合并使用最新代码执行。 注意:如果子工程和父工程中都配置了tomcat插件,运行的端口和路径以子工程为准。
2.3 聚合与继承的关系
-
聚合是为了方便快速构件项目。对于聚合模块来说,它知道有哪些被聚合的模块,但那些模块不知道这个聚合模块的存在;
-
继承是为了消除重复配置。对于继承关系的父POM来说,它不知道有哪些子模块继承于它,但是子模块必须知道自己的父POM是什么。
第三节 私服
正式开发时,不同的项目组开发不同的工程。dao工程开发完毕,发布到私服。service从私服下载dao。
公司在自己的局域网内搭建自己的远程仓库服务器,称为私服,私服服务器即是公司内部的maven远程仓库,每个员工的电脑上安装maven软件并且连接私服服务器,员工将自己开发的项目打成jar并发布到私服服务器,其它项目组从私服服务器下载所依赖的构件(jar)。
3.1搭建私服环境
3.1.1下载nexus
Nexus 是Maven仓库管理器,通过nexus可以搭建maven仓库,同时nexus还提供强大的仓库管理功能,构件搜索功能等。下载地址:http://www.sonatype.org/nexus/archived/
3.1.2 安装nexus
cmd进入bin目录,执行nexus.bat install
3.1.3 卸载nexus
cmd进入nexus的bin目录,执行:nexus.bat uninstall
3.1.4 启动nexus
方法1: cmd进入bin目录,执行nexus.bat start 方法2: windows服务中直接启动nexus服务
如何验证启动成功:查看nexus的配置文件conf/nexus.properties
# Jetty section application-port=8081 # nexus的访问端口配置 application-host=0.0.0.0 # nexus主机监听配置(不用修改) nexus-webapp=${bundleBasedir}/nexus # nexus工程目录 nexus-webapp-context-path=/nexus # nexus的web访问路径 # Nexus section nexus-work=${bundleBasedir}/../sonatype-work/nexus # nexus仓库目录 runtime=${bundleBasedir}/nexus/WEB-INF # nexus运行程序目录 访问: http://localhost:8081/nexus/ 使用Nexus 内置账户admin/admin123登陆: 点击右上角的Log in,输入账号和密码 登陆
私服仓库类型
nexus的仓库有4种类型:
1. hosted,宿主仓库,部署自己的jar到这个类型的仓库,包括releases和snapshot两部分,Releases公司内部发布版本仓库、 Snapshots 公司内部测试版本仓库 2. proxy,代理仓库,用于代理远程的公共仓库,如maven中央仓库,用户连接私服,私服自动去中央仓库下载jar包或者插件。 3. group,仓库组,用来合并多个hosted/proxy仓库,通常我们配置自己的maven连接仓库组。 4. virtual(虚拟):兼容Maven1 版本的jar或者插件 nexus仓库默认在sonatype-work目录中:
3.3 将项目发布到私服
1. 把dao模块上传到私服(如果上述setting.xml文件中配置过再次检查是否配置完整正确): 第一步:配置私服地址 1. 在settings.xml添加: <server> <id>releases</id> <username>admin</username> <password>admin123</password> </server> <server> <id>snapshots</id> <username>admin</username> <password>admin123</password> </server> 2.在当前项目的pom.xml文件添加: <!-- 配置远程发布到私服,mvn deploy --> <distributionManagement> <repository> <id>releases</id> <url>http://localhost:8081/nexus/content/repositories/releases/</url> </repository> <snapshotRepository> <id>snapshots</id> <url>http://localhost:8081/nexus/content/repositories/snapshots/</url> </snapshotRepository> </distributionManagement> 第二步: 运行 deploy命令,不同开发工具会有差异。 如果所有配置正确,发现上传私服失败,需要进入私服找到指定仓库 Repository--- Access Settings--Deployment Policy修改为允许发布
3.4 从私服下载jar包
3.service模块从私服下载dao包 1.1、在settings.xml文件中 <profile> <id>dev</id> <repositories> <repository> <id>nexus</id> <name>nexus</name> <url>http://localhost:8081/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 --> <pluginRepository> <!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 --> <id>public</id> <name>Public Repositories</name> <url>http://localhost:8081/nexus/content/groups/public/</url> </pluginRepository> </pluginRepositories> </profile> 2.激活私服 <!-- 激活 --> <activeProfiles> <activeProfile>dev</activeProfile> </activeProfiles> 注意: 私服一般安装在内网的其他服务器上,而不是本机上。因此上面的配置中localhost的部分在实际情况中应该修改为公司中内网的私服服务器地址。