maven简介
一、maven 的用途和目录结构
- Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理
- maven 项目的目录结构如下:
二、maven 的安装配置和 POM
1、maven 的安装配置
- 下载压缩包后解压即可,需要在命令行中使用的话,需要在系统的环境变量中配置(bin 目录配置到 path 变量);
- 和 IDE 集成:idea 自带 maven 的相关功能,低版本 eclipse 需要手动安装 maven 插件,高版本则集成了 maven 插件,可以直接使用;
2、POM(项目对象模型)
- maven 是基于项目对象模型的,maven 工程的核心配置文件是一个名为 pom 的 xml 文件,maven 根据其中的配置进行项目的构建和管理;
- pom xml 文件中可以配置:项目依赖、插件、执行目标、项目构建 profile、项目版本、项目开发者列表和相关邮件列表信息等;
- super POM 的概念:就是 maven 的默认配置,所有的 pom 都会继承这个 pom,可以使用以下命令来查看 Super POM 默认配置:mvn help:effective-pom;
三、maven 的生命周期clean 、 build 、 cite
1、clean 生命周期:项目清理的处理
- pre-clean:执行一些需要在clean之前完成的工作;
- clean:移除所有上一次构建生成的文件,target 目录下的所有文件会被删除;
- post-clean:执行一些需要在clean之后立刻完成的工作;
注意:调用其中的任何一个命令最后都是执行这个命令及其之前的命令,这个的前提是在同样的大的生命周期内
2、build 生命周期:项目部署的处理
- 大致的生命周期是这样的(细分的话应该有 23 个阶段)
补充说明
- 添加 maven-antrun-plugin 插件可以在 maven 执行的各个阶段附加执行一些额外的任务
- 要执行 deploy 的话需要在 distributionManagement 里指定部署的位置
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>validate</id>
<phase>validate</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>validate phase</echo>
</tasks>
</configuration>
</execution>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>compile phase</echo>
</tasks>
</configuration>
</execution>
<execution>
<id>test</id>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>test phase</echo>
</tasks>
</configuration>
</execution>
<execution>
<id>package</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>package phase</echo>
</tasks>
</configuration>
</execution>
<execution>
<id>deploy</id>
<phase>deploy</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>deploy phase</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
<distributionManagement>
<repository>
<id>internal.repo</id>
<name>Internal repo</name>
<url>file://D:/deployDir</url>
</repository>
</distributionManagement>
3、cite 生命周期:项目站点文档创建的处理
- pre-site:执行一些需要在生成站点文档之前完成的工作;
- site:生成项目的站点文档;
- post-site: 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备;
- site-deploy:将生成的站点文档部署到特定的服务器上;
可能出现的问题
- 执行
mvn site
命令的时候出现 class not found 错误,一般是site 插件缺少依赖,直接配置即可
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.7</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.doxia</groupId>
<artifactId>doxia-site-renderer</artifactId>
<version>1.8</version>
</dependency>
</dependencies>
</plugin>
- site 命令执行完成后target 文件夹下的site目录里面没有html文件,这里就需要添加两个报告插件了
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.10.4</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>2.9</version>
</plugin>
</plugins>
</reporting>
maven 基础
一、配置文件 & 仓库 & 插件
1、maven 构建配置文件
maven 配置文件
- 全局配置文件:maven 安装目录 conf 文件夹下的 settings xml
- 用户级配置文件:用户目录下 .m2 文件夹下的 settings xml,这个文件原本是没有的可以从 maven 的安装目录拷贝过来
- 项目级配置文件:就是项目中的 pom xml 文件,我们修改配置文件一般都是改这个,很少有改全局和用户级别的
项目配置文件(这里不是指pom文件)的激活:
- 工程在不同的环境有不同的配置文件,在 pom 文件中通过 profile 来设置多个配置文件的使用
- 配置好的 profile 有多种不同的激活方法,本质上都是通过触发指定的任务将要使用的配置文件复制到输出目录
- 1、使用命令控制台输入显式激活:
mvn test -Ptest
- 2、通过 maven 设置:两个 maven 的 settings 文件加入下面的配置即可指定
<activeProfiles>
<activeProfile>test</activeProfile>
</activeProfiles>
- 3、基于环境变量(用户或者系统变量)
- 4、操作系统设置(比如说,Windows系列)
- 5、文件的存在或者缺失,此方法和以上的两种都是都是通过 activation 节点来设置的
<profiles>
<profile>
<id>test</id>
<activation>
<property>
<name>env</name>
<value>test</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>Using env.test.properties</echo>
<copy file="src/main/resources/env.test.properties" tofile="${project.build.outputDirectory}/env.properties" overwrite="true"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
2、maven 仓库:就是 maven 存放 jar 的地方
本地仓库
- 第一次执行 maven 命令的时候会自动创建,默认是在用户目录下的 .m2/respository;
- 也可以指定一个具体的目录作为本地仓库,具体的操作就是将 maven conf 文件夹的 settings 配置文件做如下的修改:
<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">
<localRepository>C:/MyLocalRepository</localRepository>
</settings>
中央仓库
- maven 社区管理的远程仓库,需要联网访问,由于国内网络的原因速度会比较慢
远程仓库
- 开发人员自己定制的仓库,要使用自己的远程仓库需要在 pom 文件做如下的配置
<repositories>
<repository>
<id>companyname.lib1</id>
<url>http://download.companyname.org/maven2/lib1</url>
</repository>
<repository>
<id>companyname.lib2</id>
<url>http://download.companyname.org/maven2/lib2</url>
</repository>
</repositories>
- 有些依赖 maven 的中央仓库没有,可以自行将 jar 下载到本地,在发布到本地的maven库,这里以 kaptcha 为例
mvn install:install-file -Dfile=d:\kaptcha-2.3.jar -DgroupId=com.google.code -DartifactId=kaptcha -Dversion=2.3 -Dpackaging=jar
- 自己下载的 jar 除了上面的方法,还可以作为外部依赖加入到 maven 工程中,配置基本和普通的依赖是一样的
<dependency>
<groupId>ldapjdk</groupId>
<artifactId>ldapjdk</artifactId>
<scope>system</scope>
<version>1.0</version>
<systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath>
</dependency>
仓库的搜索顺序
- 本地–中央–远程(最后都是下载到本地仓库,然后从本地仓库中取用)
配置阿里云仓库
maven 社区的中央仓库速度慢,用阿里的提速效果很好
- 首先配置 maven conf settings
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
- 然后配置工程的 pom 文件
<repositories>
<repository>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
如果公司有设置防火墙,并通过代理服务器连接外网,那就需要找到 maven 目录里 conf 文件夹下的 settings 文件搜索 proxy,在相应的位置设置好代理服务器才能下载依赖
3、maven 插件
- Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成
- maven的插件分为两类:构建插件(在build节点里定义)、报告插件(在reporting节点里定义)
插件配置使用
- 每个插件可以有多个目标(goals),可以绑定多个任务(tasks);
- 插件使用命令:
mvn 插件名:目标名
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<id>id.clean</id>
<phase>clean</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>clean phase</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
二、maven 基础应用
1、maven 构建 java 工程
- 现在无论是 idea 还是 eclipse 都是可以直接创建 maven 工程的,低版本可能需要安装插件之类的
- pom 文件里通过插件可以指定编译的环境,还能通过一系列maven命令来实现从项目构建到打包发布等动作
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
2、maven 构建 web 项目
- 项目可以自己打包到web容器运行,也可以使用maven提供的容器:
mvn tomcat7:run
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/${project.build.finalName}</path>
</configuration>
</plugin>
maven 进阶
一、maven 快照(snapshot)
1、背景
- 一个大型的项目往往包含多个模块
- 多个模块进行开发的时候,一个模块可能会依赖于另一些模块
- 被依赖的模块很可能还在进行 bug 修复或者功能的增强,会经常发布更迭的版本
- 要用到这个经常变动的模块的其他模块就需要经常更新自己的 pom 文件以获得最新的版本,这样就比较麻烦了
2、快照
- 快照是一种特殊的版本,指定了某个当前的开发进度的副本
- 不同于常规的版本,Maven 每次构建都会在远程仓库中检查新的快照
- 也就是说使用快照的话,我们就不需要手动去更新依赖的模块的最新版本了
- 强制使用最新快照版本进行构建可以使用命令:
mvn clean package -U
- 快照具体的使用就是在配置依赖的时候将 version 节点的内容改成
<dependencies>
<dependency>
<groupId>data-service</groupId>
<artifactId>data-service</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>
二、maven 的自动化构建&依赖管理&自动化部署
1、构建自动化
场景
- 一个团队正在开发一个项目 bus-core-api, 并且有其他两个项目 app-web-ui 和 app-desktop-ui 依赖于这个项目
- 自动化构建要达成的目的是:在一个项目成功构建完成后(bus-core-api),其相关的依赖工程即开始构建(app-web-ui 和 app-desktop-ui),这样可以保证其依赖项目的稳定
使用 Maven
- 使用命令
mvn clean package -U
会先构建core,然后依次是 web 和 desktop
<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>bus-core-api</groupId>
<artifactId>bus-core-api</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<artifactId>maven-invoker-plugin</artifactId>
<version>1.6</version>
<configuration>
<debug>true</debug>
<pomIncludes>
<pomInclude>app-web-ui/pom.xml</pomInclude>
<pomInclude>app-desktop-ui/pom.xml</pomInclude>
</pomIncludes>
</configuration>
<executions>
<execution>
<id>build</id>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<build>
</project>
使用持续集成服务器(hudson)
- 每次添加一个新项目,新项目添加已有的项目作为依赖,开发者就不需要更新已有项目的 pom
- Hudson 将会借助 Maven 的依赖管理功能实现工程的自动化创建
- 代码提交到hudson映射的代码管理工具,hudson会自动完成项目和依赖项目的构建
2、依赖管理
- 常见的依赖关系可以用父POM的概念被放置在一个地方,其他的 pom 直接或者间接继承他就可以了
- App-UI-WAR不需要直接依赖于Lib1, lib2, Lib3,Maven使用传递性依赖机制来管理这些细节
<parent>
<artifactId>Root</artifactId>
<groupId>com.companyname.groupname</groupId>
<version>1.0</version>
</parent>
3、自动化部署
自动化部署方案
- 使用 Maven 构建和发布项目
- 使用 SubVersion, 源码仓库来管理源代码
- 使用远程仓库管理软件(Jfrog或者Nexus) 来管理项目二进制文件
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.0</modelVersion>
<groupId>bus-core-api</groupId>
<artifactId>bus-core-api</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<scm>
<url>http://www.svn.com</url>
<connection>scm:svn:http://localhost:8080/svn/jrepo/trunk/
Framework</connection>
<developerConnection>scm:svn:${username}/${password}@localhost:8080:
common_core_api:1101:code</developerConnection>
</scm>
<distributionManagement>
<repository>
<id>Core-API-Java-Release</id>
<name>Release repository</name>
<url>http://localhost:8081/nexus/content/repositories/
Core-Api-Release</url>
</repository>
</distributionManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.0-beta-9</version>
<configuration>
<useReleaseProfile>false</useReleaseProfile>
<goals>deploy</goals>
<scmCommentPrefix>[bus-core-api-release-checkin]-<
/scmCommentPrefix>
</configuration>
</plugin>
</plugins>
</build>
</project>
maven release 插件使用
mvn release:clean 清理
mvn release:rollback 失败回滚
mvn release:prepare 准备工作包含很多的动作
mvn release:perform 打包分发到远程库