maven

maven是一个项目管理和综合工具,在多个开发团队合作时,maven可以设置按标准在非常短的时间内完成配置工作。

生命周期

maven有三套生命周期:clean lifecycle, default lifecycle,site lifecycle;

  • clean lifecycle: pre-clean -> clean -> post-clean

  • default lifecycle:pre-resource -> compile -> test-compile -> test -> package -> install -> deploy

  • site lifecycle:pre-site -> site -> post-site -> site-deploy

注:执行生命周期中某一阶段,会默认执行其之前的所有阶段

常用命令

  • 编译项目:mvn compile
  • 编译测试代码:mvn test-compile
  • 单元测试:mvn test
  • 构建项目:mvn package
  • 清理项目:mvn clean
  • 将项目安装到maven本地资源库: mvn install
  • 生成基于maven的项目文档站点:mvn site
  • 部署远程仓库:mvn deploy
  • 部署基于maven的war文件到tomcat: mvn tomcat:deploy
  • 查看父pom:mvn help:effective-pom
  • 查看依赖树:mvn dependency:tree
  • 本地打包过滤掉test:mvn clean package -Pdev -Dmaven.test.skip=true

resources

本地仓库:用来存储项目的依赖库,默认文件夹是.m2目录
中央仓库:用来下载所有项目依赖库的默认位置
私服:公司仓库Nexus

pom文件

一些标签:

  • finalname:定义项目打包名称
  • profile:配置响应的环境,dev,betamagic,prod
  • dependency元素:
    • type:依赖类型,默认为jar,对应构建定义的packaging
    • scope:依赖范围(见下一节)
    • optional:依赖是否可选
    • exclusions:排除依赖传递

依赖归类

在propertie标签内声明常量,在版本处使用该常量;只要groupid和version一样就可以归类
例子:

1
2
3
4
5
6
7
8
9
<properties>
<org.Springframework.version>3.1.4.release</org.Springframework.version>
</properties>
...
<dependency>
...
<version>${org.Springframework.version}</version>
...

聚合

使用一个命令同时构建多个模块
父工程执行mvn package可以打包其自己及其所有子工程,在父工程中,将定义为pom,将子模块放入到modules中;

继承

  • 父pom包含dependdencymanagement,子pom用dependency即可,可以不指定版本号;
  • 子pom中,groupId和version可以直接继承父pom,不需要指定,artifactId必须与父pom不一样

依赖冲突

重复类:在不同的jar包里,有一样类名的类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
每次提交代码时,要检查重复类,执行命令
mvn enforcer:enforce
mvn dependency:tree --Dverbose
mvn dependency:tree -Dverbose | grep "omitted for conflict with"
发现重复后,在pom.xml文件中添加exclusion删除重复的类。
<exclusions>
<exclusion>
<groupId>要删掉的groupid</groupId>
<artifactId>要删除的类名</artifactId>
</exclusion>
</exclusions>
如果两个包都依赖另外一个包,另外这个包得版本不一样,就近原则。

默认执行规则:

A->C 1.0(used) 就近原则
B->C2.0
A->B->C 1.0
D->C 2.0(used) 层少原则
如果固定要一个版本,可以在dependencymanagement指定:

1
2
3
4
5
<dependency>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
<version>3.2.1.Final</version>
</dependency>

scope依赖范围

scope是dependency的子标签,规定包得作用域

  • compile: 默认,写代码时可以用,打包之后会被放在lib的目录
  • provide: 与compile相似,可以在代码中直接引用,但是不会在lib目录下生成。实现在容器里(tomcat)。
  • runtime:运行时才能使用包,在写代码是不能使用的。例如:slf4j、log4j、commons-log、logback等打log的包和mysql的dirver类。可以直接修改pom文件,实现接口api编程.
  • test:只有在测试的时候可以引入 @TEST

maven测试

在java目录下,需要测试的类中,快捷键ctrl+shift+t,选择junit4和要测试的方法,可以自动生成测试类及其方法,自己实例化类,调用对象方法验证;
如果需要加载资源,需要在测试类中添加:

1
2
3
4
5
6
7
@Service
@Runwith(Spring.Junit4ClassRunner.class)
@contextconfiguration(location={"classpath:Spring/加载文件名"});
//同时,在方法中,使用@Resource实例化对象,不用new
@Resurce
private 要测的class 对象;
对象.func();