1. 基本概念
maven是Apache下的一个纯java开发的开源项目,它是一个项目管理工具,使用maven对java项目进行构建、依赖管理。
1.1 项目构建
项目构建是一个项目从编写源码到编译、测试、运行、打包、部署、运行的过程
1.2 依赖管理
依赖管理就是对项目所有的依赖的jar包进行规范化的管理。
maven项目管理所依赖的jar包不需要手动向工程添加jar包,只需要在pom.xml(maven工程的配置文件)添加jar包的坐标,自动从maven仓库中下载jar包,运行。
只用maven依赖管理添加jar的好处:
1. 通过pom.xml文件对jar包的版本进行统一管理,可避免版本冲突。
2. maven团队维护了一个非常全的maven仓库,里面包括了当前使用的几乎所有的jar,maven工程可以自动从maven仓库下载jar包,非常方便。
在maven中依赖管理是通过<dependencies>标签来管理的
例如:HTTPClient的依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
groupId:组ID,一般用包名来表示,表示项目是由哪个组织开发的。
artifactId:一般是项目的名称。
version:该元素定义jar包的版本。
1.3 使用maven的好处
1.3.1 一步构建
maven对项目构建的过程进行标准化,通过一个命令即可完成构建工程
1.3.2 依赖管理
maven工程不用手动导jar包,通过在pom.xml中定义坐标从maven仓库自动下载,方便不易出错。
1.3.3 跨平台
可以在Windows上和Linux上使用
1.3.4 提高了开发效率
maven遵循规范开发有利于提高大型团队的开发效率,降低项目的维护成本,大公司都会考虑使用maven构建项目
2. maven安装
2.1. 环境变量配置
将下载好的maven文件,解压到一个不含中文和空格的目录中。
2.1.1 maven目录说明
bin目录:存放着maven的一些命令。如:mvn.bat(以run方式运行项目)、mvnDebug.bat(以debug方式运行项目)
boot目录:maven运行需要类加载器,该文件夹存放的是一些启动加载器与类
conf目录:配置文件夹,如:settings.xml整个maven工具核心配置文件
lib目录:maven运行依赖jar包
2.1.2 环境变量配置
jdk版本需要1.7+版本
1. 新建MAVEN_HOME
注意:变量值规范不需要加bin
2. 将MAVEN_HOME添加到path
3. MAVEN仓库与配置
3.1 MAVEN仓库
3.1.1 作用
maven工作需要从仓库下载一些jar包,当我们的项目通过maven软件从远程仓库下载了jar并保存在本地仓库(设置好的本地文件夹),当再次需要这些jar的时候,就不会冲远程仓库下载了,而是从本地仓库取。本地仓库可以理解为缓存
3.1.2 本地仓库
用来存储从远程仓库或者中央仓库下载的插件和jar包,项目使用一些插件或jar包,优先从本地仓库查找。
注意:默认的本地仓库地址为,${user.dir}/.m2/respository,${user.dir}表示Windows用户目录。
3.1.3 远程仓库
如果项目需要的jar或者插件在本地仓库没有,那么,就会默认去远程仓库下载,远程仓库可以在互联网也可以在局域网。
3.1.4 中央仓库
在maven软件中内置一个远程仓库地址,http://repo1.maven.org/maven2,它是中央仓库,服务于整个互联网,它是由Maven团队自己维护,里面存储了非常安全的jar包,它包含了全世界上大部分流行的开源项目构件。
3.2 配置本地仓库
在maven的解压缩文件中的conf下,有一个文件settings.xml,本地仓库就在这个配置文件中配置。
找到localRepository标签位置,添加本地路径即可
<localRepository>F:\maven\repository</localRepository>
3.3 私服
私人搭建的服务器,一般在企业内部局域网中使用。私服也叫作远程仓库
4. maven的命令
1)mvn clean:清理
2)mvn compile:编译
3)mvn test-compile:编译测试程序
4)mvn test:执行测试
5)mvn package:打包
6)mvn install:安装
7)mvn site:生成站点
4.1 compile
compile命令是maven工程的编译命令,其作用是将src/main/java下的文件编译为class文件输出到target目录下。
例如:在cmd命令进入控制台,执行命令 mvn compile
4.2 clean
clean是maven工程的清理命令,执行clean会删除target目录的内容
4.3 package
package是maven工程的打包命令,对于java工程打成jar包,对于web工程打成war包
4.4 install
install是maven工程的安装命令,执行install将maven打成jar或者war发布到本地仓库
4.5 test
test是maven工程的测试命令,会执行src/test/java下的单元测试类。
cmd执行mvn test 执行 src/test/java 下单元测试类。
5. maven的三套生命周期
maven对项目构建过程分为三套相互独立的生命周期。这三套生命周期分别是:
1. Clean Lifecycle:在进行真正的构建之前进行一些清理工作
2. Default Lifecycle:构建的核心部分,编译、测试、打包、部署等
3. Site Lifecycle:生成项目报告、站点、发布站点等。
他们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点,当然你也可以直接运行mvn clean install site 运行所有这三套声明周期。
注意:在企业开发中,我们一般不会用到第三个生命周期。
5.1 生命周期的阶段
每个生命周期都有很多阶段(Phase),每个阶段对应一个执行命令。例如:运行mvn clean ,这个clean是Clean声明周期的一个阶段,有Clean生命周期,也有clean阶段。
5.1.1 clean生命周期阶段
pre-clean:执行一些需要在clean之前完成的工作
clean:移除所有上一次构建生成的文件
post-clean:执行一些需要在clean之后立刻完成的工作
5.1.2 Default周期
Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中
validate
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:接受编译好的代码,打包成可发布的格式,如JAR
pre-integration-test
integration-test
post-integration-test
verify
install:将包安装至本地仓库,以让其他项目依赖
deploy:将最终的包复制到远程的仓库,以让其他开发人员与项目共享
5.1.3 site的生命周期
pre-site:执行一些需要在生成站点文档之前完成的工作
site:生成项目的站点文档
post-site:执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy:将生成的站点文档部署到特定的服务器上
这里比较常用的阶段是site阶段和site-deploye阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。
命令:mvn site
5.2 命令与生命周期的阶段
每个maven命令对应生命周期的某个阶段。
例如:mvn clean命令对应clean生命周期的clean阶段;mvn test 对应default生命周期的test阶段
执行命令会将该命令所在的生命周期当中之前的阶段自动完成。
例如:执行 mvn clean命令会去自动执行pre-clean和clean两个阶段‘mvn test会去自动执行validate、compile、test等阶段
注意:
1. 执行某个生命周期的某个阶段不会影响其他生命周期
2. 如果要同时执行多个生命周期,可在命令行输入多个命令,中间以空格隔开。
例如:clean package,该命令执行clean生命周期的clean阶段和default生命周期的package阶段。
6. eclipse配置maven
6.1 配置maven插件
打开eclipse,window-preferences,在搜索框中输入maven,搜索
6.2 将eclipse与maven插件关联
6.3 在eclipse中设置maven
7. 使用eclipse创建maven工程
新建一个maven工程
7.1 修改编译器版本
7.1.1 方式一:通过工具添加编译版本
1. 右键项目,如图
2. 在弹出的对话框中输入compile,如图
选中最高版本,点击OK
3. 打开pom.xml文件,出现如下配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
</plugin>
4. 指定编译版本与编码格式
<configuration>
<!-- 源码版本 -->
<source>1.7</source>
<!-- 编译模板版本 -->
<target>1.7</target>
<!-- 指定编码 -->
<encoding>utf-8</encoding>
</configuration>
7.1.2 方式二:直接添加
直接在pom.xml中添加如下代码
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<!-- 源码版本 -->
<source>1.7</source>
<!-- 编译模板版本 -->
<target>1.7</target>
<!-- 指定编码 -->
<encoding>utf-8</encoding>
</configuration>
</plugin>
7.1.3 方式三:修改setting.xml文件的默认配置
打开maven解压缩文件,找到conf目录下的settings.xml文件,在<profiles>标签下添加如下代码
<profile>
<id>jdk1.7</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.7</jdk>
</activation>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
<maven.compiler.encoding>utf-8</maven.compiler.encoding>
</properties>
</profile>
7.2 新建servlet
新建servlet之后,会出现找不到jar的错误,这时候,需要添加jar依赖
public class HelloMaven extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("hello...");
request.getRequestDispatcher("/index.jsp").forward(request, response);;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
7.2.1 添加servlet-api
如图:
1. 添加依赖
2. 添加jar
同理:添加servlet-api
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
</dependency>
</dependencies>
注意:
1. servlet-api是运行servlet必须的包,jsp-api包是用于编译jsp文件用的。
2. 如果运行的时候,报错500错误,Unable to compileclass for jsp,那么表示上面两个jar与tomcat冲突了,这时候,就需要给这两个jar配置作用于
例如:
<dependencies>
<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.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
7.3 添加Tomcat插件
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 访问端口 -->
<port>8081</port>
<!-- 项目路径 -->
<path>/hello</path>
<!-- 编码 -->
<uriEncoding>utf-8</uriEncoding>
</configuration>
</plugin>
7.4 使用Tomcat插件运行项目
编译命令:
运行tomcat命令:
如图:选择第5个maven build
注意:第4个是运行已经运行过的命令,第5个是首次运行命令
如图,键入命令,运行程序
7.5. 依赖范围
A依赖B,需要在A的pom.xml文件中添加B的坐标,添加坐标时需要指定依赖范围。
7.5.1 compile
编译范围,指A编译时依赖B,此范围为默认依赖范围。编译范围的依赖会用在编译、测试、运行,由于运行时需要,所以编译范围的依赖会被打包。
7.5.2 provided
provided依赖只有在当JDK或者一个容器已提供该依赖后才使用,provided依赖在编译和测试的时候需要,在运行时不需要。例如:前面提到的servlet api被tomcat容器提供。
7.5.3 runtime
runtime依赖在运行和测试系统的时候需要,在编译的时候不需要。例如:jdbc的驱动包,由于运行时需要所以runtime范围的依赖会被打包。
7.5.4 test
test范围依赖,在编译和运行时都不需要,他们只有在测试编译和测试运行阶段可用,比如:Junit。由于运行时不需要所以test范围依赖不会被打包
7.5.5 system
system范围依赖与provided类似,但是,你必须显示的提供一个对于本地系统中jar文件的路径,需要制定systemPath磁盘路径,system依赖不推荐使用。
8. maven安装oracle依赖及驱动
1. 找到本地的oracle安装目录:D:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib
2. 打开cmd命令窗口,切换到ojdbc6.jar的目录
3. 执行mvn命令,安装:mvn install:install-file -Dfile=ojdbc6.jar -Dpackaging=jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.1.0
注意:
1. mvn install:install-file -Dfile="jar包的绝对路径"
2. -Dpackaging="文件打包方式"
3. -DgroupId=groupid名
4. -DartifactId=artifactId名
5. -Dversion=jar版本 (artifactId名对应之后maven配置的依赖名)。
4. 回车,安装
maven仓库:https://www.mvnrepository.com
9. maven中的dependencyManagement与dependencies
maven使用dependencyManagement元素来提供了一种管理依赖版本号的方式,通常会在一个组织或者项目的最顶层的父POM中看到dependencyManagement元素。
使用pom.xml中的dependencyManagement元素能让所有在子项目中引用一个依赖而不用显式的列出版本。maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用这个dependencyManagement元素中指定的版本号。
这样做的好处就是:如果有多个子项目引用同一个依赖,则可以避免在每个使用的子项目里都声明一个版本号,这样当想升级或者切换到另一个版本的时候,只需要在顶层父容器里更新,而不需要一个一个子项目的修改,另外,如果某个子项目需要另一个版本,只需要声明version即可。
1)dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。
2)如果不在子项目中声明依赖,是不会从父项目中继承下来的,只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,且version与scope都读取自父pom
3)如果子项目中指定了版本号,那么会使用子项目中指定的版本jar
10. 一劳永逸解决maven项目jdk版本问题
在settings.xml文件中的<profiles>标签下加上如下代码
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
如图: