项目构建是一个项目从
编写源代码到编译、测试、运行、打包、部署、运行
的过程;
传统的使用IDEA构建项目的过程如下:
1)在IDEA中创建一个java web工程
2)在工程中编写源代码及配置文件等
3)对源代码进行编译,java文件编译成class文件
4)执行Junit单元测试
5)将工程打成war包部署至tomcat运行
maven 将项目构建的过程进行标准化,每个阶段使用一个命令完成,下图展示了构建过程的一些阶段,后面章节详细介绍每个阶段,这里先大概了解下:
上图中部分阶段对应命令如下:
清理阶段对应maven的命令是clean,清理输出的class文件
编译阶段对应maven的命令是compile,将java代码编译成class文件。
打包阶段对应maven的命令是package,java工程可以打成jar包,web工程可以打成war包
运行一个maven工程(web工程)需要一个命令:tomat:run
maven工程构建的优点:
1、一个命令完成构建、运行,方便快捷。
2、maven对每个构建阶段进行规范,非常有利于大型团队协作开发。
一个java项目可能要使用一些第三方的
jar包
才可以运行,那么我们说这个java项目依赖了这些第三方的jar包。
举个例子:一个crm系统,它的架构是SSH框架,该crm项目依赖SSH框架,具体它依赖的
Hibernate、Spring、Struts2
。
依赖管理就是对项目所有依赖的jar包
进行规范化管理;
传统的项目工程要管理所依赖的jar包完全靠人工进行,程序员从网上下载jar包添加到项目工程中,如下图:程序员手工将
Hibernate、struts2、spring的jar
添加到工程中的WEB-INF/lib目录下。
手工拷贝jar包添加到工程中的问题是:
1、没有对jar包的版本统一管理,容易导致版本冲突。
2、从网上找jar包非常不方便,有些jar找不到。
3、jar包添加到工程中导致工程过大。
maven项目
的依赖管理maven项目管理所依赖的jar包不需要手动向工程添加jar包,只需要在
pom.xml(maven工程的配置文件)
添加jar包的坐标,自动从maven仓库中下载 jar包、运行,如下图:
使用maven依赖管理添加jar的好处:
1、通过pom.xml
文件对 jar包 的版本进行统一管理,可避免版本冲突。
2、maven团队维护了一个非常全的maven仓库,里边包括了当前使用的jar包,maven工程可以自动从maven仓库下载 jar包,非常方便。
1、一步构建:maven对项目构建的过程进行标准化,通过一个命令即可完成构建过程。
2、依赖管理:maven工程不用手动导jar包,通过在pom.xml中定义坐标从maven仓库自动下载,方便且不易出错。
3、maven的跨平台,可在window、linux上使用。
4、maven遵循规范开发有利于提高大型团队的开发效率,降低项目的维护成本,大公司都会考虑使用maven来构建项目。
Maven 官网:maven.apache.org
Maven 3.6.3版本文档:http://maven.apache.org/ref/3.6.3/
在环境变量中新建变量名
MAVEN_HOME
值为Maven
的安装路径,然后在PATH
中引用你的MAVAEN_HOME
如下图:
mvn –v
,出现如下图所示说明配置成功,如果有时出现不是本地命令,可以用管理员身份打开黑窗口;maven
的工作需要从仓库下载一些jar包
,如下图所示,本地的项目A、项目B等都会通过maven软件从远程仓库(可以理解为互联网上的仓库)下载jar包并存在本地仓库,本地仓库就是本地文件夹,当第二次需要此jar包时则不再从远程仓库下载,因为本地仓库已经存在了,可以将本地仓库理解为缓存,有了本地仓库就不用每次从远程仓库下载了。
下图描述了maven中仓库的类型:
${user.dir}/.m2/repository
,${user.dir}
表示windows用户目录
。远程仓库:如果本地需要插件或者jar包,本地仓库没有,默认去远程仓库下载。远程仓库可以在互联网内也可以在局域网内。
中央仓库 :在maven软件中内置一个远程仓库地址http://repo1.maven.org/maven2
,它是中央仓库,服务于整个互联网,它是由Maven团队
自己维护,里面存储了非常全的jar包
,它包含了世界上大部分流行的开源项目构件。
配置本地仓库
1、在任意盘符下新建一个目录作为仓库;
2、然后在Maven的安装目录下找到conf目录下的settings.xml配置文件,打开此文件配置本地仓库的路径;
3、本地仓库目录建好后 打开settings.xml
文件进行配置本地仓库
D:\my_maven_local_repository
settings.xml
文件中配置这样的代码: <mirrors>
<mirror>
<id>alimavenid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<mirrorOf>centralmirrorOf>
mirror>
mirrors>
maven命令
的时候,首先需要定位到maven项目
的目录,也就是项目的pom.xml文件
所在的目录。否则,必以通过参数来指定项目的目录。命令 | 含义 |
---|---|
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命令,比如我们的IDEA
帮我们集成好了Maven项目
的管理模块,那我们就可以使用IDEA
来操作Maven项目
了;
Maven命令详解:
compile
compile是maven工程的编译命令,作用是将
src/main/java
下的文件编译为class文件
输出到target目录下。cmd进入命令状态,执行mvn compile
,如下图提示成功:
查看 target目录,class文件已生成,编译完成。
test
test是maven工程的测试命令,会执行src/test/java下的单元测试类。 cmd执行
mvn test
执行src/test/java
下单元测试类;
clean
clean是maven工程的清理命令,执行 clean会删除target目录的内容。
package
package是maven工程的打包命令,对于java工程执行package打成jar包,对于web工程打成war包。
install是maven工程的安装命令,执行install将maven打成jar包或war包发布到本地仓库。
maven对项目构建过程分为三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:
1、Clean Lifecycle
在进行真正的构建之前进行一些清理工作。
2、Default Lifecycle
构建的核心部分,编译,测试,打包,部署等等。
3、Site Lifecycle
生成项目报告,站点,发布站点。
maven
创建的工程我们称它为maven工程
,maven工程
具有一定的目录规范,如下:src/main/java —— 存放项目的.java文件
src/main/resources —— 存放项目资源文件,如spring, hibernate配置文件
src/test/java —— 存放所有单元测试.java文件,如JUnit测试类
src/test/resources —— 测试资源文件
target —— 项目输出位置,编译后的class文件会输出到此目录
pom.xml——maven项目核心配置文件
Project
|-src
| |-main
| | |-java —— 存放项目的.java文件
| | |-resources —— 存放项目资源文件,如spring, hibernate配置文件
|-webapp —— webapp目录是web工程的主目录
|-WEB-INF
|-web.xml
| |-test
| |-java ——存放所有测试.java文件,如JUnit测试类
| |-resources —— 测试资源文件
|-target —— 目标文件输出位置例如.class、.jar、.war文件
|-pom.xml —— maven项目核心配置文件
Maven工程的目录结构必须遵循上面的结构,我们可以手动去创建Maven的目录结构,当然我们一般是通过软件帮我们创建的,不管是软件创建,还是手动创建,都必须遵循Maven的目录结构;
如图所示 IDEA 创建出来的Maven项目结构如下:
pom.xml文件
,通过pom.xml文件
定义项目的坐标、项目依赖、项目信息、插件目标等。(Dependency Management System)
,通过maven的依赖管理对项目所依赖的jar包
进行统一管理。比如:项目依赖
junit4.9
,通过在pom.xml
中定义junit4.9的依赖即使用junit4.9,如下所示是junit4.9的依赖定义:
<!-- 依赖关系 -->
<dependencies>
<!-- 此项目运行使用junit,所以此项目依赖junit -->
<dependency>
<!-- junit的项目名称 -->
<groupId>junit</groupId>
<!-- junit的模块名称 -->
<artifactId>junit</artifactId>
<!-- junit版本 -->
<version>4.9</version>
<!-- 依赖范围:单元测试时使用junit -->
<scope>test</scope>
</dependency>
</dependencies>
(Project Lifecycle)
使用maven完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,maven将这些过程规范为一个生命周期,如下所示是生命周期的各各阶段:
maven通过执行一些简单命令即可实现上边生命周期的各各过程,比如执行
mvn compile
执行编译、执行mvn clean
执行清理。
maven将整个项目管理过程定义一组标准,比如:通过maven构建工程有标准的目录结构,有标准的生命周期阶段、依赖管理有标准的坐标定义等。
maven 管理项目生命周期过程都是基于插件完成的。
每个maven工程都需要定义本工程的坐标,坐标是maven对jar包的身份定义,比如,入门程序的坐标定义如下:
<!--项目名称,定义为组织名+项目名,类似包名-->
<groupId>org.westos</groupId>
<!-- 模块名称 -->
<artifactId>maven-first</artifactId>
<!-- 当前项目版本号,snapshot为快照版本即非正式版本,release为正式发布版本 -->
<version>0.0.1-SNAPSHOT</version>
<packaging > :打包类型
jar:执行package会打成jar包
war:执行package会打成war包
pom :用于maven工程的继承,通常父工程设置为pom
【注意】:如果是第一次创建该项目,Maven需要联网下载一些插件,花费一定的时间;
最开始创建的
Maven项目
目录结构不完整,我们需要手动添加一些文件夹;注意层次结构以及文件夹的名称要正确;
创建好文件夹之后还需要改变他们的类型,不然用不了;
至此我们的Maven目录结构就设置好了
一般 Maven 的项目我们都可以脱离IntelliJ IDEA
的项目配置功能进行独立的管理和构建的,但我们任然可以通过 IntelliJ IDEA 提供的Maven 管理工具
进行项目的管理和构建;
首先看下IDEA中关于Maven提供的工具怎么使用:
我们需要在pom.xml配置文件中通过jar包的坐标,去仓库中依赖项目所需要的jar包;
http://mvnrepository.com/
jar包
自动添加jar包
坐标,在你的pom.xml文件中 按alt+insert
快捷键弹出一个框:有时候可能提示出来的jar包不全,可以更新一下本地仓库,因为有时你刚从远程仓库下载到本地仓库的jar包,没有提示出来
标签内部配置一个tomcat插件,
<plugin>
<groupId>org.apache.tomcat.mavengroupId>
<artifactId>tomcat7-maven-pluginartifactId>
<version>2.2version>
<configuration>
<port>8080port>
<path>/abcpath>
<uriEncoding>UTF-8uriEncoding>
configuration>
plugin>
后台代码:
@WebServlet(name = "ServletDemo1", value = "/demo1")
public class ServletDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("进来了");
}
pom.xml文件
<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.0modelVersion>
<groupId>org.westosgroupId>
<artifactId>myMavenDemoartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>warpackaging>
<name>myMavenDemo Maven Webappname>
<url>http://www.example.comurl>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.7maven.compiler.source>
<maven.compiler.target>1.7maven.compiler.target>
properties>
<dependencies>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>jstlartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>taglibsgroupId>
<artifactId>standardartifactId>
<version>1.1.2version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>jsp-apiartifactId>
<version>2.0version>
<scope>providedscope>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>4.0.1version>
<scope>providedscope>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
dependencies>
<build>
<finalName>myMavenDemofinalName>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.tomcat.mavengroupId>
<artifactId>tomcat7-maven-pluginartifactId>
<version>2.2version>
<configuration>
<port>8080port>
<path>/abcpath>
<uriEncoding>UTF-8uriEncoding>
configuration>
plugin>
plugins>
pluginManagement>
build>
project>
最终结果