Maven
自动化构建项目
构建过程中的几个主要环节
- 清理:删除以前的编译结果,为重新编译做好准备。
- 编译:将Java源程序编译为字节码文件。
- 测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
- 报告:将每一次测试后以标准的格式记录和展示测试结果。
- 打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对象war包。
- 安装:在Maven环境下特指将打包的结果——Jar包或War包安装到本地仓库中。
- 部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。
查看Maven版本(需要配置环境变量)
mvn -v
核心概念
约定的目录结构
Maven要想自动编译,那么他必须知道Java源文件在哪,所以需要约定目录结构。
HelloWorld(根目录)
|---src(原码)
|---|---main(主程序)
|---|---|---java(源文件)
|---|---|---resources(框架或其他工具的配置文件)
|---|---test(测试程序)
|---|---|---java
|---|---|---resourses
|---pom.xml(核心配置文件)
POM
Project Object Model 项目对象模型
核心的配置文件,与构建相关的一切设置都在这个文件中进行配置。
坐标
使用三个向量在仓库中唯一定位一个Maven工程。gav
- groupid: 公司或组织域名倒序+项目名 — < groupid > com.wxy.maven </ groupid >
- artifactid: 模块的名称 — < artifactid > HelloMaven </ artifactid>
- version: 版本 — < version > 3.4.5 </ version >
坐标与仓库路径的关系:
groupid/artifactid/version/artifactid-version.jarp
依赖
项目需要的Maven工程,在仓库中查找。
对于我们自己开发的Maven工程,使用install命令就可以进入仓库。
mvn install
依赖的范围
<scrop>compile </scrop><!-- main + test+ 打包-->
test <!-- test -->
provided <!-- 只在开发时 -->
依赖的传递性
非compile的依赖不能传递
依赖的排除
在dependency标签中加入如下(会影响后续的项目):
<exclusions>
<exclusion>
<groupId>需要排除依赖的groupId</groupId>
<artifactId>需要排除依赖的artifactId</artifactId>
</exclusion>
</exclusions>
依赖的原则
解决模块工程之间jar包冲突问题:
- 当有同名不同版本jar包被传递依赖时,路径最短者优先
- 路径相同时,先声明者(dependency标签的声明顺序)优先
统一管理依赖的版本
1.使用properties标签,在其内部使用自定义标签同一声明版本号
2.在需要统一版本的位置,使用${自定义标签名}应用声明的版本号
3.使用properties标签不止能配置版本号,凡是需要同一声明再引用的场合都可以用
仓库
分类
本地仓库(当前电脑上部署的仓库目录)
远程仓库(私服【局域网】+中央仓库【Internet】+中央仓库镜像【分担中央仓库流量、提高访问速度】)
保存的内容
Maven工程:
- 自身所需要的插件
- 第三方框架或工具的jar包
- 我们自己开发的Maven工程
生命周期、插件、目标
生命周期:
- 各个构建环节的执行顺序
- 核心程序定义了抽象的生命周期,生命周期中各个阶段的具体任务是由插件来完成的
- 包含三个(clean–default–site)
- 为了更好的实现自动化构建,不论现在要执行哪一个阶段,都是从这一个生命周期最开始的位置执行
插件和目标:
- 生命周期的各个阶段仅仅定义了要执行的任务是什么
- 各个阶段的插件和目标是对应的
- 相似的目标有特定的插件来完成
- 可以将目标看做“调用插件的命令”
继承
由于test范围的依赖不能继承,所以会分散在各个模块中,很容易造成版本不一致。
为了同一管理各个模块工程中,对test范围的依赖版本。
可以将test范围依赖统一提取到“父”工程中,在子工程中声明test范围依赖不指定版本,以父工程统一设定为准,同时也便于修改。
聚合
一键安装各个模块工程.
常用Maven命令
执行与构建过程(编译、测试、打包等)相关的Maven命令,必须进入pom.xml所在的目录
- mvn clean:清理
- mvn compile:编译(主程序)
- mvn test-compile:编译(测试程序)
- mvn test:执行测试
- mvn package:打包
- mvn install:安装
- mvn site:生成站点
- mvn deploy:部署
关于联网的问题
Maven的核心程序中仅仅定义了抽象的声明周期,但是具体的工作必须由特定的插件来完成。而插件本身不包含在Maven核心程序中。但我们执行Maven命令需要用到某些插件时,Maven核心程序会首先到本地仓库中查找。
修改远程仓库(添加镜像)
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
在eclipse中使用Maven
现在的eclipse都内置了Maven插件,在修改设置后可以直接使用:window-Preference-Maven
- Installations:Maven安装路径,不建议使用eclipse自带的版本 ,不稳定
- User settings:指定conf/setting.xml的位置,进而获取本地仓库的位置
eclipse中的Maven工程默认是JDK1.5,修改默认配置可在setting.xml内插入如下:
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activate>
<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>
在eclipse中执行Maven命令
pom.xml右键 Run As,选择命令。
eclipse导入Maven工程
Import–Maven
继承
由于test范围的依赖不能继承,所以会分散在各个模块中,很容易造成版本不一致。
为了同一管理各个模块工程中,对test范围的依赖版本。
可以将test范围依赖统一提取到“父”工程中,在子工程中声明test范围依赖不指定版本,以父工程统一设定为准,同时也便于修改。
操作步骤:
- 创建一个Maven工程作为父工程,pom.xml中插入一下:(注意:打包方式为Pom)
<groupId>com.xxx.xxx</groupId>
<artifactId>xxxx</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
- 在子工程中声明对父工程的引用
<!-- 子工程中声明父工程 -->
<parent>
<groupId>com.xxx.xxx</groupId>
<artifactId>xxxx</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 以当前文件为基准的父工程pom.xml文件的相对路径 -->
<relativePath>../xxxx/pom.xml</relativePath>
</parent>
- 将子工程的坐标中与父工程坐标中重复的内容删除
- 在父工程中统一管理test范围的依赖,加入如下:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 在子工程中删除test范围依赖的版本号部分
配置完成后,执行安装命令要先安装父工程
聚合
一键安装各个模块工程.
在一个“总的聚合工程”中配置各个参与聚合的模块,然后对聚合工程的pom.xml执行maven install即可一键安装。
<modules>
<!-- 相对路径 -->
<module>../x</module>
<module>../xx</module>
<module>../xxx</module>
</modules>
Web的自动部署
在pom.xml文件中添加如下:
然后执行 mvn deploy
<!--配置当前工程构建过程中的特殊设置 -->
<build>
<finalName>AtguiguWeb</finalName>
<!-- 配置构建过程中需要使用的插件 -->
<plugins>
<plugin>
<!-- cargo是一家专门从事启动Servlet容器的组织 -->
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.2.3</version>
<!-- 针对插件进行的配置 -->
<configuration>
<!-- 配置当前系统中容器的位置 -->
<container>
<containerId>tomcat6x</containerId>
<home>D:\DevInstall\apache-tomcat-6.0.39</home>
</container>
<configuration>
<type>existing</type>
<home>D:\DevInstall\apache-tomcat-6.0.39</home>
<!-- 如果Tomcat端口为默认值8080则不必设置该属性 -->
<properties>
<cargo.servlet.port>8989</cargo.servlet.port>
</properties>
</configuration>
</configuration>
<!-- 配置插件在什么情况下执行 -->
<executions>
<execution>
<id>cargo-run</id>
<!-- 生命周期的阶段 -->
<phase>install</phase>
<goals>
<!-- 插件的目标 -->
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>