文章目录
Maven
第一阶段:注重基础,编程思想的锻炼。单机版,socket
第二阶段:注重web编程的原理,web工作模式,网络版。
第三阶段:注重框架的使用。框架就是半成品, 提高开发的效率,提高项目可重用性、可扩展性、安全性、可靠性。兼顾原理
第四阶段:分布式集群框架。提高项目的高可用、高负载、高性能。
第一节 Maven简介
1.1 简介
Maven 翻译为"专家"、“内行”,是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM,Project Object Model)概念,Maven利用一个中央仓库能管理一个项目的构建、报告和文档等步骤。
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。。
官网地址:http://maven.apache.org/
1.2 Maven核心功能
传统项目的问题:
1 需要把jar复制到项目中,繁琐
2 项目体积更大,不利于维护
3 不利于团队开发
Maven主要有两大核心功能:
1. 依赖管理。(jar包的管理)
2. 项目构建。(清理、编译、单元测试、打包、安装、部署、运行)在idea中利用他的功能
第二节 Maven环境配置
Maven 是一个基于 Java 的工具,所以要做的第一件事情就是安装 JDK。(略)
2.1 下载Maven库
下载地址:http://maven.apache.org/download.cgi
推荐版本:apache-maven-3.5.0
2.2 解压下载库认识Maven库目录
备注: 解压文件尽量不要放在含有中文或者特殊字符的目录下。
bin:含有mvn运行的脚本
boot:含有plexus-classworlds类加载器框架
conf:含有settings.xml配置文件
lib:含有Maven运行时所需要的java类库
LICENSE.txt, NOTICE.txt, README.txt针对Maven版本,第三方软件等简要介绍
2.3 配置Maven环境变量
1.右键我的电脑(或者计算机)-属性-高级系统设置-高级-环境变量-系统变量-新建MAVEN_HOME,值为maven的安装目录
2.把%MAVEN_HOME%\bin;追加到Path变量的值后面
3.检验是否成功:cmd-> mvn -v 或 mvn -version
4.修改配置文件:maven安装目录下conf目录中settings.xml
2.4 配置Maven仓库
Maven使用仓库管理各种jar包和插件。
Maven仓库分为:本地仓库(local)、远程仓库(remote)两大类
本地仓库: 本地电脑中的仓库。默认位置为: ${user:home}/.m2/repository
远程仓库: 远程仓库又包括:中央仓库+私服+其它公共远程仓库 (比如阿里、163等)
中央仓库:是maven自带的远程仓库,默认地址:https://repo.maven.apache.org/maven2,由于默认中央仓库的服务器在国外,下载会比较慢,一般需要配置使用国内的公共远程仓库作为中央仓库镜像。注意配置了中央仓库镜像就不再走默认中央仓库。
私服:是架设在本机或者局域网中的一种特殊的远程仓库,通过私服可以方便的管理其它所有的外部远程仓库
在maven的conf目录中找到
<!--第一个位置在根节点下添加本地仓库位置-->
<localRepository>D:\Repositories\Maven</localRepository>
<!--第二个位置,在mirrors节点下添加 中央仓库镜像-->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<!--第三个位置,在profiles节点下添加 jdk版本全局配置,因为默认为1.5-->
<profile>
<id>jdk18</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
检索顺序:先检索本地仓库--再检索远程仓库--最后检索中央仓库
具体可看下图示例
第三节 Maven入门
3.1 Maven程序目录结构
约定大于配置:能使用约定好的方式,就不要配置。
手动创建:
maven_hello
----src
-------main
----------java
-------------per
-----------------damon
--------------------Hello.java
resources
webapp (web项目)
-------test
----------java
-------------per
-----------------damon
-------------------test
----------------------HelloTest.java
----------resources
-----pom.xml
src/main/java:存放项目的.java文件
src/main/resources:存放项目资源文件。如配置文件
src/test/java:存放所有测试的.java文件.如Junit测试类
src/test/resources:测试资源文件
【target:项目输出位置(可以自动生成)】
pom.xml(maven项目核心配置文件)
pom.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--组织id per.damon.maven GAV坐标 -->
<groupId>per.damon.maven</groupId>
<!--项目名 模块名-->
<artifactId>maven_hello</artifactId>
<!--项目版本 SNAPSHOT 快照 不稳定版本 RELEASE 发布版 稳定-->
<version>1.0-SNAPSHOT</version>
<!--打包形式 jar包-->
<packaging>jar</packaging>
<!--依赖-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
使用命令创建(了解)
mvn archetype:generate -DgroupId=com.qf.maven -DartifactId=maven02 -DinteractiveMode=false -DarchetypeCatalog=internal
3.2 Maven常见命令
Maven的另一个核心功能是项目构建。
构建包括:清理、编译、测试、打包、安装、部署、运行等。这些过程都可以使用Maven命令来完成。
每个maven命令都有相对于的插件来完成。
3.2.1 clean
3.2.2 compile
3.2.3 test
3.2.4 package
3.2.5 install
3.2.6 其他命令
mvn deploy:部署,部署到私服
mvn tomcat:run:运行
3.3 Maven构建生命周期
1. Clean:项目构建前的清理操作
2. Default(Build): 核心生命周期核心过程:编译,测试,运行,打包等等
3. Site:项目站点文档创建。
3.4 Maven POM文件
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。
执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。
POM 中可以指定以下配置:
项目依赖
插件
执行目标
项目构建 profile
项目版本
项目开发者列表
相关邮件列表信息
基本的pom.xml文件
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
<groupId>com.companyname.project-group</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>project</artifactId>
<!-- 版本号 SNAPSHOP快照版 RELEASE发布版-->
<version>1.0-SNAPSHOT</version>
<!--打包形式 例如jar、war、ear、pom-->
<packaging>jar</packaging>
</project>
所有 POM 文件都需要 project 元素和三个必需元素:groupId,artifactId,version。这个必须元素叫做坐标(GAV)
3.5 Maven引入外部依赖
pom.xml 的 dependencies 列表列出了我们的项目需要构建的所有外部依赖项。
<dependencies>
<!--坐标GAV-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
第四节 使用开发工具创建Maven项目
4.1 Idea配置Maven
第一步 :安装插件
Idea自带maven插件,目前Idea不需要安装。
第二步:配置Maven
在Idea的启动初始界面,打开:Configure-->Settings-->Build,Execution,Deployment-->Maven
如下图:
在Importing中,选择自动导入依赖
第三步:Idea创建Maven工程
pom.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>per.damon.maven</groupId>
<artifactId>hellomaven</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
添加依赖
上网搜索依赖进行添加: 推荐网站:http://mvnrepository.com/
示例:
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
</dependencies>
Scope:声明jar包的存活时间
取值说明:
1、provided:编译和测试时需要,打包和运行不需要 例如servlet-api jsp-api(tomcat中有这两个api)
2、compile(默认值):编译、测试、运行、打包需要 druid dbutils fileupload jstl
3、runtime:测试、运行、打包需要 mysql驱动(编译阶段sql语句只是字符串)
4、test:测试 例如junit
5、system:编译和测试时需要,显示引用,Maven不会检索
安装jar包到本地仓库命令
mvn install:install-file -DgroupId=per.damon -DartifactId=validatecode -Dversion=1.0.0 -Dpackaging=jar -Dfile=ValidateCode.jar
依赖范围:
A 依赖B,需要再A的pom.xml文件中添加B的坐标,添加坐标时需要指定依赖范围,依赖范围包括:
(1)compile:编译范围, 编译范围的依赖会在编译,测试,运行,打包(war)都会使用依赖jar包
(2)provided:提供依赖,provided依赖在编译,测试时需要,运行,打包都不会包含。
(3)runtime:运行依赖,runtime依赖在运行、测试、打包的需要,但在编译的时候不需要,比如:jdbc的驱动包
(4)test:测试依赖,在编译和运行时不需要,他们只有在测试编译和测试运行时使用, 比如junit,也不会被打包
(5)system:系统依赖,system依赖与provided类似,但是你必须显示的提供一个对于本地系统中jar文件的路径,需要指定systemPath磁盘路径,system依赖不推荐使用。
依赖范围 | 编译 | 测试 | 运行 | 打包(war) | 例子 |
---|---|---|---|---|---|
compile | yes | yes | yes | yes | beanutils、fileupload |
test | no | yes | no | no | junit |
provided | yes | yes | no | no | serlvet-api、jsp-api |
runtime | no | yes | yes | yes | jdbc驱动 |
system | yes | yes | no | no | 本地jar包。maven仓库之外的jar包 |
注意:打包jar包时,不会包含任何依赖包的。
默认依赖范围:compile
依赖范围由强到弱的顺序是:compile-->provided-->runtime-->test
第五节 Maven传递依赖
5.1 什么是传递依赖?
当项目依赖一个jar包时,与这个jar包关联的其他jar包也会关联到当前项目,这种现象就是传递依赖。
比如A项目依赖B项目,B又依赖C项目, 此时A中也包含了C的依赖。
5.2 依赖传递出现的问题
依赖传递出现的问题: 经常出现jar包冲突,
解决方案:1 直接排除指定的jar包 2版本号限定原则
5.3 解决jar包冲突的方式(4种)
5.3.1 排除原则(常用)
<exclusions>
<exclusion>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</exclusion>
</exclusions>
5.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>
5.3.3 路径就近原则(基本不用)
5.3.4 第一声明优先原则(基本不用)
第六节 分模块构建项目
将商城项目拆分为多个模块开发:
父模块(工程)
dao
service
web
6.1理解继承和聚合
继承
开发中多个项目有共同的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
6.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插件,运行的端口和路径以子工程为准。
6.3 聚合与继承的关系
- 聚合是为了方便快速构件项目。对于聚合模块来说,它知道有哪些被聚合的模块,但那些模块不知道这个聚合模块的存在;
- 继承是为了消除重复配置。对于继承关系的父POM来说,它不知道有哪些子模块继承于它,但是子模块必须知道自己的父POM是什么。
第七节 私服
正式开发时,不同的项目组开发不同的工程。dao工程开发完毕,发布到私服。service从私服下载dao。
公司在自己的局域网内搭建自己的远程仓库服务器,称为私服,私服服务器即是公司内部的maven远程仓库,每个员工的电脑上安装maven软件并且连接私服服务器,员工将自己开发的项目打成jar并发布到私服服务器,其它项目组从私服服务器下载所依赖的构件(jar)。
7.1搭建私服环境
7.1.1下载nexus
Nexus 是Maven仓库管理器,通过nexus可以搭建maven仓库,同时nexus还提供强大的仓库管理功能,构件搜索功能等。下载地址:http://www.sonatype.org/nexus/archived/
7.1.2 安装nexus
cmd进入bin目录,执行nexus.bat install
7.1.3 卸载nexus
cmd进入nexus的bin目录,执行:nexus.bat uninstall
7.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,输入账号和密码 登陆
7.2 私服仓库类型
nexus的仓库:
nexus的仓库有4种类型:
- hosted,宿主仓库,部署自己的jar到这个类型的仓库,包括releases和snapshot两部分,Releases公司内部发布版本仓库、 Snapshots 公司内部测试版本仓库
- proxy,代理仓库,用于代理远程的公共仓库,如maven中央仓库,用户连接私服,私服自动去中央仓库下载jar包或者插件。
- group,仓库组,用来合并多个hosted/proxy仓库,通常我们配置自己的maven连接仓库组。
- virtual(虚拟):兼容Maven1 版本的jar或者插件
nexus仓库默认在sonatype-work目录中:
7.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修改为允许发布
7.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的部分在实际情况中应该修改为公司中内网的私服服务器地址。