我们只需要注意一点:执行后面的命令时,前面的命令自动得到执行。
实际上,我们最常用的就是这么几个:
clean:有问题,多清理!
package:打成Jar or War包,会自动进行clean+compile
install:将本地工程Jar上传到本地仓库
deploy:上传到私服
依赖关系
Lifecycle/Phase/Goal
使用Maven时,我们首先要了解什么是Maven的生命周期(lifecycle)。
Maven的生命周期由一系列阶段(phase)构成,以内置的生命周期default为例,它包含以下phase:
validate
initialize
generate-sources
process-sources
generate-resources
process-resources
compile
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources
test-compile
process-test-classes
test
prepare-package
package
pre-integration-test
integration-test
post-integration-test
verify
install
deploy
如果我们运行mvn package
,Maven就会执行 default 生命周期,它会从开始一直运行到package 这个phase为止:
validate
...
package
如果我们运行mvn compile
,Maven也会执行 default 生命周期,但这次它只会运行到compile,即以下几个phase:
validate
...
compile
Maven另一个常用的生命周期是 clean
,它会执行3个phase:
pre-clean
clean (注意这个clean不是lifecycle而是phase)
post-clean
所以,我们使用 mvn
这个命令时,后面的参数是 phase,Maven自动根据生命周期运行到指定的 phase。
更复杂的例子是指定多个 phase,例如,运行mvn clean package
,Maven先执行 clean
生命周期并运行到 clean
这个 phase,然后执行 default 生命周期并运行到package
这个phase,实际执行的phase如下:
pre-clean
clean (注意这个clean是phase)
validate
...
package
在实际开发过程中,经常使用的命令有:
-
mvn clean
:清理所有生成的 class 和 jar; -
mvn clean compile
:先清理,再执行到 compile; -
mvn clean test
:先清理,再执行到test,因为执行 test 前必须执行 compile,所以这里不必指定compile; -
mvn clean package
:先清理,再执行到 package。
大多数 phase 在执行过程中,因为我们通常没有在 pom.xml 中配置相关的设置,所以这些phase 什么事情都不做。
经常用到的 phase 其实只有几个:
clean:清理
compile:编译
test:运行测试
package:打包
Goal
执行一个 phase 又会触发一个或多个 goal:
执行的Phase | 对应执行的Goal |
---|---|
compile | compiler:compile |
test | compiler:testCompile surefire:test |
通常情况,我们总是执行phase默认绑定的goal,因此不必指定goal
小结
其实我们类比一下就明白了:
-
lifecycle
相当于Java 的package
,它包含一个或多个phase; -
phase
相当于Java 的class
,它包含一个或多个goal; -
goal
相当于class 的method
,它其实才是真正干活的。
大多数情况,我们只要指定phase,就默认执行这些phase默认绑定的goal,只有少数情况,我们可以直接指定运行一个goal,例如,启动Tomcat服务器:
mvn tomcat:run
Maven镜像
除了可以从Maven的中央仓库下载外,还可以从Maven的镜像仓库下载。如果访问Maven的中央仓库非常慢,我们可以选择一个速度较快的Maven的镜像仓库。Maven镜像仓库定期从中央仓库同步:
打开保存默认仓库路径C:\Users\32332\.m2
中的settings.xml
文件,添加<mirrors>
内容如下
<settings>
<mirrors>
<mirror>
<id>aliyun</id>
<name>aliyun</name>
<mirrorOf>central</mirrorOf>
<!-- 国内推荐阿里云的Maven镜像 -->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
</settings>
并且设置本地仓库
<localRepository>D:\maven-local-repository</localRepository>
注:在安装目录下的settrings.xml
文件也修改如上
Maven使用骨架创建工程
创建普通java工程
推荐不选择骨架,若要选择骨架,选择如下骨架
创建javaweb工程
需手动补齐src/main/java
目录,先 new
一个directory
取名为java
,再如下图设置
创建Servlet实例
配置pom.xml
文件如下
- 添加
servlet
和jsp
的jar
包,若本地仓库存在,idea会自动弹出选项,或者去中央仓库选则具体 jar 包复制坐标
<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.1</version>
<scope>provided</scope>
</dependency>
- 添加 tomcat7 插件,不然会默认使用 tomcat6,不兼容,运行项目用
tomcat7:run
命令 - 配置 web.xml 如下
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.itcast.cn.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>
</web-app>
- 在
webapp
目录下创建hello.jsp
文件,在com.itcast.cn
目录下创建MyServlet
文件