maven 你应该懂得那些事

1.maven是什么

maven是优秀的构建工具,还是一个依赖管理工具和项目信息管理工具,它提供了中央仓库,能帮我们自动下载构件。

约定优于配置(convention over configuration)

2.maven的基本格式

<?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
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.duogui.mvnbook</groupId>
<artifactId>hello-world</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Maven Hello World Project</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.1</version>
<executions>
<phase>package</phase>
<goals>
<goal>shade</goal>
<configuration>
<tranformers>
<tranformer implementation="org.apache.maven.plugins.shade.resources.ManifestResourceTransformer">
<mainClass>com.duogui.mvnbook.helloworld.HelloWorld</mainClass>
</tranformers>
</configuration>
</goals>
</executions>
</plugin>
</plugins>
</build>
</project>

  基本含义:

  • groupId:定义项目属于哪个组,这个组往往跟项目所在的组织或公司有关联。
  • artifactId:定义了当前Maven项目的唯一ID。
  • version:版本号,SNAPSHOT版本属于开发中的版本,是不稳定的版本。
  • name:声明了一个对于用户更为友好的项目名称,不是必须的。
  • dependencies元素下可以包含多个dependency元素以声明项目的依赖。
  • scope元素:依赖范围,若依赖范围为test,则表示该依赖只对测试有效。
  • pugin元素在POM中的相对位置是在<project><build><plugins>下面。

3.理解坐标,仓库,生命周期,插件的含义

1.maven坐标:

 

  • groupId:定义当前maven隶属的实际项目。
  • artifactId:定义实际项目中的一个maven模块,推荐的做法是使用实际项目名称作为artifactIdde的前缀。
  • version:项目版本
  • packaging:定义Maven项目的打包方式。打包方式和所生成构建的文件扩展名对应;其次,打包方式会影响到构建的生命周期。
  • classifier:用来帮助定义构建输出的一些附属构件,例如插件等

 

 

依赖范围:

scope:

  • compile:编译依赖范围,对于编译,测试,运行三种classpath都有效
  • test:测试依赖范围,只对于测试classpath有效
  • provided:已提供依赖范围,使用此依赖范围的maven依赖,对于编译和测试classpath有效,但在运行时无效
  • runtime:运行时依赖范围。对于测试和运行classpath有效,但编译主代码无效。
  • system:系统依赖范围。

 

传递性依赖:maven可以解决

可选依赖:optional

排除依赖:<exclusions><exclusion>

归类依赖:<propeties>

2. 仓库:

仓库:统一存储所有Maven项目共享的构件。

仓库的分类:

本地仓库和远程仓库;

中央仓库是Maven核心自带的远程仓库,它包含 绝大部分的开源的构件。

私服是另一种特殊的远程仓库,为了节约带宽和时间,应该在局域网内架设一个私有的仓库服务器。私服代理广域网上的远程仓库。私服的好处:

  • 节省自己的外网带宽
  • 加速maven构建
  • 部署第三方构件
  • 提高稳定性,增强控制
  • 降低中央仓库的负荷

3.生命周期

aven的生命周期就是为了对所有的构建过程进行抽象和统一,这个生命周期包括了项目的清理,初始化,编译,测试,打包,集成测试,验证,部署和站点生成等几乎所有构建步骤。相当于设计模式中的模板方法模式,模板方法模式在父类中定义算法的整体结构,子类可以通过实现或者重写父类的方法来控制实际的行为。

插件机制:每个构建步骤可以绑定一个或者多个插件行为,而且maven为大多数构建步骤编写并绑定了默认插件。

三套生命周期:

1.clean:清理项目

包括三个阶段:

1)pre-clean:执行一些清理前需要完成的工作

2)clean:清理上一次构建生成的文件

3)post-clean:执行一些清理后需要完成的工作

2.default:构建项目,定义了真正构建时所需要执行的所有步骤

1)validate

2) initialize

3) generate-sources

4) process-sources:处理项目主资源文件

5) generate-resources:

6) process-resources:

7) compile:编译项目的主源码

8) process-classes

9) generate-test-resources:处理项目测试资源文件

10) process-test-sorces

11) test-compile:编译项目的测试代码

12)process-test-classes

13)test:使用单元测试框架运行测试,测试代码不会被打包或部署

14)prepare-package

15)package:接受编译好的代码,打包成可发布的格式,如jar

16)pre-integration-test

17)integration-test

18)verify

19)install:将包安装在背地maven仓库,供本地其他maven项目使用

20)deploy:将最终的包复制到远程仓库,供其他开发人员和maven项目使用。

