这一节会从几个一次性步骤开始,为构建做好准备1。这包括手动安装类库、重命名属性文件并编辑它,指向Java 7的本地安装。
1 尽管Maven构建工具最近有改进,并且也支持多语言编程,但还是有些差距。
然后就是最常见的Maven构建周期目标(clean
、compile
和test
)。第一个构建期目标(clean
)用来清理上一次构建遗留下来的工件。
Maven的构建脚本是POM(Project Object Model,项目对象模型)文件。这些POM文件就是XML文件,每个Maven项目或模块都有一个对应的pom.xml文件。POM文件即将会对备选语言提供支持,满足你所需要的更强的灵活性(很像Gradle)。
要用Maven执行构建,可以让它执行一个或几个表示特定任务(比如编译源码、运行测试等)的目标。目标全部都是绑定到默认构建周期中的,所以如果要求Maven运行一些测试(如mvn test
),它会在试图运行测试之前把主源码和用于测试的源码都编译一下。简言之,它会迫使你遵循正确的构建周期。
让我们从一个一次性的准备任务开始吧。
A.3.1 一次性的构建准备工作
要成功运行构建,需要先重命名属性文件并编辑。如果在读12.2节时你没这么做,请转到$BOOK_CODE目录下,将sample_<os>_build.properties文件(os是你的操作系统)另存为 build.properties,修改jdk.javac.fullpath
属性,将其值指向Java 7的本地安装。这可以保证Maven构建Java代码时能选择正确的JDK。
准备工作做好了,可以运行clean
目标了,执行构建时应该总是把它包括在内。
A.3.2 clean
clean
目标仅仅是把target目录删掉。要看实际效果,请切换到$BOOK_CODE目录并执行clean
目标。
cd $BOOK_CODEmvn clean
这时候,你会看到控制台中满是Maven下载各种插件和第三方类库的输出信息。Maven需要这些插件和类库运行目标,它默认从Maven Central(这些工件的主要在线资源库)下载。java7developer项目还配置了另外一个资源库,以便可以下载asm-4.0.jar文件。
注意 Maven偶尔也会为其他目标执行这个任务,所以在执行其他目标时看到它“下载互联网”不要大惊小怪。这些东西它只会下载一次。
除了“正在下载……”的信息,应该还能在控制台中看到类似下面这种信息:
[INFO] ----------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ----------------------------------------------------------------[INFO] Total time: 1.703s[INFO] Finished at: Fri Jun 24 13:51:58 BST 2011[INFO] Final Memory: 6M/16M[INFO] ----------------------------------------------------------------
如果clean
目标失败了,很可能是代理服务器阻止你访问Maven Central,使你无法下载插件和第三方类库。要解决这个问题,只需修改$HOME/.m2/settings.xml文件,加上下面这些配置,为各种元素填上恰当的值。
<proxies> <proxy> <active>true</active> <protocol></protocol> <username></username> <password></password> <host></host> <port></port> </proxy></proxies>
重新运行这个目标,BUILD SUCCESS
消息如期而至。
提示 跟其他Maven构建周期目标不同,
clean
不会自动调用。如果你想清除上一次构建产生的工件,必须把clean
目标包括在内。
现在已经把以前构建的残留物都清除掉了,一般接下来要执行的构建周期目标是编译代码。
A.3.3 compile
compile
目标用pom.xml文件中的compiler插件配置编译在src/main/java、src/main/scala和src/main/groovy目录下的源码。这实际上是将compile-scoped的依赖项加到CLASSPATH
上执行Java、Scala和Groovy编译器(javac
、scalac
和groovyc
)。Maven也会处理src/main/resources下的资源,确保它们出现在编译时的CLASSPATH
中。
编译好的类会放到target/classes目录下。要看实际效果,请执行下面的目标:
mvn compile
compile
目标执行起来应该很快,控制台的输出看起来应该像下面这样。
...[INFO] [compiler:compile {execution: default-compile}][INFO] Compiling 119 source files to C:Projectsworkspace3.6codetrunktargetclasses[INFO] [scala:compile {execution: default}][INFO] Checking for multiple versions of scala[INFO] includes = [**/*.scala,**/*.java,][INFO] excludes = [INFO] C:Projectsworkspace3.6codetrunksrcmainjava:-1: info: compiling[INFO] C:Projectsworkspace3.6codetrunktargetgenerated-sourcesgroovystubsmain:-1: info: compiling [INFO] C:Projectsworkspace3.6codetrunksrcmaingroovy:-1: info: compiling[INFO] C:Projectsworkspace3.6codetrunksrcmainscala:-1: info: compiling[INFO] Compiling 143 source files to C:Projectsworkspace3.6codetrunktargetclasses at 1312716331031[INFO] prepare-compile in 0 s[INFO] compile in 12 s[INFO] [groovy:compile {execution: default}][INFO] Compiled 26 Groovy classes[INFO]------------------------------------------------------------------[INFO] BUILD SUCCESSFUL[INFO] -----------------------------------------------------------------[INFO] Total time: 43 seconds[INFO] Finished at: Sun Aug 07 12:25:44 BST 2011[INFO] Final Memory: 33M/79M[INFO] -----------------------------------------------------------------
在这一阶段,在src/test/java、src/test/scala和src/test/groovy目录下的测试类还没有编译。尽管针对它们有专门的test-compile
目标,但更典型的方式是让Maven运行test
目标。
A.3.4 test
运行test
目标能看到Maven的构建周期的真实效果。在要求Maven测试时,它知道自己需要把之前的构建周期目标全都执行过之后才能成功运行test
目标(包括compile
、test-compile
,还有很多其他的)。
Maven会通过Surefire插件,用pom.xml中配置为test-scoped依赖项的测试提供者(此处为JUnit)运行测试。Maven不仅运行测试,还会生成报告文件,供以后进行分析,调研失败测试并收集测试指标。
要看实际效果,执行如下目标:
mvn clean test
Maven一旦完成测试类的编译和运行,就应该能看到类似下面这种输出的报告。
...Running com.java7developer.chapter11.listing_11_3.TicketRevenueTestTests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 secRunning com.java7developer.chapter11.listing_11_4.TicketRevenueTestTests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 secRunning com.java7developer.chapter11.listing_11_5.TicketTestTests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.015 secResults :Tests run: 20, Failures: 0, Errors: 0, Skipped: 0[INFO]------------------------------------------------------------------[INFO] BUILD SUCCESSFUL[INFO]------------------------------------------------------------------[INFO] Total time: 16 seconds[INFO] Finished at: Wed Jul 06 13:50:07 BST 2011[INFO] Final Memory: 24M/58M[INFO]------------------------------------------------------------------
测试结果保存在target/surefire-reports里。你现在可以去看看这个文本文件,能看到测试成功通过了。