Maven学习-构建项目
创建项目
运行如下命令会创建一个简单的Maven项目。
mvn archetype:create -DgroupId=com.netease.learn -DartifactId=simple -DpackageName=com.netease.learn
- -DgroupId:指定了项目的groupId;
- -DartifactId:指定了项目的artifactId
- -DpackageName=org.sonatype.mavenbook会在项目创建包。
在运行这个插件时,前缀是archetype,目标是generate。
构建项目
如果想要构建打包这个应用,在包含pom.xml的目录下运行mvn install。

运行 mvn install会将项目打包,并发送到本地仓库。
运行
Java –cp simple-2.1.jar com.netease.learm.App
当Maven运行的时候,它是根据项目的pom.xml里设置的组合来运行的,一个最上级的POM定义了Maven的安装目录,在这个目录中全局的默认值被定义了,(可能)还有一些用户定义的设置。想要看这个“有效的 (effective)”POM,或者说Maven真正运行根据的POM,在simple项目的基础目录下运行 mvn help:effective-pom命令。
Maven插件和目标
我们已经用两种类型的命令行参数运行了Maven:①:单个的插件目标,Archetype插件的Generate目标②:一个生命周期阶段 –package。
一个maven插件是一个或者过个目标的集合。一个目标是一个明确的任务,它可以作为单独的运行目标,或者作为一个大的构建的一部分和其它目标一起运行。一个目标是Maven中的一个工作单元。目标通过配置属性进行配置,以用来定制行为。目标定义了一些参数,这些参数可以定义一些默认值。
Maven的生命周期
Mavne的生命周期是有一些生命周期阶段构成。一个阶段是在被Maven称为“构建生命周期”中的一个步骤。生命周期是包含在一个项目构建中的一系列有序的阶段。Maven支持许多不同的生命周期,最常用的生命周期是默认的Maven生命周期,这个生命周期中一开始的一个阶段是验证项目的基本完整性,最后一个阶段是把项目发布成产品。

