如今我们构建一个项目需要用到很多第三方的类库,如写一个使用Spring的Web项目就需要引入大量的jar包。一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系错综复杂,一个Jar包往往又会引用其他Jar包,缺少任何一个Jar包都会导致项目编译失败。以往开发项目时,程序员往往需要花较多的精力在引用Jar包搭建项目环境上,而这一项工作尤为艰难,少一个Jar包、多一个Jar包往往会报一些让人摸不着头脑的异常。而Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。
好的目录结构可以使开发人员更容易理解项目,为以后的维护工作也打下良好的基础。Maven2根据业界公认的最佳目录结构,为开发者提供了缺省的标准目录模板。Maven2的标准目录结构如下:
项目根/ | ||||
pom.xml | Maven2的pom.xml文件 | |||
src/ | ||||
main/ | 项目主体根目录 | |||
java | 源代码目录 | |||
resources | 所需资源目录 | |||
filters | 资源过滤文件目录 | |||
assembly | Assembly descriptors | |||
config | 配置文件根目录 | |||
test/ | 项目测试根目录 | |||
java | 测试代码目录 | |||
resources | 测试所需资源目录 | |||
filters | 测试资源过滤文件目录 | |||
site | 与site相关的资源目录 | |||
target/ | 编译目录根 | |||
classes | 项目主体编译目录 | |||
test-classes | 项目测试编译目录 | |||
site | 项目site编译目录 |
src/main/java | Application/Library sources |
src/main/resources | Application/Library resources |
src/main/filters | Resource filter files |
src/main/assembly | Assembly descriptors |
src/main/config | Configuration files |
src/main/scripts | Application/Library scripts |
src/main/webapp | Web application sources |
src/test/java | Test sources |
src/test/resources | Test resources |
src/test/filters | Test resource filter files |
src/site | Site |
LICENSE.txt | Project's license |
NOTICE.txt | Notices and attributions required by libraries that the project depends on |
README.txt | Project's readme |
使用目录模板,可以使 pom.xml 更简洁。因为 Maven2 已经根据缺省目录,预定义了相关的动作,而无需人工的干预。以 resources 目录为例:
这些动作在 Maven1 中,是需要在 maven.xml 中使用
在Maven2中有了明确的生命周期概念,而且都提供与之对应的命令,使得项目构建更加清晰明了。主要的生命周期阶段:
如果要执行项目编译,那么直接输入:mvn compile即可,对于其他的阶段可以类推。阶段之间是存在依赖关系(dependency)的,如test依赖test-compile。在执行mvn test时,会先运行mvn test-compile,然后才是mvn test。
maven常见命令 | |
mvn archetype:create | 创建Maven项目 |
mvn compile | 将java源文件编译成class文件 |
mvn test | 运行应用程序中的单元测试 |
mvn install | 在本地Respository中安装jar |
mvn eclipse:eclipse | 生成eclipse项目文件 |
mvn jetty:run | 启动jetty服务 |
mvn clean | 清除项目目录中的生成结果 |
mvn site | 生成项目相关信息的网站 |
mvn package | 将项目打成jar包 |
Maven仓库用来存放Maven管理的所有Jar包。分为:本地仓库 和 中央仓库。
当项目编译时,Maven首先从本地仓库中寻找项目所需的Jar包,若本地仓库没有,再到Maven的中央仓库下载所需Jar包。
在Maven中,坐标是Jar包的唯一标识,Maven通过坐标在仓库中找到项目所需的Jar包。
如下代码中,groupId和artifactId构成了一个Jar包的坐标。
io.netty
netty-all
4.1.6.Final
排除依赖:如果我们只想下载直接引用的Jar包,那么需要在pom.xml中做如下配置:(将需要排除的Jar包的坐标写在中)
ch.qos.logback
logback-classic
若项目中多个Jar同时引用了相同的Jar时,会产生依赖冲突,但Maven采用了两种避免冲突的策略,因此在Maven中是不存在依赖冲突的。
将一个项目的多个模块同事运行就称为聚合,在父模块的pom,xml中加入如下配置即可实现聚合。
../模块1
../模块2
../模块3
在聚合多个模块时,如果这些模块引用的有相同的jar,可以将这些相同的jar写入到父模块的pom.xml中,各个子模块继承该pom即可。相关配置如下:
com.google.code.gson
gson
2.7
父pom所在模块的groupId
父pom所在模块的artifactId
父pom所在模块的版本号
pom.xml是maven的核心,项目当中需要什么jar则去maven远程仓库找到对应的版本,在pom.xml配置上即可。当maven编译项目的时候会读取该文件,并且从仓库中下载相应的jar包。
4.0.0
cn.erhuowang
erhuowang-maven2
war
1.0-SNAPSHOT
erhuo-maven
http://erhuowang.cn
A maven project to study maven.
erhuowang
http://erhuowang.cn
Demo
[email protected]
[email protected]
[email protected]
[email protected]
HELLO WORLD
chaimm
[email protected]
Project Manager
Architect
demo
http://erhuowang.cn
No
-5
Apache 2
http://www.baidu.com/erhuwoang/LICENSE-2.0.txt
repo
A business-friendly OSS license
scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)
scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
http://svn.baidu.com/banseon
demo
http://www.erhuowang.cn
......
......
Windows XP
Windows
x86
5.1.2600
mavenVersion
2.0.3
/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
......
......
......
......
......
......
banseon-repository-proxy
banseon-repository-proxy
http://192.168.1.169:9999/repository/
default
......
org.apache.maven
maven-artifact
3.8.1
jar
test
spring-core
org.springframework
true
......
banseon-maven2
banseon maven2
file://${basedir}/target/deploy
banseon-maven2
Banseon-maven2 Snapshot Repository
scp://svn.baidu.com/banseon:/usr/local/maven-snapshot
banseon-site
business api website
scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web