一、开发中遇到的问题
1、都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行?
2、为什么在我的机器上可以正常打包,而配置管理员却打不出来?
3、项目组加入了新的人员,我要给他说明编译环境如何设置,但是让我挠头的是,有些细节我也记不清楚了。
4、我的项目依赖一些jar包,我应该把他们放哪里?放源码库里?
5、这是我开发的第二个项目,还是需要上面的那些jar包,再把它们复制到我当前项目的svn库里吧
6、现在是第三次,再复制一次吧 ----- 这样真的好吗?
7、我写了一个数据库相关的通用类,并且推荐给了其他项目组,现在已经有五个项目组在使用它了,今天我发现了一个bug,并修正了它,我会把jar包通过邮件发给其他项目组
-----这不是一个好的分发机制,太多的环节可能导致出现bug
8、 项目进入测试阶段,每天都要向测试服务器部署一版。每次都手动部署,太麻烦了。
二、maven
Maven是基于POM(工程对象模型),通过一小段描述来对项目的代码、报告、文件进管理的工具。
Maven是一个跨平台的项目管理工具,它是使用java开发的,它要依赖于jdk1.6及以上
Maven主要有两大功能:管理依赖、项目构建。
依赖指的就是jar包。
2.1什么是构建
绘制构建流程图
2.2构建过程
2.3项目构建的方式
1、 Eclipse
使用eclipse进行项目构建,相对来说,步骤比较零散,不好操作
2、 Ant
它是一个专门的项目构建工具,它可以通过一些配置来完成项目构建,这些配置要明确的告诉ant,源码包在哪?目标class文件应该存放在哪?资源文件应该在哪
3、 Maven
它是一个项目管理工具,他也是一个项目构建工具,通过使用maven,可以对项目进行快速简单的构建,它不需要告诉maven很多信息,但是需要安装maven去的规范去进行代码的开发。也就是说maven是有约束的。
三、maven的安装
3.1下载
下载完成后直接解压
3.2安装
第一步:配置maven的环境变量MAVEN_HOME D:\apache-maven-3.6.3
第二步:配置maven的环境变量PATH %MAVEN_HOME%\bin
第三步:测试maven是否安装成功,在系统命令行中执行命令:mvn –v
3.3 配置maven
在maven中有两个配置文件:用户配置、全局配置(默认)
3.3.1 全局配置
在maven安装目录的conf里面有一个settings.xml文件,这个文件就是maven的全局配置文件。
该文件中localRepository用来配置maven本地仓库的地址
默认在系统的用户目录下的m2/repository中,该目录是本地仓库的目录。
3.3.2 用户配置
用户配置文件的地址:~/.m2/settings.xml,该文件默认是没有,需要将全局配置文件拷贝一份到该目录下。
重新指定本地仓库地址,如果不指定,则默认是~/.m2/repository目录,如果用户配置文件不存在,则使用全局配置文件的配置。
3.3.3修改Maven中央仓库地址
Maven是当前流行的项目管理工具,但官方的库在国外经常连不上,连上也下载速度很慢。因此我们可以修改中央仓库地址为国内一些企业提供的地址。
修改 m a v e n . h o m e / c o n f 或 者 {maven.home}/conf或者 maven.home/conf或者{user.home}/.m2文件夹下的settings.xml文件,在标签下加入上述内容即可。如下:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
<!-- 阿里云仓库 -->
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
<!-- 中央仓库1 -->
<mirror>
<id>repo1</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo1.maven.org/maven2/</url>
</mirror>
<!-- 中央仓库2 -->
<mirror>
<id>repo2</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo2.maven.org/maven2/</url>
</mirror>
</mirrors>
</settings>
四、创建maven工程
4.1Maven工程结构
Project
|–src(源码包)
|–main(正常的源码包)
|–java(.java文件的目录)
|–resources(资源文件的目录)
|–test(测试的源码包)
|–java
|–resources
|–target(class文件、报告等信息存储的地方)
|–pom.xml(maven工程的描述文件)
4.2创建maven工程
4.2.1使用命令行创建
创建java工程
mvn archetype:generate -DgroupId=包名 -DartifactId=项目名称 -DarchetypeArtifactId=maven-archetype-quickstart
创建web工程
mvn archetype:generate -DgroupId=包名 -DartifactId=项目名称 -DarchetypeArtifactId=maven-archetype-webapp
4.2.2使用eclipse创建
右键—>Maven—>Maven Project,选择模板,填写包名,项目名称即可。
4.3Maven命令的使用
4.3.1 Maven compile
编译的命令
4.3.2 Maven clean
清除命令,清除已经编译好的class文件,具体说清除的是target目录中的文件
4.3.3 Maven test
测试命令,该命令会将test目录中的源码进行编译
4.3.4Maven package
打包命令
4.3.5 Maven install
安装命令,会将打好的包,安装到本地仓库
4.3.6组合命令
以上命令可以进行组合使用,如:
mvn clean compile
mvn clean test
mvn clean package
mvn clean install
五、M2Eclipse
5.1下载插件
5.2查看是否安装成功
5.3、设置maven安装路径
5.4、设置Maven的用户配置
5.5、创建工程
eclipse中创建maven工程可以分为两种,一种是使用模板创建,一种是不使用模板创建。
六、Maven的核心概念
6.1 坐标
6.1.1、 什么是坐标?
在平面几何中坐标(x,y)可以标识平面中唯一的一点。在maven中坐标就是为了定位一个唯一确定的jar包。
Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范
拥有了统一规范,就可以把查找工作交给机器
6.1.2、 Maven坐标主要组成
groupId:定义当前Maven组织名称
artifactId:定义实际项目名称
version:定义当前项目的当前版本
6.2 依赖管理
6.2.1、 依赖范围
其中依赖范围scope 用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:
1.compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
2.test:测试依赖范围。只对于测试classpath有效
3.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
4.runtime:运行时提供。例如:jdbc驱动
6.2.2 依赖传递
A、B、C
B工程依赖A工程,C工程依赖B工程,那么B工程是C工程的直接依赖,A工程是C工程的间接依赖
6.2.2.1创建MavenThird工程
第一步:创建mavenThird工程
第二步:创建MavenThird.java
第三步:创建TestMavenThird.java
6.2.2.2 分析第一解决依赖和第二直接依赖
6.2.2.3 依赖范围传递
上面第一行表示第二直接依赖范围
中间的交叉单元格表示传递性依赖范围。
总结:
Ø 当第二依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致。
Ø 当第二直接依赖的范围是test的时候,依赖不会得以传递。
Ø 当第二依赖的范围是provided的时候,只传递第一直接依赖范围也为provided的依赖,且传递性依赖的范围同样为 provided;
Ø 当第二直接依赖的范围是runtime的时候,传递性依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递的依赖范围为runtime;
6.2.3 依赖冲突
在maven中存在两种冲突方式:一种是跨pom文件的冲突,一致是同一个pom文件中的冲突。
6.2.3.1跨pom文件的冲突
MavenFirst的pom文件中依赖来junit的4.9版本,那边MavenSecond和MavenThird中都是使用了4.9版本。
如果MavenSecond中重新依赖junit的4.8版本,那么MavenSecond和MavenThird中都是使用了4.8本,这体现来依赖的就近使用原则。
依赖的jar包如下:
6.2.3.2同一个pom文件的冲突
6.2.4 可选依赖
Optional标签标示该依赖是否可选,默认是false。可以理解为,如果为true,则表示该依赖不会传递下去,如果为false,则会传递下去。
6.2.5 排除依赖
Exclusions标签可以排除依赖
6.3 生命周期
Maven有三个生命周期:clean生命周期、default生命周期、site生命周期
生命周期可以理解为项目构建的步骤集合。
生命周期是由多个阶段(Phase)组成。每个阶段都是一个完整的功能,比如mvn clean中的clean就是一个阶段。
6.3.1 Clean生命周期
pre-clean 执行一些需要在clean之前完成的工作
clean 移除所有上一次构建生成的文件
post-clean 执行一些需要在clean之后立刻完成的工作
mvn clean命令,等同于 mvn pre-clean clean。只要执行后面的命令,那么前面的命令都会执行,不需要再重新去输入命令。
有Clean生命周期,在生命周期又有clean阶段。
6.3.2 Default生命周期(重点)
validate
generate-sources
process-sources
generate-resources
process-resources 复制并处理资源文件,至目标目录,准备打包。
compile 编译项目的源代码。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。
process-test-classes
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package
package 接受编译好的代码,打包成可发布的格式,如 JAR 。
pre-integration-test
integration-test
post-integration-test
verify
install 将包安装至本地仓库,以让其它项目依赖。
deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。
在maven中,只要在同一个生命周期,你执行后面的阶段,那么前面的阶段也会被执行,而且不需要额外去输入前面的阶段,这样大大减轻了程序员的工作。
6.3.3 Site生命周期
pre-site 执行一些需要在生成站点文档之前完成的工作
site 生成项目的站点文档
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy 将生成的站点文档部署到特定的服务器上
6.4 插件
插件(plugin),每个插件都能实现一个阶段的功能。Maven的核心是生命周期,但是生命周期相当于主要指定了maven命令执行的流程顺序,而没有真正实现流程的功能,功能是有插件来实现的。
比如:compile就是一个插件实现的功能。
6.4.1 编译插件
6.4.2 Tomcat插件
默认输入tomcat:run去使用tomcat插件来启动web工程,但是默认的tomcat插件使用的tomcat版本是tomcat6
而目前主流的tomcat,是使用的tomcat7,需要手动配置tomcat插件
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
使用tomcat7来运行web工程,它的命令是:tomcat7:run
6.5、继承
创建继承项目
6.6、聚合
创建聚合项目
七、仓库
7.1、什么是Maven仓库
用来统一存储所有Maven共享构建的位置就是仓库。根据Maven坐标定义每个构建在仓库中唯一存储路径大致为:groupId/artifactId/version/artifactId-version.packaging
7.2、仓库的分类
- 本地仓库
默认在~/.m2/repository,如果在用户配置中有配置,则以用户配置的地址为准
- 远程仓库
中央仓库
- 私服