Maven之(四)Maven命令
常用命令
从某种意义上来说,软件是帮助不懂程序的人来操作计算机的,图形化界面尤其如此。在上个世纪,比尔盖茨之所以成为世界首富,微软之所以IT界的巨鳄,就是因为Windows开图形化操作之先河,并抢先占领了全球市场,笑傲江湖数十年,至今依然宝刀未老。
诚然,现在几乎每种软件都有图形化界面,用鼠标点击几下就可以完成操作。Maven也不例外,在各类IDE中都有成熟的插件来简化操作。
但是作为开发人员,应该时刻保持着一种职业神圣感,我们拥有上帝之手,借助程序来操纵着计算机世界的一切。我们与计算机交流的正途是通过命令,而不是图形化界面。东汉末年分三国,为什么?很大一部分因素就是因为宦官集团隔断了皇权与士大夫之间的直接联系!图形化界面是人机交互的第三者,阻止着我们与计算机的亲密接触,长此以往,必生间隙。吾辈不可不慎也哉!
总而言之,图形化界面不是不能用,因为它确实有好处,可以提高开发效率,规避操作失误。我的观点是,用它,但是不要依赖它。
作为开发利器的maven,为我们提供了十分丰富的命令,了解maven的命令行操作并熟练运用常见的maven命令还是十分必要的。无论多先进多炫的图形化界面,底层都得靠maven命令来驱动。知其然,知其所以然,方能百战不殆。
在讲解插件的那一篇文章中已经说过,maven的所有任务都是通过插件来完成的,它本身只是一个空空如也的框架,不具备执行具体任务的能力。
maven的命令格式如下:
mvn [plugin-name]:[goal-name]
该命令的意思是:执行“plugin-name”插件的“goal-name”目标(或者称为动作)。
用户可以通过两种方式调用Maven插件目标。第一种方式是将插件目标与生命周期阶段(lifecycle phase)绑定,这样用户在命令行只是输入生命周期阶段而已,例如Maven默认将maven-compiler-plugin的compile目标与compile生命周期阶段绑定,因此命令mvn compile实际上是先定位到compile这一生命周期阶段,然后再根据绑定关系调用maven-compiler-plugin的compile目标。第二种方式是直接在命令行指定要执行的插件目标,例如mvnarchetype:generate 就表示调用maven-archetype-plugin的generate目标,这种带冒号的调用方式与生命周期无关。
常用的maven命令如下:
Maven命令列表 |
|
mvn –version |
显示版本信息 |
mvn clean |
清理项目生产的临时文件,一般是模块下的target目录 |
mvn compile |
编译源代码,一般编译模块下的src/main/Java目录 |
mvn package |
项目打包工具,会在模块下的target目录生成jar或war等文件 |
mvn test |
测试命令,或执行src/test/java/下junit的测试用例. |
mvn install |
将打包的jar/war文件复制到你的本地仓库中,供其他模块使用 |
mvn deploy |
将打包的文件发布到远程参考,提供其他人员进行下载依赖 |
mvn site |
生成项目相关信息的网站 |
mvn eclipse:eclipse |
将项目转化为Eclipse项目 |
mvn dependency:tree |
打印出项目的整个依赖树 |
mvn archetype:generate |
创建Maven的普通java项目 |
mvn tomcat:run |
在tomcat容器中运行web应用 |
mvn jetty:run |
调用 Jetty 插件的 Run 目标在 Jetty Servlet 容器中启动 web 应用 |
注意:运行maven命令的时候,首先需要定位到maven项目的目录,也就是项目的pom.xml文件所在的目录。否则,必以通过参数来指定项目的目录。
命令参数
上面列举的只是比较通用的命令,其实很多命令都可以携带参数以执行更精准的任务。
Maven命令可携带的参数类型如下:
1. -D 传入属性参数
比如命令:
mvn package -Dmaven.test.skip=true
以“-D”开头,将“maven.test.skip”的值设为“true”,就是告诉maven打包的时候跳过单元测试。同理,“mvn deploy-Dmaven.test.skip=true”代表部署项目并跳过单元测试。
2. -P 使用指定的Profile配置
比如项目开发需要有多个环境,一般为开发,测试,预发,正式4个环境,在pom.xml中的配置如下:
- <profiles>
- <profile>
- <id>dev</id>
- <properties>
- <env>dev</env>
- </properties>
- <activation>
- <activeByDefault>true</activeByDefault>
- </activation>
- </profile>
- <profile>
- <id>qa</id>
- <properties>
- <env>qa</env>
- </properties>
- </profile>
- <profile>
- <id>pre</id>
- <properties>
- <env>pre</env>
- </properties>
- </profile>
- <profile>
- <id>prod</id>
- <properties>
- <env>prod</env>
- </properties>
- </profile>
- </profiles>
- ......
- <build>
- <filters>
- <filter>config/${env}.properties</filter>
- </filters>
- <resources>
- <resource>
- <directory>src/main/resources</directory>
- <filtering>true</filtering>
- </resource>
- </resources>
- ......
- </build>
profiles定义了各个环境的变量id,filters中定义了变量配置文件的地址,其中地址中的环境变量就是上面profile中定义的值,resources中是定义哪些目录下的文件会被配置文件中定义的变量替换。
通过maven可以实现按不同环境进行打包部署,命令为:
mvn package -P dev
其中“dev“为环境的变量id,代表使用Id为“dev”的profile。
3. -e 显示maven运行出错的信息
4. -o 离线执行命令,即不去远程仓库更新包
5. -X 显示maven允许的debug信息
6. -U 强制去远程更新snapshot的插件或依赖,默认每天只更新一次
maven命令实例
下面结合几个实例来看看maven命令的使用方法。
archetype:create & archetype:generate
“archetype”是“原型”的意思,maven可以根据各种原型来快速创建一个maven项目。
archetype:create是maven 3.0.5之前创建项目的命令,例如创建一个普通的Java项目:
mvn archetype:create -DgroupId=packageName -DartifactId=projectName -Dversion=1.0.0-SNAPSHOT
后面的三个参数用于指定项目的groupId、artifactId以及version。
创建Maven的Web项目:
mvnarchetype:create -DgroupId=packageName -DartifactId=projectName -DarchetypeArtifactId=maven-archetype-webapp
archetypeArtifactId参数用于指定使用哪个maven原型,这里使用的是maven-archetype-webapp,maven会按照web应用的目录结构生成项目。
需要注意的是,在maven 3.0.5之后,archetype:create命令不在使用,取而代之的是archetype:generate命令。
该命令会以交互的模式创建maven项目,不需要像archetype:create那样在后面跟一堆参数,很容易出错。
但是,在命令行直接运行archetype:generat,往往会出现下面的结果:
程序卡在了“Generatingproject in Interactive mode”这一步,加入“-X”参数显示详细信息:
mvn -X archetype:generate
运行结果如下:
可见,最终是卡到这一行,maven默认会从远程服务器上获取catalog,archetypeCatalog 表示插件使用的archetype元数据,默认值为remote,local,即中央仓库archetype元数据 (http://repo1.maven.org/maven2/archetype-catalog.xml)加上插件内置元数据,由于中央仓库的archetype太多(几千个)而造成程序的阻滞。实际上我们使用不了那么多的原型,加入-DarchetypeCatalog=internal参数就可以避免这种情况,只使用内置的原型就够了:
mvn archetype:generate -DarchetypeCatalog=internal
然后maven会告诉你,archetype没有指定,默认使用maven-archetype-quickstart,或者你从下面的列表中选择一个可用的原型:
列表中可用的内置原型共有10个,我们选择使用maven-archetype-quickstart原型(相当于一个“HelloWorld”模板)来创建项目,输入对应的序号“7”即可。
然后会依次提醒你输入groupId、artifactId、version(默认1.0-SNAPSHOT)以及创建的第一个包名。
如果构建成功就会在你的当前目录下,按照你输入的参数生成一个maven项目。
eclipse:eclipse
正式的开发环境中,代码一般是通过cvs、svn或者Git来管理,我们从服务器下载下来源代码,然后执行mvn eclipse:eclipse生成ecllipse项目文件,然后导入到eclipse就行了。
tomcat:run
用了maven后,可以不需要用eclipse里的tomcat来运行web项目(实际工作中经常会发现用它会出现不同步更新的情况),只需在对应目录里运行 mvn tomat:run命令,然后就可在浏览器里运行查看了。
首先来看一下maventomcat插件的配置:
- <plugin>
- <groupId>org.apache.tomcat.maven</groupId>
- <artifactId>tomcat7-maven-plugin</artifactId>
- <version>2.2</version>
- <configuration>
- <port>8080</port>
- <path>/dubbo-admin</path>
- <uriEncoding>UTF-8</uriEncoding>
- <finalName>dubbo-admin</finalName>
- <server>tomcat7</server>
- </configuration>
- </plugin>
然后配置jsp,servlet依赖等:
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <version>2.5</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>javax.servlet.jsp</groupId>
- <artifactId>jsp-api</artifactId>
- <version>2.2</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>jstl</artifactId>
- <version>1.2</version>
- </dependency>
- <dependency>
- <groupId>jsptags</groupId>
- <artifactId>pager-taglib</artifactId>
- <version>2.0</version>
- <scope>provided</scope>
- </dependency>
然后按照下面的方式运行:
还可以加入以下参数:跳过测试:-Dmaven.test.skip(=true);指定端口:-Dmaven.tomcat.port=9090;忽略测试失败:-Dmaven.test.failure.ignore=true当然,如果你的其它关联项目有过更新的话,一定要在项目根目录下运行mvn clean install来执行更新,再运行mvn tomcat:run使改动生效。
help:describe
maven有各种插件,插件又有各种目标。我们不可能记得每个插件命令。maven提供了查询各类插件参数的命令:mvn help:describe。
例如:mvn help:describe -Dplugin=help
代表查询help 插件的命令规范,然后maven就会告诉你该命令有几个goal,各种参数的的意义以及配置方法:
下面的命令则代表插叙该插件的详细命令参数:
maven会告诉你该命令有什么参数,怎么使用,一览无余。
Maven之(四)Maven命令的更多相关文章
- Maven学习(四)-----Maven中央存储库
Maven中央存储库 当你建立一个 Maven 的项目,Maven 会检查你的 pom.xml 文件,以确定哪些依赖下载.首先,Maven 将从本地资源库获得 Maven 的本地资源库依赖资源,如果没 ...
- (转)Maven学习总结(四)——Maven核心概念
孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(四)——Maven核心概念 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Mav ...
- 创建maven项目(cmd 命令)
2016五月 22 原 创建maven项目(cmd 命令) 分类:maven (994) (0) 1.普通方式创建 1)进入cmd窗口执行 mvn archetype:generate 2) 光标停止 ...
- (八)Eclipse创建Maven项目运行mvn命令
1.Eclipse创建Maven项目 使用Eclipse创建一个Maven项目非常的简单,选择菜单项File>New>Other(也可以在项目结构空白处右击鼠标键),在弹出的对话框中选择M ...
- maven 基本常识以及命令
Maven库: http://repo2.maven.org/maven2/ Maven依赖查询: http://mvnrepository.com/ Maven常用命令: 1. 创建Maven的普通 ...
- m2eclipse简单使用,创建Maven项目 ,运行mvn命令(转)
前面介绍了如何安装m2eclipse,现在,我们使用m2ecilpse导入Hello World项目. 选择菜单项File,然后选择Import,我们会看到一个Import对话框,在该对话框中选择Ge ...
- java分模块项目在idea中使用maven打包失败(ps:maven常用到的命令)
一.分模块项目打包失败 情况:项目是分模块创建的,一些公共的方法是单独的一个模块common,其他模块依赖于此模块,poom依赖已经添加了,项目可以正常运行,但使用maven打包时出现了问题:找不到依 ...
- 手动用maven安装jar的命令
手动用maven安装jar的命令: mvn install:install-file -DgroupId=com.oracle.jdbc -DartifactId=ojdbc5 -Dversion=1 ...
- maven的一些基础命令
1.显示当前构建的实际pom,包括活动的Profile mvn help:effective-pom 2.打印出项目的世界settings,包含从全局的settings和用户级别settings继承的 ...
- maven 打包构建相关命令
1.命令 mvn clean package 依次执行clean.resources.compile.testResources.testCompile.test.jar(打包)等7个阶段. mvn ...
随机推荐
- 使用javaservice 将jboss 注册为服务
近来做项目,需要jboss定期重新启动.不想再看到jboss启动那个黑洞洞的窗口,就想着把它注册为服务,然后在net start.恰好objectweb上有个open source的javaservi ...
- 更改MYSQL数据库不区分大小写表名
今天郁闷死了,在LINUX下调一个程序老说找不到表,但是我明明是建了表的,在MYSQL的命令行下也可以查到,为什么程序就找不到表呢? 后来请教了一个老师才搞定,原来是LINUX下的MYSQL默认是要区 ...
- Ubuntu中的.bashrc文件
/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置./etc/bashrc:为每一个运 ...
- Linux : fedora 安装 vnc server
Linux配置VNC服务 安装VNC服务端 #yum install vnc-server 配置VNC服务参数文件 编辑vncservers文件追加如下 #vi /etc/sysconfig/vncs ...
- Dynamics CRM不发布JS调试
本博客已迁移至 http://www.krely.cn/ 上个项目做了一年多,大多是在做JS的开发,由于开发人数比较多,着实被坑的不轻.因为JS修改完成之后必须要发布,对于我们动辄几千行的JS的调 ...
- 安装mono和jexus,运行asp.net程序
随笔- 62 文章- 1 评论- 7 raspberrypi(树莓派)上安装mono和jexus,运行asp.net程序 参考网址: http://www.linuxdot.net/ htt ...
- [转]Getting a Packet Trace
src:https://developer.apple.com/library/mac/qa/qa1176/_index.html Technical Q&A QA1176 Getting a ...
- iframe跨域通讯
工作中遇到一个问题,IFRAME嵌套了一个外部页面用于统计 统计的JS由我们提供,并且需要提供热点图 一开始就碰到的问题就是 不知道页面高度 需要子页面传回页面高度用于将IFRAME拉升到合适高度 当 ...
- Orchard学习计划
http://esshs.cnblogs.com/ http://orchardproject.net/http://www.orchardch.com/Documenthttps://orchard ...
- mac下安装eclipse以及python
因为前几天刚重装了我的mac osx 系统,从昨天开始我就在安装各种软件,当我安装好破解版的myeclipse后,在我安装pydev插件的时候,虽然现实成功但是在preference中死活找不到pyd ...