Maven3 in Action
Maven实战
部分内容源自小山code
本书的书稿使用Git和Unfuddle(https://unfuddle.com/
)进行管理的,书中的大量截图是使用Jing(https://www.techsmith.com/screen-capture.html
)制作的。
Maven简介
何为Maven
Apache组织中的一个颇为成功的开源项目,主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。
何为构建
早上来到公司,我们做的第一件事情就是从源码库签出最新的源码,然后进行单元测试,如果发现失败的测试,会找相关的同事一起调试,修复错误代码。接着回到自己的工作上来,编写自己的单元测试及产品代码。
忙到午饭时间,代码编写的差不多了,测试也通过了,开心的享用午餐,然后休息。下午先在昏昏沉沉中开了个例会,会议结束后喝杯咖啡继续工作。会上经理要求看的测试报告,于是找到了相关工具集成到IDE,生成了像模像样的测试覆盖率报告,接着邮箱发给经理,松了口气。谁料QA小组又发过来了几个bug,没办法,先在本地重现了再说,于是熟练地用IDE生成了一个WAR包,部署到Web容器下,启动容器。看到熟悉的界面了,遵循bug报告,一步步重现了bug……快下班的时候,bug改好了,提交代码,通知QA小组,在愉快中结束了一天的工作。
编译、运行单元测试、生成文档、打包和部署等烦琐且不起眼的工作上,这就是构建。
Maven:作为构建工具,不仅能帮我们自动化构建,还能够抽象构建过程,提供构建任务实现;他跨平台,对外提供了一致的操作接口,这一切足以使他称为优秀的、流行的构建工具。
不仅仅是构建工具
Maven帮助管理的同时,也为全世界提供了一个免费的中央仓库。Maven的衍生工具(如Nexus)。约定优于配置(Convention Over Configuration)。
为什么需要Maven
组装PC和品牌PC
IDE不是万能的
Make:不支持跨平台。
Ant(Another Neat Tool),最早用来构建Tomcat,创作动机是受不了Makefile的语法格式。我们可以将Ant看成是一个Java版本的Make,也正因为使用了Java,所以Ant跨平台。
不重复发明轮子
Maven与极限编程
极限编程(XP)强调拥抱变化。
- 测试驱动开发(TDD)
- 持续集成(CI):Hudson和CruiseControl、Jenkins、GitLab CI
被误解的Maven
使用Maven最高效的方式永远是命令行。
Maven 社区提倡为你使用的任何插件设定稳定的版本。
Maven仓库确实不完美,由于许可证等因素,需要做的是建立一个组织内部的仓库服务器。
安装与配置
1.检查JDK安装
echo %JAVA_HOME% # win
echo $JAVA_HOME # linux
java -version
2.下载Maven
Maven3对Maven2完全兼容,可以直接升级。
3.本地安装
D:\bin> jar xvf "3.0 bin.zip"
jar命令就相当于tar。
添加环境变量M2_HOME 变量值为maven目录;在Path的变量中添加%M2_HOME%\bin
echo %M2_HOME%
mvn -v
在Linux中推荐使用符号链接(软链接)
ln -s apache-maven-3.0 apache-maven
export M2_HOME = /home/jihuaixi/bin/apache-maven
4.升级Maven
在基于UNIX的系统上,可以利用符号链接这一工具来简化Maven的升级,不必像Windows上那样,每次升级都必须更新环境变量。
安装目录分析
M2_HOME
bin
-mvn
-mvnDebug: MAVEN_DEBUG_OPTS参数
-m2.conf: classworlds的配置文件
boot
-plexus-classworlds-2.6.0.jar:类加载器框架
conf
-settings.xml
lib
-Maven运行时需要的Java类库
# 打印出所有的Java系统属性和环境变量
mvn help:system
~/.m2
推荐将M2_HOME/conf/settings.xml文件复制到~/.m2/settings.xml。这是一条最佳实践。
设置HTTP代理
公司处于安全因素考虑,要求你使用通过安全认证的代理访问因特网(使用ping repo1.maven.org检查网络)。这种情况下就需要为Maven配置HTTP代理,才能让它正常访问外部仓库。
检测代理服务器使用telnet ip port命令,如果连接正确,则输入Ctrl + ],然后q,回车,退出即可。
<proxies>
<proxy>
<id>my-proxy</id>
<active>true</active>
<protocol>http</protocol>
<host>39.106.154.119</host>
<port>3128</port>
<!--
<username>***</username>
<password>***</password>
<nonProxyHosts>repository.mycom.com|*.google.com</nonProxyHosts>
-->
</proxy>
</proxies>
proxies下可以有多个proxy元素,如果声明了多个,则默认情况下第一个被激活的proxy会生效。
Maven安装最佳实践
- 设置MAVEN_OPTS环境变量:通常设置为- Xms128m -Xmx512m,因为Java默认的最大可用内存往往不能够满足Maven运行的需要,比如在项目较大时,使用Maven生成项目站点需要占用大量的内存,如果么有配置,容易导致java.lang.OutOfMemeoryError。推荐设置环境变量,文不是修改mvn脚本。
- 配置用户范围settings.xml:$M2_HOME/conf/settings.xml为全局范围,~/.m2/settings.xml为用户范围。便于升级,不需要修改用户目录下的配置。
使用入门
编写POM
就像Make的Makefile、Ant的build.xml一样,pom.xml是Maven的核心。POM(Project Object Model)。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>top.aerion</groupId>
<artifactId>tacocloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>tacocloud</name>
<description>tacocloud</description>
</project>
第一行是xml版本和编码方式。
紧接着是project元素,还声明了命名空间及xsd元素。虽然这些属性不是必须的,但使用这些属性能够让第三方工具帮助我们快速便捷POM。
对于Maven2和Maven3来说,modelVersion只能是4.0.0。
最重要的是groupId、artifactId和version三行,组往往和项目所在的组织或公司存在关联。版本号中的SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定版本。
POM文件实现了与Java代码的解耦。
编写主代码
项目主代码会被最终打包,而测试代码不会。
约定主代码位于src/main/java目录,然后在该目录下创建top/aerion/mvnbook/helloworld/HelloWorld.java。
package top.aerion.mvnbook.helloworld
public class HelloWorld {
public String sayHello() {
return "Hello Maven";
}
public static void main(String[] args){
System.out.print(new HelloWorld().sayHello());
}
}
编译:
mvn clean compile
clean为清理target目录。默认情况下,构建的所有输出都在target目录中,接着执行resources:resources