3.site:建立和发布项目站点

1)pre-site:执行一些在生成项目站点之前需要完成的工作

2)site:生成项目站点文档

3)post-site:执行一些在生成项目站点之后需要完成的工作

4)site-deploy:将生成的项目站点发布到服务器上。

4.插件

插件目标:具体的任务是由插件完成的,插件以独立的架构形式存在。

4. 使用maven构建web应用

1.web项目的目录结构

基于Java的web应用,其标准的打包方式是war,war跟jar类似,只是war包含更多的内容,如JSP文件,servlet,Java类,web.xml配置文件,依赖jar包,静态web资源等。

一个war包至少包含两个子目录:META-INF和WEB-INF。

META-INF:包含了一些打包元数据信息

WEB-INF:是war包的核心,必须包含一个web资源表述文件web.xml,它的子目录classes包含所有该项目的类,而另一个目录lib则包含所有该web项目的依赖jar包,classes和lib目录都会在运行的时候被加入到Classpath中。

用户必须为web项目显示指定打包方式为war

<packaging>war</packaging>

web项目比较特殊的地方在于:它还有一个web资源目录,其默认位置是src/main/webapp/

 

<finalName></finalName>:war包简单的名字

5.版本管理

版本管理和版本控制

版本管理:项目整体版本的演变过程管理

版本控制:借助版本控制工具追踪代码的每一个变更

项目开发过程中,大家应该都使用快照版本。

理想的发布版应该对应了项目某个时刻比较稳定的状态,应当满足:

1).所有自动化测试应当全部通过

2).项目没有配置任何快照版本的依赖、

3).项目中没有配置任何快照版本的插件

4).项目所包含的代码已经全部提交到版本控制系统了。

2.maven的版本号定义约定

1.1.4-beta-2:第一个重大版本的第三个次要版本的第四次增量版本的beta-2里程碑。

<主版本>.<次版本>.<增量版本>-<里程碑版本>

主版本:项目的重大架构变更

次版本:表示较大范围的功能增加和变化及bug修复

增量版本:重大bug修复

里程碑版本:某一个版本的里程碑,这样的版本与正式的相比,往往表示不是非常稳定,还需要很多测试。

3.主干,标签与分支

主干:项目开发代码的主体,是从项目开始知道当前都处于活动的状态,从这里可以获得项目最新的源代码以及几乎所有的变更历史

分支:从主干的某个点分离出来的代码拷贝,为了不影响的主干的前提下在这里进行重大bug的修复,如果分支达到了预期的效果,通常发生在这里的变更会被合并到主干上。

标签:用来标识主干或者分支的某个点的状态,以代表项目的某个稳定状态,这通常是版本发布时的状态。

4.自动化发布

maven release plugins:自动化发布项目版本:

mvn release:prepare:准备版本发布

mvn release:rollback:回退release:prepare所执行的操作。

mvn release:perform:执行版本发布。

 6.常见命令

1. mvn help:system:打印出所有的Java系统属性和环境变量。

2. ping repo1.maven.org:检查网络

 

 

3. telnet 218.14.227.197 3128:检测端口是否能畅通。

 

4. mvn cean compile : clean告诉maven清理输出目录target/,compile告诉maven编译项目主代码,从输出中看到maven首先执行了clean:clean任务,然后删除target/目录。默认情况下,maven构建的所有输出都在target目录中;接着执行resources:resources任务,最后执行compiler:compiler任务,将项目主代码编译至target/classes目录中。

 

 

 

 

5. mvn clean test:运行测试代码

 

6.mvn clean package:打包

7.mvn clean install:将项目输出的jar安装到了maven本地仓库中。

8.java -jar target\.....jar:执行Java代码

9.mvn clean deploy:部署到对应的远程仓库

10.mvn clean install -U : 强制让maven检查更新

执行mvn clean intall 获得完整的反应堆

11.-am,--also-make:同时构建所列模块的依赖模块:mvn clean install -pl account-email-am

12.-amd-also-make-dependents:同时构建依赖于所列模块的模块。

13.-pl,--projects <arg>:构建指定的模块,模块间用逗号分隔;

14.-rf.-resume-from <arg> 从指定的模块会服反应堆,

15.mvn package -DskipTests:跳过测试

16. mvn test -Dtest = className :动态执行运行的测试用例

17 mvn package:maven会将项目中的主代码及资源文件打包,将其安装或部署到仓库之后,这些代码就能为他人所用。

 

posted @ 2017-10-20 16:51  emma_zhang  阅读(756)  评论(0编辑  收藏  举报