写在前面
- 本文主要基于命令行进行mvn操作。
- 实际开发中应该很少用到这样的操作,但是掌握这些操作有助于理解Maven的运行机制。
- 技术小白,写的不对,请批评指正。
(一)安装和配置
- 安装其实没啥可讲的,官网http://maven.apache.org/download.cgi 下载编译好的 binary zip 压缩包,解压到目录即可。
- 配置环境变量MAVEN_HOME 或 M2_HOME即Maven的解压目录,我的是M2_HOME=F:\dev\plugins\maven\apache-maven-3.6.0,并在Path中引用,追加%MAVEN_HOME%\bin; 或 %M2_HOME%\bin。
TIPS: 在网上有配MAVEN_HOME,也有M2_HOME的。MAVEN_HOME是使用的Maven 1,M2_HOME 是使用的MAVEN 2.0 及以上版本。
完成后,cmd输入 mvn -version 有信息弹出表示ok。
(二)Maven命令介绍
本部分参考了 https://blog.youkuaiyun.com/u012152619/article/details/51473410 ,解开了我很多的疑问,也让我对目标和生命周期有了更好的理解和认识。
1. 命令格式及说明
- maven的所有任务都是通过命令调用插件来完成的,它本身只是一个空空如也的框架,不具备执行具体任务的能力。
- 格式:
mvn [plugin-name]:[goal-name]
- 说明:执行“plugin-name”插件的“goal-name”目标(或者称为动作)。
- 常用命令列表:
2. 调用命令的两种方式
- 第一种方式是将插件
目标
与生命周期阶段(lifecycle phase)
绑定,这样用户在命令行只是输入生命周期阶段而已,例如Maven默认将maven-compiler-plugin的compile目标与compile生命周期阶段绑定,因此命令mvn compile实际上是先定位到compile这一生命周期阶段,然后再根据绑定关系调用maven-compiler-plugin的compile目标。 - 第二种方式是直接在命令行指定要执行的插件目标,例如mvn archetype:generate 就表示调用maven-archetype-plugin的generate目标,这种带冒号的调用方式与生命周期无关。
TIPS:运行maven命令的时候,首先需要定位到maven项目的目录,也就是项目的pom.xml文件所在的目录。否则,必以通过参数来指定项目的目录。
3. 命令的参数
-
-D 传入属性参数
例如:mvn package -Dmaven.test.skip=true
,告诉maven打包的时候跳过单元测试. -
-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。
-
-e 显示maven运行出错的信息
-
-o 离线执行命令,即不去远程仓库更新包
-
-X 显示maven允许的debug信息
-
-U 强制去远程更新snapshot的插件或依赖,默认每天只更新一次
(三)命令实例
1.使用命令创建java项目
- cd 到你想创建工程的目录
TIPS: 在我的电脑地址栏直接输入cmd回车,可快速进入当前地址的命令行。 - 操作命令 : mvn archetype:generate -DgroupId=com.doudou -DartifactId=Hello -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
- 说明:
组成部分 | 说明 |
---|---|
mvn | 所有的maven命令都以mvn开头 mvn |
archetype:generate | 告诉Maven我需要使用模板生成一个项目(archetype 指的就是maven中的模板) |
-DgroupId=com.doudou | 指明生产项目的组织ID(maven坐标组成部分之一) |
-DartifactId=Hello | 指明项目的名称 (maven坐标组成部分之一) |
-DarchetypeArtifactId=maven-archetype-quickstart | 指明需要使用的模板(maven-archetype-quickstart 是一种常用的创建java工程的模板) |
-DinteractiveMode=false | 表示禁用交互方式创建,因为我们已经在命令中指明了所需要的参数,如果只是mvn archetype:generate 命令的话,就不需要写-DinteractiveMode=false 了,因为他会通过交互方式列出或让我们输入参数 |
maven提供的一些模板原型分别是:
序号 | 模板名称 | 模板说明 |
---|---|---|
1: | appfuse-basic-jsf | 创建一个基于Hibernate,Spring和JSF的Web应用程序的原型 |
2: | appfuse-basic-spring | 创建一个基于Hibernate,Spring和Spring MVC的Web应用程序的原型 |
3: | appfuse-basic-struts | 创建一个基于Hibernate,Spring和Struts 2的Web应用程序的原型 |
4: | appfuse-basic-tapestry | 创建一个基于Hibernate,Spring 和 Tapestry 4的Web应用程序的原型 |
5: | appfuse-core | 创建一个基于Hibernate,Spring 和 XFire的jar应用程序的原型 |
6: | appfuse-modular-jsf | 创建一个基于Hibernate,Spring和JSF的模块化应用原型 |
7: | appfuse-modular-spring | 创建一个基于Hibernate, Spring 和 Spring MVC 的模块化应用原型 |
8: | appfuse-modular-struts | 创建一个基于Hibernate, Spring 和 Struts 2 的模块化应用原型 |
9: | appfuse-modular-tapestry | 创建一个基于 Hibernate, Spring 和 Tapestry 4 的模块化应用原型 |
10: | maven-archetype-j2ee-simple | 一个简单的J2EE的Java应用程序 |
11: | maven-archetype-marmalade-mojo | 一个Maven的 插件开发项目 using marmalade |
12: | maven-archetype-mojo | 一个Maven的Java插件开发项目 |
13: | maven-archetype-portlet | 一个简单的portlet应用程序 |
14: | maven-archetype-profiles | |
15: | maven-archetype-quickstart | |
16: | maven-archetype-site-simple | 简单的网站生成项目 |
17: | maven-archetype-site | 更复杂的网站项目 |
18: | maven-archetype-webapp | 一个简单的Java Web应用程序 |
19: | jini-service-archetype | Archetype for Jini service project creation |
20: | softeu-archetype-seam | JSF+Facelets+Seam Archetype |
21: | softeu-archetype-seam-simple | JSF+Facelets+Seam (无残留) 原型 |
22: | softeu-archetype-jsf | JSF+Facelets 原型 |
23: | jpa-maven-archetype | JPA 应用程序 |
24: | spring-osgi-bundle-archetype | Spring-OSGi 原型 |
25: | confluence-plugin-archetype | Atlassian 聚合插件原型 |
26: | jira-plugin-archetype | Atlassian JIRA 插件原型 |
27: | maven-archetype-har | Hibernate 存档 |
28: | maven-archetype-sar | JBoss 服务存档 |
29: | wicket-archetype-quickstart | 一个简单的Apache Wicket的项目 |
30: | scala-archetype-simple | 一个简单的scala的项目 |
31: | lift-archetype-blank | 一个 blank/empty liftweb 项目 |
32: | lift-archetype-basic | 基本(liftweb)项目 |
33: | cocoon-22-archetype-block-plain | [http://cocoapacorg2/maven-plugins/] |
34: | cocoon-22-archetype-block | [http://cocoapacorg2/maven-plugins/] |
35: | cocoon-22-archetype-webapp | [http://cocoapacorg2/maven-plugins/] |
36: | myfaces-archetype-helloworld | 使用MyFaces的一个简单的原型 |
37: | myfaces-archetype-helloworld-facelets | 一个使用MyFaces和Facelets的简单原型 |
38: | myfaces-archetype-trinidad | 一个使用MyFaces和Trinidad的简单原型 |
39: | myfaces-archetype-jsfcomponents | 一种使用MyFaces创建定制JSF组件的简单的原型 |
40: | gmaven-archetype-basic | Groovy的基本原型 |
41: | gmaven-archetype-mojo | Groovy mojo 原型 |
- 结果:
生成的目录结构如下所示(tree.txt是我之前生成的目录结构不用管它):
TIPS: 在windows下,可以通过tree命令导出当前目录结构,如
/f 表示带上后缀名
>tree.txt表示导入将当前结构导入到tree.txt文档
2. 使用命令创建web工程
- 创建web工程和java工程命令基本一致,只是参数不同
- 操作命令:mvn archetype:generate -DgroupId=com.doudou -DartifactId=HelloFriend -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
- 说明
命令 | 说明 |
---|---|
-DarchetypeArtifactId=maven-archetype-webapp | maven-archetype-webapp 是maven一种常用的创建web项目的模板 |
- 结果
生成的文档结构如下:
3.将一个Maven Java项目转化成一个Eclipse项目
- cd至项目文件夹
- 操作命令:
mvn eclipse:eclipse
- 说明 :
1 . 运行该命令前可以先运行另外两个命令:mvn clean
和mvn eclipse:clean
.原因是先清理Maven项目的target目录,接着清理.classpath
和.project
,最后再去执行mvn eclipse:eclipse
. - 结果:
这是转换后的目录结构(tree.txt是我之前生成的目录结构不用管它):
可以看到,多了.classpath
和.project
文件,这样我们在eclipse中可以直接Import进入该工程了。
4.将一个Maven Web项目转化成一个Eclipse项目
- 转化web工程和java工程命令基本一致,只是多了一个参数
- 操作命令:
mvn eclipse:eclipse -Dwtpversion=2.0
- 说明:
-Dwtpversion=2.0
负责告诉 Maven 将项目转换到 Eclipse 的 Web 项目(WAR),而不是默认的Java项目(JAR) - 结果:
项目目录结构如下:
可以看到,多了.classpath
和.project
文件的同时,还创建了target目录和其下的classes目录,用户存放编译后的结果文件。这样我们在eclipse中可以直接Import进入该工程了。
5.部署至服务器运行
- maven可以通过配置tomcat服务器插件,运行创建的项目。
- 命令:
mvn tomcat:run
- pom.xml 配置如下内容:
(1) maven tomcat插件
<plugins>
...
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/HelloFriend</path>
<uriEncoding>UTF-8</uriEncoding>
<finalName>HelloFriend</finalName>
<server>tomcat7</server>
</configuration>
</plugin>
</plugins>
(2) 配置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>
说明:<scope>
的作用时:指明依赖作用于maven的那些生命周期。
通常有 compile、provided、runtime、test、system 等选项:
【1】 compile,缺省值,适用于所有阶段,会随着项目一起发布。
【2】provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
【3】runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
【4】 test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
【5】system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
- 运行命令:
mvn tomcat:run
此时会报错
虽然我们在插件中配置的是tomcat7-maven-plugin,但是maven默认会启用tomcat6,导致访问jsp时报错,无法编译JSP.
解决办法:mvn tomcat7:run
此时后台就不会报错,页面正常访问。
TIPS:控制台不会打xxx started
,而是一直在Starting状态,此时已经运行成功,访问页面即可。
6.安装Jar至本地仓库(针对在中央仓库找不到的jar,以kaptcha.jar为例)
- kaptcha.jar 介绍
kaptcha是一个流行的第三方java库,可以用来生成 “验证码” 的图片,以组织恶意访问或垃圾邮件。但是他不在maven的中央仓库中。 - 下载kaptcha.jar
- 执行命令
mvn install:install-file -Dfile=[kaptcha.jar所在路径] -DgroupId=[jar对应的组织Id] -DartifactId=[jar对应的项目名称] -Dversion=[jar的版本号] -Dpackaging=jar
示例:
mvn install:install-file -Dfile=c:\kaptcha-2.3.jar -DgroupId=com.google.code -DartifactId=kaptcha -Dversion=2.3 -Dpackaging=jar
- 结果
在本地仓库中现在可以找到kaptcha-2.3.jar