maven 你应该懂得那些事
Posted Emma_Zhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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会将项目中的主代码及资源文件打包,将其安装或部署到仓库之后,这些代码就能为他人所用。
以上是关于maven 你应该懂得那些事的主要内容,如果未能解决你的问题,请参考以下文章