Maven的安装配置(IDEA)

maven是什么

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项目在项目构建以及依赖管理方面的区域,maven有如下的好处

1.一步构建

maven对项目构建过程进行标准化,通过一个命令即可完成构建过程.

2.依赖管理

maven过程不用手动导jar包,通过在pom.xml中定义坐标从maven仓库自动下载,方便且不容易出错

3.maven的跨平台,可在window linux 上使用

4. maven遵循规范开发有利于提高大型团队的开发效率,降低项目的维护成本,大公司都会考虑使用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仓库

              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文件进行配置本地仓库

<localRepository>D:\my_maven_local_repository</localRepository>

 

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项目了

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工程,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创建的项目结构如下

 

pom.xml文件

一个maven工程都有一个pom.xml文件,通过pom.xml文件定义项目的坐标,项目依赖,项目信息,插件目标等.

 

...依赖管理系统

通过maven的依赖管理对项目所依赖的Jar包进行统一管理.

比如:项目股依赖juni4.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>

 

...一个项目生命周期

使用maven完成项目的构建,项目构建包括:清理 编译 测试 部署等过程 ,maven将这些过程规范为一个生命周期,如下所示是生命周期的哥哥阶段:

maven通过该执行一些简单明了即可实现上边生命周期的各个过程,比如执行 mvn  compile 执行编译 执行mvn clean执行清理

 

...一组标准集合

   Maven将整个项目管理过程定义一组标准,比如:通过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

 

下面重点介绍IDEA用来开发Maven项目

 

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文件配置一个插件

 

<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>
	</build>

 

然后添加我们的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包删除了,加入

 <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>

这个jar包含了jsp和servlet

之后成功发布了项目
 

 

 

 

依赖范围的介绍

添加jar包坐标时,可以指定这个Jar包将来的作用范围

依赖范围包括

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_35501660/article/details/84660256