Marven:使用Maven构建Java项目
一、Maven是什么?
Maven 是一个项目管理和构建自动化工具。Maven基于POM(Project object model),能够管理项目的构建、报表、文档等信息。
我们这里主要讲的Maven的项目构建功能。有了Maven,我们可以方便的管理Java项目的生命周期和依赖。通过定义一个POM文件,我们就可以自动的完成编译、测试、打包甚至发布等过程。
二、为什么要用Maven?
做过Java项目的童鞋都知道,一个项目中Java代码经常会依赖其他的jar包中的class,或者依赖其它的项目,手动添加依赖是一个比较麻烦的事,尤其类似A依赖B,B又依赖C,C依赖D这种情况。
有了Maven,我们只需要在POM文件中定义依赖A,Maven就可以自动的添加其他所需的依赖了。
Maven还有很多有用的插件来帮助我们完成其他麻烦的事情,比如打包。Maven本身是Java开发,所以开发Maven的插件也比较简单,但是我们这里不深入研究。
另外,有人会问Maven和Ant的区别,我想说,你可以在《Maven权威指南》第一章的1.6节找到答案。
Maven还能降一个项目转化为Eclipse可以支持的项目,便于导入Eclipse。现在Eclipse也有插件支持Maven了,叫做 m2eclipse。
三、Maven有哪些常识?
Maven有个概念叫做“约定优于配置(Convention Over Configuration)”,意思就是很多东西都是预先约定好的,我们不需要进行修改,只需要按照这种方式来就好了。比如项目的目录结构,Maven约定成如下:
目录 |
目的 |
${basedir} |
存放 pom.xml和所有的子目录 |
${basedir}/src/main/java |
项目的 java源代码 |
${basedir}/src/main/resources |
项目的资源,比如说 property文件 |
${basedir}/src/test/java |
项目的测试类,比如说 JUnit代码 |
${basedir}/src/test/resources |
测试使用的资源 |
${basedir}/target/classes |
编译后的class文件 |
${basedir}/target |
打包的Jar文件 |
Maven有三套相互独立的生命周期,Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
- Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
- Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
- Site Lifecycle 生成项目报告,站点,发布站点。
核心部分的生命周期划分为以下几个阶段:
生命周期阶段 |
描述 |
validate |
验证项目是否正确,以及所有为了完整构建必要的信息是否可用 |
generate-sources |
生成所有需要包含在编译过程中的源代码 |
process-sources |
处理源代码,比如过滤一些值 |
generate-resources |
生成所有需要包含在打包过程中的资源文件 |
process-resources |
复制并处理资源文件至目标目录,准备打包 |
compile |
编译项目的源代码 |
process-classes |
后处理编译生成的文件,例如对Java类进行字节码增强(bytecode enhancement) |
generate-test-sources |
生成所有包含在测试编译过程中的测试源码 |
process-test-sources |
处理测试源码,比如过滤一些值 |
generate-test-resources |
生成测试需要的资源文件 |
process-test-resources |
复制并处理测试资源文件至测试目标目录 |
test-compile |
编译测试源码至测试目标目录 |
test |
使用合适的单元测试框架运行测试。这些测试应该不需要代码被打包或发布 |
prepare-package |
在真正的打包之前,执行一些准备打包必要的操作。这通常会产生一个包的展开的处理过的版本(将会在Maven 2.1+中实现) |
package |
将编译好的代码打包成可分发的格式,如JAR,WAR,或者EAR |
pre-integration-test |
执行一些在集成测试运行之前需要的动作。如建立集成测试需要的环境 |
integration-test |
如果有必要的话,处理包并发布至集成测试可以运行的环境 |
post-integration-test |
执行一些在集成测试运行之后需要的动作。如清理集成测试环境。 |
verify |
执行所有检查,验证包是有效的,符合质量规范 |
install |
安装包至本地仓库,以备本地的其它项目作为依赖使用 |
deploy |
复制最终的包至远程仓库,共享给其它开发人员和项目(通常和一次正式的发布相关) |
Maven插件和目标。使用Maven的过程,其实也是执行一个个Maven插件的过程。比如我们执行compile编译的时候,其实是调用Maven的maven-compiler-plugin插件完成的。还有很多插件包括maven-clean-plugin,maven-dependency-plugin,maven-assembly-plugin等。每一个插件都有相应的目标,每一个目标都是一个可以单独执行的任务。后面我们在命令行中使用
mvn archetype:create -DgroupId=com.dc.test -DartifactId=helloworld
快速创建一个Java项目的时候,我们其实也是执行了archetype插件的create目标,并给这个目标传递了groupId和artifactId的参数。
Maven仓库。Maven运行的时候,需要的插件都是从中央仓库(在配置文件中指定,有默认的,就像Linux的安装源一样)下载,下载之后,会存在本地的仓库中,下次使用就不用再去下载了,Maven本身很小,但是本地仓库在使用之后会越来越大(笔者用了几次之后仓库就用1G多了)。
Maven坐标。Maven坐标定义了一组标识,它们可以用来唯一标识一个项目,一个依赖,或者Maven POM里的一个插件。一般坐标使用groupId, artifactId, version和packaging来实现:
名称 |
作用 |
groupId |
团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。来自Sonatype的项目有一个以com.sonatype开头的groupId,而Apache Software的项目有以 org.apache开头的groupId。 |
artifactId |
在groupId下的表示一个单独项目的唯一标识符。 |
version |
一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个 |
packaging |
项目的类型,默认是jar,描述了项目打包后的输出。类型为jar的项目产生一个 |
POM文件(pom.xml)。当Maven运行的时候它向项目对象模型(POM)查看关于这个项目的信息。POM回答类似这样的问题:这个项目是什么类型的?这个项目的名称是什么?这个项目的构建有自定义么?详细的POM语法查看Maven官网的POM Reference
下面是一个由Maven Archetype插件的create目标创建的默认的pom.xml文件:
![](https://code.csdn.net/assets/CODE_ico.png)
- <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>org.sonatype.mavenbook.ch03</groupId>
- <artifactId>simple</artifactId>
- <packaging>jar</packaging>
- <version>1.0-SNAPSHOT</version>
- <name>simple</name>
- <url>http://maven.apache.org</url>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- </project>
四、怎么快速用Maven构建一个Java项目?
1) 首先下载Maven,地址:http://maven.apache.org/
2) 修改 Maven 的本地仓库地址,在Maven安装目录下的conf/settings.xml中修改localRepository节点
3) 如果要使用m2eclipse插件(这里用的Eclipse是Luna版本),配置
修改插件的Maven配置文件路径为外部的Maven。
打开Eclipse菜单Window - Preference,修改如下
4) 快速创建一个HelloWorld项目。我们
其中-DinteractiveMode表示我们使用的是非交互模式,在创建过程中我们不需要选择和输入参数。
我们查看目录,发现默认生成了如下的代码
以及默认的POM文件
切换到pom.xml文件所在目录,
使用mvn compile进行编译(会默认执行compile前面所有生命周期阶段)
使用mvn test进行测试(会默认执行test前面所有的生命周期阶段)
需要用到其他依赖的时候,在如下地址进行搜索:
http://search.maven.org/
比如需要使用mahout
拷贝结果中的pom到本地项目中POM文件中对应的位置即可,就可以自动完成依赖的管理。
要直接支持某个含main函数的类时,可以使用exec-maven-plugin,详细了解移步http://mojo.codehaus.org/exec-maven-plugin/
要打包jar文件时,可以使用shade插件,支持精简jar包,去掉没有用到的东西。另外也有一些其他打包的插件,可以自己查阅。shade插件深入了解移步http://maven.apache.org/plugins/maven-shade-plugin/
要将项目转换为Eclipse支持的项目,使用mvn eclipse:eclipse命令,我们就可以使用Eclipse导入了。
五、参考文献:
《maven权威指南》
《maven实战》
Maven官网:
http://maven.apache.org/
Oracle 教程:
http://www.oracle.com/technetwork/cn/community/java/apache-maven-getting-started-1-406235-zhs.html
http://my.oschina.net/heguangdong/blog/50302
Marven:使用Maven构建Java项目相关推荐
- maven 构建java项目,jdk版本问题
为什么80%的码农都做不了架构师?>>> 使用maven构建Java项目,默认的 jdk 版本是1.5 详情见官方说明:https://maven.apache.org/plu ...
- 使用Maven构建Java项目
使用Maven构建Java项目 本指南将引导您使用Maven构建一个简单的Java项目. 你会建立什么 您将创建一个提供一天中时间的应用程序,然后使用Maven进行构建. 你需要什么 约15分钟 最喜 ...
- Maven构建java项目
本篇文章,我们会教你如何用maven创建一个java项目,学会如何导入到eclipse中,将该java项目打包成一个jar文件并成功执行. 关于maven:它是apache基金会推出的一个项目管理工具 ...
- 使用Gradle构建Java项目
使用Gradle构建Java项目 本指南将引导您使用Gradle构建一个简单的Java项目. 你会建立什么 您将创建一个简单的应用程序,然后使用Gradle进行构建. 你需要什么 约15分钟 最喜欢的 ...
- 云效(原RDC)如何构建一个基于Maven的Java项目
最近在将公司的持续集成架构做一个系统的调整,调整过程中受到了RDC团队大量的帮助,所以利用国庆时间写了几篇RDC的分享,希望能让更多的人了解和用好RDC这个产品. 我会把我最近3个月的使用体会分成5个 ...
- Maven-EclipseEE使用Maven构建Java web项目从0到1
Maven是什么 安装Maven 解压apache-maven-350-binzip 新建变量M2_HOME配置Maven主目录 在 Path 变量中添加 Maven的bin目录 命令窗口mvn -v ...
- myeclipse java maven web 项目结构,Myeclipse 10 Maven 构建 Java Web 项目
下载 Maven http://maven.apache.org/download.cgi,解压到任意非C盘位置,比如:D:\Java\apache-maven-3.1.0 打开 Myeclipse ...
- Jenkins+maven+SVN构建java项目中遇到的问题及解决
Jenkins+maven+SVN构建java项目中遇到的问题及解决 参考文章: (1)Jenkins+maven+SVN构建java项目中遇到的问题及解决 (2)https://www.cnblog ...
- DOS命令行中用MAVEN构建Java和Java Web项目
一.Maven的安装 : 1.将maven3.0解压到任一目录下,如D:\Program Files 2.配置环境变量:变量名:MAVEN_HOME 变量值:D:\Program Files\ap ...
最新文章
- Druid.io索引过程分析——时间窗,列存储,LSM树,充分利用内存,concise压缩
- linux 常用查看网络连接方法及脚本
- linux mysql UNSIGNED,关于mysql:MySqlint10-与-int-unsigned-之前的区别
- 操作系统源代码_国产操作系统“之光”?Windows XP绝密源代码泄露,BT种子已在网上疯传...
- 免费都不管用,Win10升级在中国怎么就这么难?
- Java 9示例–收集的工厂方法–创建不可修改的列表,集合和映射
- 腾讯京东要建“反阿里联盟”?Python 或成 Excel 官方脚本语言;百度华为在一起 | 一周业界事
- 取名字_新生婴儿取名字大全2021
- 太阳能充电调节代码_永不插电!这款薄膜太阳能动力汽车可连续行驶一个月
- vs2010下libevent的使用
- 教你win7关闭开机动画,大幅度加快开机时间
- 【MATLAB】进阶绘图 ( imagesc 缩放颜色显示图像 | imagesc 函数 | Colormaps 颜色图 )
- PolSARpro导入外部极化矩阵数据(以高分三号为例,附格式转化代码)
- Nginx 缓存配置
- 裁剪算法——中点分割算法/Liang-Barsky算法
- JS将sql的dateTime格式数据例如:Wed Sep 30 00:00:00 CST 2020 字符串转换成2020-09-30 00:00:00时间格式
- 那一年我是如何从功能测试跨入自动化测试的,绝对让你不虚此行!
- 微服务组件之限流器与熔断器
- 更改windows7下DOS界面属性的方法
- http://www.cnblogs.com/txw1958/p/alipay-f2fpay.html
热门文章
- M102: MongoDB for DBAs chapter 3 performance学习记录
- 关于PSP-T082主板的鉴别方法细究
- python与h5开发_【Python】真零基础Python开发web
- 联通保定服务器稳定吗,保定联通5G网络正式开通!贴心“秘籍”教您5G网络的正确打开方式...
- 目前较好的私域流量运营软件有哪些?
- python分析人口出生率代码_国家统计局居然也能用的上Python?人口数据Python脚本了解一下?...
- 夏天到来了,可以去做这5个生意,投入成本不大,利润却非常不错
- PowerPoint 2019无法插入Microsoft Web Browser控件
- Docker自动部署Apache Tomcat
- maya中arnord渲染器渲染不连续单帧的方法