maven翻译为“专家”,“内行”。Maven是Apache下的一个纯java开发的开源项目,它是一个项目管理工具,使用maven对java项目进行构建、依赖管理。当前使用Maven的项目在持续增长。
项目构建是一个项目从编写源代码到编译、测试、运行、打包、部署、运行的过程
传统的使用eclipse构建项目的过程如下:
构建过程如下:
1)在IDEA中创建一个java web工程
2)在工程中编写源代码及配置文件等
3)对源代码进行编译,java文件编译成class文件
4)执行Junit单元测试
5)将工程打成war包部署至tomcat运行
maven项目构建过程
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 Structs2
什么是依赖管理?就是对项目所有依赖的Jar包进行规范化管理
传统的项目工程要管理所依赖的jar包完全依靠人工进行,程序员从网上下载Jar包添加到项目工程中去,如下图:程序员手工将Hibernate等框架依赖的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包,非常方便
通过上边介绍传统项目和maven项目在项目构建以及依赖管理方面的区域,maven有如下的好处
1.一步构建
maven对项目构建过程进行标准化,通过一个命令即可完成构建过程.
2.依赖管理
maven过程不用手动导jar包,通过在pom.xml中定义坐标从maven仓库自动下载,方便且不容易出错
3.maven的跨平台,可在window linux 上使用
4. maven遵循规范开发有利于提高大型团队的开发效率,降低项目的维护成本,大公司都会考虑使用Maven来构建项目
1.Maven的下载
从该网站 http://maven.apache.org/download.cgi 下载
2.安装-解压即可 注意不要解压在中文路径下
3.下面是解压后的目录
4.配置Maven
在环境变量中,新建变量名 MAVEN_HOME值为Maven的安装路径
然后在PATH中引用你的MAVEN_HOME 如下图
5.验证安装是否正确
查看是否配置成功可以在shell中数如 mvn -v出现如下图所示说明配置成功,如果有时出现的不是本地命令,也可以用管理员省份打开shell重试
maven仓库的工作需要从仓库下载一些jar包,如下图所示,本地的项目A,项目B等都会通过Maven软件从远程仓库下载Jar包保存到本地的仓库上,本地仓库,就是本地文件夹,当第二次需要此jar包的时候就不再需要从远程仓库下载了,因为本地仓库已经存在,本地仓库类似于缓存的存在.
本地仓库:用来存储从远程仓库或中央仓库下载的插件和jar包,项目使用一些差软件或jar包,优先从本地仓库查找
默认本地仓库位置在${user.dir}/.m2/repository,${user.dir}表示windows用户目录。
远程仓库:如果本地需要插件或jar包,本地仓库没有,则去远程仓库去下载
中央仓库:在maven软件中内置一个远程仓库地址http://repo1.maven.org/maven2,它是中央仓库,服务于整个互联网,它是由maven团队自己维护,里面存储了非常全的Jar包,它包含了世界上大部分流行的开源项目构件
在任意盘符下新建一个目录作为仓库
然后在Maven的安装目录下找到conf目录下的settiings.xml配置文件,打开此文件配置本地仓库的路径
下面是我的本地仓库
本地仓库目录建立好了之后,打开settings.xml文件进行配置本地仓库
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应用 需要插件支持 只有tomcat1.7的插件,没有1.8的 所以tomcat8.0用不了此命令 |
mvn jetty:run |
调用 Jetty 插件的 Run 目标在 Jetty Servlet 容器中启动 web 应用 |
注意:运行Maven命令的时候,首先需要定位了Maven项目的目录,也就是项目的pom.xml文件所在的目录.否则,必以通过参数来制定项目的目录.
如下图所示
打开命令窗口之后,就可以手动输入Maven命令
以上是我们在控制台中输入命令来构建Maven项目,那后面我们都是会在软件中采用图形界面化的方式来运行Mave命令,比如我们的IDEA,
帮我们集成好了maven项目的管理模块,那我们就可以使用IDEA来操作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
install是maven工程的安装命令,执行install将Maven打包成jar包或war包的形式发布到本地仓库,
从运行结果中,可以看出:
当后面的命令执行时,前面的操作过程也都会自动执行
三套生命周期
maven对项目构建过程氛围三套项目独立的生命周期,这里说的的是"三套",而且"相互独立",这三套周期分别是
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
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的目录结构,
不过一般我使用的是IDEA去帮我创建爱你的,不管是软件创建,还是硬件创建,
都需要遵循上面的结构,
如图所示,IDEA创建的项目结构如下
一个maven工程都有一个pom.xml文件,通过pom.xml文件定义项目的坐标,项目依赖,项目信息,插件目标等.
...依赖管理系统
通过maven的依赖管理对项目所依赖的Jar包进行统一管理.
比如:项目股依赖juni4.9,
通过在pom.xml中定义junit4.9的依赖即使用junit4.9,如下图所示是junit4.9的依赖定义:
junit
junit
4.9
test
...一个项目生命周期
使用maven完成项目的构建,项目构建包括:清理 编译 测试 部署等过程 ,maven将这些过程规范为一个生命周期,如下所示是生命周期的哥哥阶段:
maven通过该执行一些简单明了即可实现上边生命周期的各个过程,比如执行 mvn compile 执行编译 执行mvn clean执行清理
...一组标准集合
Maven将整个项目管理过程定义一组标准,比如:通过Maven构建工程有标准的目录结构,有标注你的生命周期阶段 依赖管理有标准的坐标定义等.
..插件目标
maven管理项目生命周期过程都是基于插件完成的
每个Maven工程都需要定义本工程的坐标,报坐标是Maven对jar包的身份定义,比如:入门程序的的坐标定义如下:
org.westos
maven-first
0.0.1-SNAPSHOT
:打包类型
jar:执行package会打成jar包
war:执行package会打成war包
pom :用于maven工程的继承,通常父工程设置为pom
1.首先IDEA中配置Maven
2.使用IDEA来创建一个Mave项目
File -New -Project 弹出如下窗口 -选择Maven项目
继续下一步
继续下一步
IDEA开始创建Maven,你如果是第一次创建,需要联网,下载一些插件.
Maven项目创建好后,我们看一下目录结构,发现,有的目录IDEA并没有帮我们自动创建
需要我们手动创建,注意手动创建要符合Maven规定的目录结构
下来我们手动创建目录
手动创建好后如下图的目录结构
目录结构创建好后,我们还得改变一下目录的类型,不然用不
继续改其他目录的类型
继续改test目录下的子目录的类型
继续
至此我们的Maven目录结构就设置好了
再补充一下,设置目录的类型还有一种方式
还有一种方法自动改变Maven工程的目录类型
我们手动创建出来的目录 要改变一下目录类型
再说一种方式
快速改变Maven目录类型的方式
IDEA对maven项目的管理
一般Maven的项目我们都可以脱离IDEA的配置功能进行独立的管理和构建的,当然我们可以通过IDEA提供的Maven管理工具进行项目的管理和构建
下来我们可以创建一个简单的Servlet 看一下如何在pom.xml文件中添加依赖jia包
创建一个Servlet OK确定
在web.xml中配置好我们创建的Servlet
这时Servlet会报错,是因为Servlet找不到API
接下来我们通过在pom.xml文件中通过配置jar包坐标从仓库中找到我们所需要的jar包
下面教大家如何找到我们所需要的Jar包
这时候使用以下网站
http://mvnrepository.com/
点击进去选择你需要的Jar包版本
复制好Jar包坐标粘贴到工程的pom.xml文件即可
若是本地仓库已经存在该Jar包了,那么我们只需要在仓库中寻找即可
在pom.xml文件中安alt+insert快捷键 弹出操作框
然后会弹出一个框,罗列了本地仓库所有的Jar包,你去选择你需要的Jar包即可
注意如果你提示出来的jar包不全可以更新一下本地仓库,因为有时你刚从远程仓库下载到
本地仓库的jar包,没有提示出来,你可以更新一下本地仓库 ,如下图
下来我们可以通过tomcat插件发布我们的项目
我们得在pom.xml文件配置一个插件
org.apache.maven.plugins
maven-compiler-plugin
1.7
UTF-8
然后添加我们的Maven项目
弹出一个面板,继续选择
继续选择
继续选择
用插件发布Maven项目是可以的,但是现在网上没有找到合适的tomcat8.0插件.所以我们还是用传统方式来发布一下.
严重: Servlet.service() for servlet [jsp] in context with path [/mavenfrist] threw exception [java.lang.ClassNotFoundException: org.apache.jsp.index_jsp] with root cause
java.lang.ClassNotFoundException: org.apache.jsp.index_jsp
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:132)
at org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:63)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:119)
at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:172)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:376)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
问了下同班同学,发现他们也出现了这个问题,估计是老师给的jar包版本和tomcat的jar包版本出现了冲突,这时候我们需要把在pom文件中的两个jar包删除了,加入
javax
javaee-api
7.0
provided
这个jar包含了jsp和servlet
之后成功发布了项目
添加jar包坐标时,可以指定这个Jar包将来的作用范围
依赖范围包括