插件目标可以附着在生命周期的阶段上。随着maven沿着生命周期阶段移动,它会执行附着在特定阶段上的目标。每个阶段可能绑定零个或者多个目标。在Maven执行一个阶段的时候,它首先会有序的执行前面的所有阶段,到命令指定的那个阶段位置。
- resources:resources 。Resources插件的resources目标绑定到了resources 阶段。这个目标复制src/main/resources下的所有资源和其它任何配置的资源目录,到输出目录。
- compiler:compile。Compiler插件的compile目标绑定到了compile 阶段。这个目标编译src/main/java下的所有源代码和其他任何配置的资源目录,到输出目录。
- resources:testResources。Resources插件的testResources目标绑定到了test-resources 阶段。这个目标复制src/test/resources下的所有资源和其它任何的配置的测试资源目录,到测试输出目录。
- compiler:testCompile。Compiler插件的testCompile目标绑定到了test-compile 阶段。这个目标编译src/test/java下的测试用例和其它任何的配置的测试资源目录,到测试输出目录。
- surefire:test。Surefire插件的test目标绑定到了test 阶段。这个目标运行所有的测试并且创建那些捕捉详细测试结果的输出文件。默认情况下,如果有测试失败,这个目标会终止。
- jar:jar。Jar插件的jar目标绑定到了package 阶段。这个目标把输出目录打包成JAR文件。
运行package阶段能很好的跟踪一个特定的构建中包含的所有目标,它也允许每个项目使用Maven来遵循一组定义明确的标准。而这个生命周期能让开发人员从一个Maven项目跳到另外一个Maven项目,而不用知道太多每个项目构建的细节。如果你能够构建一个Maven项目,那么你就能构建所有的Maven项目。
Maven坐标
POM为项目命名,提供了项目的一组唯一标识符(坐标),并且通过依赖 (dependencies) ,父 (parents) 和先决条件(prerequisite) 来定义和其它项目的关系。POM也可以自定义插件行为,提供项目相关的社区和开发人员的信息。Maven坐标定义了一组标识,它们可以用来唯一标识一个项目,一个依赖,或者MavenPOM里的一个插件。
Maven install命令会把项目的构建安装到本地仓库。
Maven依赖管理
一个复杂的项目将会包含很多依赖,也有可能包含依赖于其它构件的依赖。Maven支持传递性依赖,对于传递性依赖,只需要加上直接依赖的类库,Maven会隐式的把这些库间接依赖的库也加入到项目中。Maven也会处理这些依赖中的冲突,同时能自定义默认行为,或者排除一些特定的传递依赖性。Maven在下载依赖的文件同时会下载POM文件,这是传递性依赖的基础。Maven也提供了不同的依赖范围。同时当为项目构建JAR文件的时候,它的依赖不会被捆绑在生成的构建中。当用Maven来创建WAR或者EAR,你可以配置Maven让它在生成的构件中捆绑依赖,你也可以配置Maven,使用provided范围,让它排除WAR文件中特定的依赖。provided范围告诉Maven一个依赖在编译的时候需要,但是它不应该被捆绑在构建的输出中。
其他知识
- 查看项目依赖:mvn dependency:resolve
- 查看整个项目依赖树:mvn dependency:tree
- 执行测试单元:mvn test
- 忽略测试失败:mvn test –Dmaven.test.failure.ignore=true
- 跳过单元测试:mvn install –Dmaven.test.skip=true
Maven Assembly插件是一个可以用来创建应用程序特有分发包的插件,分发包包含了项目的二进制文件和所有依赖。此时需要在pom中添加一下内容:
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
添加好配置后,可以运行 mvn install assembly:assembly 来构建这个装配。
构建多模板项目
一个多模板项目通过一个父POM引用一个或者多个子模板来定义。父项目不创建一个JAR或者WAR,它仅仅是一个引用其他Maven项目的POM,所以其打包类型是pom。在父模板的pom.xml中列出了项目的子模板,这些模块在modules元素中定义。每个module元素对应一个子模板。Maven知道去这些子目录寻找pom.xml文件,并且在构建的时候,它会将这些子模板包含到要构建的项目中。在项目中需要使用parent元素标记一个Maven坐标来引用父模板pom。子模板会继承父模板的groupId和version。父POM如下:
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.netease.demo</groupId>
<artifactId>demo</artifactId>
<packaging>pom</packaging>
<version>1.0.0-RELEASE</version> <modules>
<module>sub-demo1</module>
<module>...</module>
</modules> </properties> <dependencyManagement>
<dependencies>
<!-- trade工程的各个子工程 -->
<dependency>
<groupId>com.netease.demo</groupId>
<artifactId>sub-demo</artifactId>
<version>1.0.0-RELEASE</version>
</dependency>
<
</dependencies>
</dependencyManagement> ...
</project>
子模板POM如下所示:
<?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/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>trade</artifactId>
<groupId>com.netease.nsip</groupId>
<version>1.0.3-RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>trade-core</artifactId>
<version>1.0.3-RELEASE</version>
<packaging>jar</packaging> <dependencies>
...
</dependencies>
</project>
当Maven执行一个带有子模板的项目的时候,Maven首先载入父POM,然后定位所有的子模块POM。Maven然后将所有这些项目的POM放入到一个称为Maven反应堆的东西中,由他负责分析模块之间的依赖关系。这个反应堆处理组件的排序,以确保相互独立的模块能以适当的顺序被编译和安装。
Maven学习-构建项目的更多相关文章
- maven 手动构建项目
maven 手动构建项目 在空目录下面: D:\test>mvn -B archetype:generate -DarchetypeGroupId=org.apache.maven.archet ...
- springboot+maven快速构建项目
最近公司运用springboot构建项目,确实比ssh搭建要快很多.springboot官方学习网站 1.首先要下载maven,用maven管理项目很方便,下载完maven配置好环境,maven我就不 ...
- jenkins+maven+svn构建项目,及远程部署war包到tomcat上
要使用jenkins构建项目,当然要使用jenkins了,我使用的war版本的jenkins jenkins的官网 http://jenkins-ci.org/ 点击latest下载,但是可能因为天朝 ...
- IDEA+Maven+Tomcat构建项目流程
0.准备 本文主要解决在IDEA上开发Maven-webapp项目关联Tomcat的问题. 首先,确保本地计算机下载解压了Tomcat压缩包,以及配置好了Java环境. 1.新建Mavne项目 2.I ...
- maven学习--1.项目结构及简单使用
1.项目目录结构 MavenProjectRoot(项目根目录) |----src | |----main | | |----java ——存放项目的.ja ...
- 完美解决idea继承maven后,构建项目慢的问题
1.修改远程仓库的位置(maven默认仓库是国外,所以我们下载jar包很慢) 找到我们安装的maven路径下的conf文件夹下的settings.xml文件 将文件复制到 C:\Users\Admin ...
- Maven学习:项目之间的关系
Maven不仅可以定义一个项目中各个模块之间的关系,还可以更延伸一步定义项目与项目之间的关系. 定义父子项目的好处还是挺多的.
- maven 学习---将项目安装到Maven本地资源库
在Maven中,可以使用“mvn install”打包项目,并自动部署到本地资源库,让其他开发人员使用它. mvn install 注意,当“install”在执行阶段,上述所有阶段 “validat ...
- eclipse 用maven创建web项目
Eclipse 用maven构建web项目 (2013-01-27 11:05:31) 转载▼ 标签: it eclipse maven spring web 杂谈 一.背景介绍 对于初学者,用m ...
随机推荐
- Unity 3D Framework Designing(4)——设计可复用的SubView和SubViewModel(Part 1)
『可复用』这个词相信大家都熟悉,通过『可复用』的组件,可以大大提高软件开发效率. 值得注意的事,当我们设计一个可复用的面向对象组件时,需要保证其独立性,也就是我们熟知的『高内聚,低耦合』原则. 组件化 ...
- js的基本介绍
一:JavaScript简称js 他是个脚本语言,需要有宿主文件,他的宿主文件是html文件. 二:js的用法 js :1)进行数据运算 2) 控制浏览器的一些功能 3)控制元素 +元素 +样式 +内 ...
- 如何在IntelJ下用Maven创建一个Web项目
相信一开始做Web项目的同学都是直接把项目包放在WEB-INF/lib目录下,然后就开始做项目了.但是之后接触了一些使用了Maven进行包管理的项目,我们就不得不学一学如何用Maven做包管理. 在网 ...
- GEF开发eclipse插件,多页编辑器实现delete功能
基于GEF开发,多页签编辑器实现 有两种方案: 方案一 继承FormEditor或MultiPageEditorPart,在其中嵌入自定义的继承自GraphicalEditor的子类的编辑器(作为一个 ...
- Jmeter函数组件开发
插件开发方法有两种: 一.在jmeter官网下载jmeter源码,在源码里面新加函数,然后导出jar: 二.不下载源码,直接导入jmeter相应的jar包,即可开发.(推荐) 下面介绍第二种开发方法: ...
- 用Xamarin + VS 编写Android程序体验及其与Android Studio的比较
昨天看了微软2016Build大会,Xamarin免费了.恩,5亿美刀的家伙,哈哈,我也要体验一下..... 1. 首先在Xamarin官网下载安向导:https://www.xamarin.com/ ...
- Android自定义ListView的Item无法响应OnItemClick的解决办法(转)
原文链接:http://www.linuxidc.com/Linux/2011-09/43205.htm 如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那 ...
- 关于ARM内核与架构的解释
本文摘自某论坛某位大神的一段回复,经典至极,copy来己用! 只要你玩过ARM内核的芯片,那么关于内核和架构,我想应该或多或少的困惑过你,看了下面的介绍,你应该会清楚很多! 好比你盖房子,刚开始因为水 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十一)数据层优化-druid监控及慢sql记录
本文提要 前文也提到过druid不仅仅是一个连接池技术,因此在将整合druid到项目中后,这一篇文章将去介绍druid的其他特性和功能,作为一个辅助工具帮助提升项目的性能,本文的重点就是两个字:监控. ...
- TC SRM683 Div1 250
大意是有一排石子,每一堆有a[i]个,目标状态每一堆有b[i]个,每一步可以从一堆中取出一个石子转移到相邻的一个,其中1和n也算相邻也即环形.问最少步数. 比赛的时候写了个按照步数贪心的做法,FST了 ...