Maven
Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台。
课程内容的介绍
1. Maven基础内容
2. Maven的依赖管理
3. 聚合工程
4. Maven私服搭建
一、 Maven基础
1.Maven介绍
1.1为什么需要使用Maven
之前学Spring的时候我们需要单独自己去找相关的jar.这些jar包我们还能通过官网能找到,但是比如我们要找JSTL或者Hibernate验证jar及依赖包的时候我们并不是很容易的找的。所以我们希望有种更加方便管理我们jar的工具,Maven刚好能帮我们解决这个问题。
1.2Maven是什么?
官方的解释:
Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。 当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后 Maven 可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
Maven两大核心:
1. 依赖管理:就是对jar包的统一管理。
2. 构建项目:项目编码完成后,对项目的编译,测试,打包,部署等操作。
初学的时候对Maven的概念比较模糊,仅仅知道它可以管理我们的jar包和jar之间的依赖关系,但它的功能并不仅仅局限于此。我们通过安装使用管理来体验吧。
2. Maven的安装配置
2.1 官网下载
官网地址:https://maven.apache.org/download.cgi
下载Windows版本即可。
2.2 解压缩
将下载的压缩文件解压缩到非中文目录下即可。
2.3 配置Maven的环境变量
先配置MAVEN_HOME
然后将MAVEN_HOME追加到path变量之后。
2.4 验证
环境变量配置好后,我们就可以在系统的任意位置来使用Maven了。
3.仓库类型介绍
jar包查找的顺序:
中央仓库地址:https://mvnrepository.com
4.本地仓库配置
修改我们在Maven安装的配置文件。
修改IDEA中的Maven默认配置。
配置好后需要的jar依赖如果本地仓库没有的话就需要去中央仓库下载,但是中央仓库在国外,速度会很慢,这时我们可以配置镜像服务器,只需要在setting.xml中添加镜像地址即可。
<!-- 阿里代理镜像地址-->
<mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>*</mirrorOf>
</mirror>
配置了阿里云镜像代理后重启IDEA,可以看到新的依赖是通过镜像代理下载的。
5.创建基于Maven的Web项目
5.1 Web项目创建
选择相关的类型。
设置项目的相关信息。
核查Maven的配置信息。
初识项目结构。
我们需要自己手动添加相关的目录结构。
创建好的最终的目录结构:
5.2 Tomcat插件配置
5.2.1 pom文件中添加配置
<plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8080</port> <!-- 访问端口--><path>/</path> <!-- 访问路径--></configuration></plugin>
5.2.2 启动Tomcat
选中右侧侧边栏中的Maven点击。
启动成功。
访问成功。
二、依赖管理
Maven项目,依赖,构建配置,以及构件:所有这些都是要建模和表述的对象。这些对象通过一个名为项目对象模型(Project Object Model, POM)的XML文件描述。这个POM告诉Maven它正处理什么类型的项目,如何修改默认的行为来从源码生成输出。同样的方式,一个Java Web应用有一个web.xml文件来描述,配置,及自定义该应用,一个Maven项目则通过一个 pom.xml文件定义。该文件是Maven中一个项目的描述性陈述;也是当Maven构建项目的时候需要理解的一份“地图”。
1、Maven坐标
<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency>
</dependencies>
1.1 dependencies
在dependencies标签中添加需要添加的jar对应的Maven坐标。
1.2 dependency
一个dependency标签代表了一个Maven坐标。
1.3 groupId
团体、公司、小组、项目、或其他团体标识的体现,约定以创建这个项目的组织域名倒写开头。也是我们在本地仓库中查看依赖的目录结构。一个Maven坐标中是必须有的。
1.4 artifactId
在groupId下的表示一个单独的项目的唯一标识。同样是必须的。
1.5 version
一个项目的特定版本。也是必须的。
1.6 scope
依赖范围。
2、依赖冲突
2.1 冲突产生的根本原因
上图中a jar包通过b和d间接依赖到的c jar包版本不一致,出现了冲突。
2.2 依赖冲突的解决方案
2.2.1 第一优先声明原则
谁先定义就使用谁的。
2.2.2 路径就近原则
直接声明优先级更高。
2.2.3 排除依赖
我们在Maven坐标中可以通过exclusions标签来显示的排除掉简介依赖。
三、聚合工程
所谓聚合项目,实际上就是对项目分模块,互联网项目一般来说按照业务分(订单模块、VIP模块、支付模块、CMS模块…),传统的软件项目,大多采用分层的方式(Dao、Serivce、Controller):
1. 聚合工程的结构
bobo-parent pom 管理|-- bobo-manager pom 管理|-- bobo-manager-dao jar|-- bobo-manager-service jar|-- bobo-manager-model jar|-- bobo-manager-commons jar|-- bobo-manager-controller war
2.项目结构创建
2.1创建bobo-parent
2.2 创建bobo-manager
这也是一个POM工程,而且是bobo-parent下的一个子工程。
注意创建的module的父工程。
2.3 分别创建4个java工程
创建bobo-manager-dao
创建bobo-manager-service
创建bobo-manager-model
创建bobo-manager-commons
2.4 创建bobo-manager-controller
创建对应的web项目,选择对应的模板
等待初始化完成。
3. 依赖关系
3.1 依赖关系介绍
完整的依赖关系
控制层依赖关系
service层依赖关系
dao层的依赖关系
3.2 项目打包
bobo-parent打包在IDEA中会一性的给所有的子工程都打包。
3.3 依赖关系配置
controller依赖service。那就在Controller的pom文件中添加service的依赖。
service依赖dao。在service的pom文件中添加依赖。
dao依赖commons和model两个模块。
完整依赖关系图。
4.聚合工程的运行
4.1 创建UserBean
package com.bobo.model;public class User {private Integer id;private String userName;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}@Overridepublic String toString() {return "User{" +"id=" + id +", userName='" + userName + '\'' +'}';}
}
4.2 创建Dao
package com.bobo.dao;import com.bobo.model.User;public interface IUserDao {User queryUser();
}
package com.bobo.dao.impl;import com.bobo.dao.IUserDao;
import com.bobo.model.User;public class UserDaoImpl implements IUserDao {@Overridepublic User queryUser() {User user = new User();user.setId(666);user.setUserName("波波");return user;}
}
4.3 创建Service
package com.bobo.service;import com.bobo.model.User;public interface IUserService {User queryUser();
}
package com.bobo.service.impl;import com.bobo.dao.IUserDao;
import com.bobo.dao.impl.UserDaoImpl;
import com.bobo.model.User;
import com.bobo.service.IUserService;public class UserServiceImpl implements IUserService {private IUserDao dao = new UserDaoImpl();@Overridepublic User queryUser() {return dao.queryUser();}
}
4.4 创建Controller
创建Servlet
package com.bobo.servlet;import com.bobo.model.User;
import com.bobo.service.IUserService;
import com.bobo.service.impl.UserServiceImpl;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class UserServlet extends HttpServlet {private IUserService service = new UserServiceImpl();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {User user = service.queryUser();System.out.println(user);}
}
web.xml的配置
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name><servlet><servlet-name>userServlet</servlet-name><servlet-class>com.bobo.servlet.UserServlet</servlet-class></servlet><servlet-mapping><servlet-name>userServlet</servlet-name><url-pattern>/userServlet</url-pattern></servlet-mapping>
</web-app>
添加Tomcat插件
<plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8080</port> <!-- 访问端口--><path>/</path> <!-- 访问路径--></configuration></plugin>
</plugins>
4.5 运行
通过Tomcat插件运行。
访问
访问成功说明聚合工程搭建完成!
四 私服-Nexus
仓库管理器也叫私服或代理仓库
仓库管理器有两个服务目的:首先它的角色是一个高度可配置的介于你的组织与公开Maven仓库之间的代理,其次它为你的组织提供了一个可部署你组织内部生成的构件的地方。
1、Nexus介绍
Nexus是一个强大的Maven仓库管理器, 它极大地简化了自己内部仓库的维护和外部仓库的访问。利用Nexus你可以只在一个地方就能够完全控制访问和部署在你所维护仓库中的每个Artifact。Nexus是一套“开箱即用”的系统不需要数据库,它使用文件系统加Lucene来组织数据。 Nexus使用ExtJS来开发界面,利用Restlet来提供完整的REST APIs,通过m2eclipse与Eclipse集成使用。 Nexus支持WebDAV与LDAP安全身份认证。
2、Nexus安装
下载安装文件,可以自行去官网下载,也可以获取我提供给大家的源文件。
解压缩到一个非中文目录下即可。
在cmd下切换到Nexus的bin目录下执行 nexus install (以管理员身份进入)。
启动nexus服务 nexus start
测试访问:http://localhost:8081/nexus
默认的账号密码:admin admin123
3、Nexus介绍
3.1 仓库类型
3.2 默认仓库介绍
4、开启远程索引
获取提供给大家的索引文件。
停止Nexus服务。
将提供给大家的索引文件覆盖到%Nexus_Home%\sonatype-work\nexus\indexer\central-ctx文件夹下。
重启服务即可。
5、创建宿主仓库
6、创建代理仓库
虽然搭建了私服,但是如果私服中没有我们需要的jar包,它还是会通过默认的代理仓库去中央仓库下载相关的jar。这时速度同样会很慢,这时我们可以在Nexus中添加阿里的代理服务器。
配置的阿里云的镜像地址:http://maven.aliyun.com/nexus/content/groups/public/
7、创建仓库组
8、使用私服
想要在我们自己的Maven项目中关联我们自己配置的私服服务器。
在setting配置文件中添加server标签。
<!-- 配置私服服务 -->
<server><id>nexus</id><username>admin</username><password>admin123</password>
</server>
然后在setting配置文件的mirrors标签中添加私服仓库组的配置。
<!-- 去私服服务中查询 -->
<mirror><id>nexus</id><mirrorOf>*</mirrorOf><name>Human Readable Name for this Mirror.</name><url>http://localhost:8081/nexus/content/groups/DpbGroup/</url>
</mirror>
9、上传jar包到私服中
修改setting.xml文件。
<server><id>releases</id><username>admin</username><password>admin123</password>
</server>
<server><id>snapshots</id><username>admin</username><password>admin123</password>
</server>
然后需要修改对应的pom文件。
<!-- 配置上传私服路径 -->
<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命令。
在私服中收搜上传的jar包。
10、特定jar包上传
有些第三方的jar包是不存在与Maven的中央仓库中的。那么我们只能将这个jar包上传到Maven私服仓库中。
最后不要忘了 点击 Upload Artifact(s) 按钮。
11、从私服下载jar包
setting.xml文件中配置模板。
<profile><id>dev</id><repositories><repository><id>nexus</id><url>http://localhost:8081/nexus/content/groups/BoboGroup/</url><!--是否下载releases构件 --><releases><enabled>true</enabled></releases><!--是否下载snapshots构件 --><snapshots><enabled>true</enabled></snapshots></repository></repositories><pluginRepositories><pluginRepository><id>public</id><name>Public_Repositories</name><url>http://localhost:8081/nexus/content/groups/BoboGroup/</url></pluginRepository></pluginRepositories>
</profile>
激活模板。
<!-- 激活模板-->
<activeProfiles><activeProfile>dev</activeProfile>
</activeProfiles>
如果这样设置还是不能下载snapshots版本的依赖,那就在pom中添加如下的配置。
<repositories><repository><id>BoboGroup</id><url>http://localhost:8081/nexus/content/groups/BoboGroup/</url><!--是否下载releases构件 --><releases><enabled>true</enabled></releases><!--是否下载snapshots构件 --><snapshots><enabled>true</enabled></snapshots></repository>
</repositories>
效果如下。