Maven
maven的相关概念
a) 构建的概念
b) 什么是maven
c) 为什么要用maven
1、Maven的下载及安装
2、创建第一个maven工程
a) Maven的工程结构
b) Maven的命令
3、Maven的Eclipse插件
a) 创建maven工程
b) 插件的配置
4、Maven的核心概念
a) 坐标
b) 继承
c) 依赖
d) 聚合
e) 生命周期
5、Maven的仓库管理
a) 中央仓库
b) 私服
1、都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行?
2、为什么在我的机器上可以正常打包,而配置管理员却打不出来?
3、项目组加入了新的人员,我要给他说明编译环境如何设置,但是让我挠头的是,有些细节我也记不清楚了。
4、我的项目依赖一些jar包,我应该把他们放哪里?放源码库里?
5、这是我开发的第二个项目,还是需要上面的那些jar包,再把它们复制到我当前项目的svn库里吧
6、现在是第三次,再复制一次吧 ----- 这样真的好吗?
7、我写了一个数据库相关的通用类,并且推荐给了其他项目组,现在已经有五个项目组在使用它了,今天我发现了一个bug,并修正了它,我会把jar包通过邮件发给其他项目组
-----这不是一个好的分发机制,太多的环节可能导致出现bug
8、项目进入测试阶段,每天都要向测试服务器部署一版。每次都手动部署,太麻烦了。
需要一个工具进行项目管理,对项目中的jar包进行管理、jar包的版本管理、项目的打包的流程管理。实现一步构建。
可以对项目进行构建。缺少生命周期的管理,需要自己手工定义。需要自己定义一个build.xml,缺少jar包的管理。对工程的目录结构没有约束。
拥有约定,知道你的代码在哪里,放到哪里去
拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程
只需要定义一个pom.xml,然后把源码放到默认的目录,Maven帮你处理其他事情
maven翻译为“专家”,“内行”。Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。
Maven主要有两个功能:
1、项目构建
2、依赖管理
Maven定义的工程构建生命周期
Maven就是一个工程构建工具。
Maven的官方网站:http://maven.apache.org/
使用的版本:apache-maven-3.0.5
Maven是使用java开发,需要安装jdk1.6以上,推荐使用1.7
第一步:安装jdk
第二步:把maven解压缩。
第三步:配置环境变量MAVEN_HOME.
D:\temp\javaee18\apache-maven-3.0.5
第四步:在path中添加%MAVEN_HOME%/bin
第五步:测试
Mvn -v测试
默认位置:~/.m2/repository
修改本地仓库路径,需要修改settings.xml
全局配置:%MAVEN_HOME%/conf/settings.xml
用户配置:在新的maven仓库的位置复制一个settings.xml
Project
|-src
|-main
|-java
|-resource
|-test
|-java
|-resource
|-target
|-pom.xml
编写pom.xml:
|
打包方式,默认是jar包。
mvn compile
mvn test
下载的插件:
mvn package
mvn install
mvn clean install
mvn clean compile
mvn clean package
工程骨架选择:
配置pom文件
<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.0modelVersion> <groupId>com.itheimagroupId> <artifactId>maven-secondartifactId> <version>0.0.1-SNAPSHOTversion> <dependencies> <dependency> <groupId>junitgroupId> <artifactId>junitartifactId> <version>4.12version> dependency> dependencies> project> |
注意:如果要依赖本地工程打成的jar包,需要先安装到本地仓库。
查找jar包的g-a-v可以使用http://search.maven.org/查找。
坐标、maven的依赖管理、生命周期、继承、聚合、插件。
groupId:定义当前Maven组织名称
artifactId:定义实际项目名称
version:定义当前项目的当前版本
packaging:定义该项目的打包方式,如果没有此项则默认为jar包。
常用的打包方式:jar、war、pom(只有一个pom文件)
就是项目中jar 包的管理。可以使用pom文件中定义jar包的坐标,管理依赖。
1.compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
2.test:测试依赖范围。只对于测试classpath有效
3.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
4.runtime:运行时提供。例如:jdbc驱动
如果不指定范围就是compile。对所有的classpath都生效。
Compile:不管依赖多少层,依赖都会向下传递。Test:不会向下传递依赖。
当第二直接依赖的范围是test的时候,依赖不会得以传递。
当第二依赖的范围是provided的时候,只传递第一直接依赖范围也为provided的依赖,且传递性依赖的范围同样为 provided;
当第二直接依赖的范围是runtime的时候,传递性依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递的依赖范围为runtime;
就近原则:如果本工程中配置jar包的版本和依赖传递过来的jar包的版本不一致,使用本工程配置的jar包版本。
本工程中配置同一个jar包的多个 版本,谁在后面配置使用谁。
在依赖的节点中添加一个optional选项,来缺点此jar包是否向下传递,如果为true就不传递,如果为false就传递,默认为false。
当依赖以及传递到本工程中,我们不想要jar包。需要排除。
Maven中有三大生命周期。
Clean
Default
Site
生命周期可以理解为构建工程的步骤。
pre-clean 执行一些需要在clean之前完成的工作
clean 移除所有上一次构建生成的文件
post-clean 执行一些需要在clean之后立刻完成的工作
Default生命周期Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段:
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 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。
运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包。此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要。
Site生命周期
pre-site 执行一些需要在生成站点文档之前完成的工作
site 生成项目的站点文档
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy 将生成的站点文档部署到特定的服务器上
这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。
在maven中几乎所有的功能都是通过插件来完成的。可以在pom文件中对插件进行配置。
<build> <plugins> <plugin> <groupId>org.apache.maven.pluginsgroupId> <artifactId>maven-compiler-pluginartifactId> <configuration> <source>1.7source> <target>1.7target> <encoding>UTF-8encoding> configuration> plugin> plugins> build> |
使用tomcat插件不需要本地安装tomcat。
第一步:创建一个web工程:
第二步:在pom文件中添加插件配置:
<build> <plugins> <plugin> <groupId>org.apache.tomcat.mavengroupId> <artifactId>tomcat7-maven-pluginartifactId> <configuration> <port>8080port> <path>/maven-webpath> configuration> plugin> plugins> build> |
第三步:启动tomcat
tomcat7:run
tomcat:run (默认为tomcat6)
工程之间继承继承的是一个pom文件的配置。
1、依赖的继承
2、Jar包版本的管理
3、插件版本的管理
父工程必须是pom工程。
子工程可以有两种方法创建:
1、改造现有工程
2、创建新工程
在父工程中定义jar包的版本,并不实际依赖。子工程中如果使用此jar包,需要添加依赖,可以不用添加版本号。
把独立的模块聚合成一个完整的工程。
需要使用一个pom工程实现。
创建一个聚合工程:
先创建一pom工程,然后创建maven模块。最终 把所有模块打包成一个war包。
启动的时候需要启动聚合工程。
1、配置tomcat插件
2、tomcat7:run
用来统一存储所有Maven共享构建的位置就是仓库。根据Maven坐标定义每个构建在仓库中唯一存储路径大致为:groupId/artifactId/version/artifactId-version.packaging
1、本地仓库
~/.m2/repository/
每个用户只有一个本地仓库
2、远程仓库
中央仓库:Maven默认的远程仓库,不包含版权资源
http://repo1.maven.org/maven2
私服:是一种特殊的远程仓库,它是架设在局域网内的仓库
需要使用Nexus来搭建私服。Nexus就是一个文本工程。War包。
只需要下载Nexus然后把war部署到tomcat即可。
http://localhost:8080/nexus-2.7.0-06
直接查询jar包的坐标。
管理私服,需要登录:
用户名:admin
密码:admin123
对外公布的仓库:
在本地仓库的settings.xml中配置mirrors节点就可以使用私服。
在本地仓库setting.xml中配置如下:
第一步:配置settings.xml
添加一个登录到私服的用户名和密码。
第二步:配置pom文件。
<distributionManagement> <repository> <id>releasesid> <name>Internal Releasesname> <url>http://localhost:8080/nexus-2.7.0-06/content/repositories/releases/url> repository> <snapshotRepository> <id>snapshotsid> <name>Internal Snapshotsname> <url>http://localhost:8080/nexus-2.7.0-06/content/repositories/snapshots/url> snapshotRepository> distributionManagement> |
第三步:mvn deploy部署