目录html
首发日期:2018-11-04java
以一个例子说一下maven的好处,说了它的好处,web
1.maven能够帮咱们管理依赖。在以往的时候,咱们都是手动的导入jar包,而后build path;在导入jar包以前,咱们须要去查找有哪些包,须要哪些包,这是一个很是繁杂的问题,若是你不是“老司机”的话,你可能会遗漏某些jar包;而在maven中,咱们可使用pom.xml来声明须要哪些依赖包,而后maven就会根据pom.xml中的信息去获取仓库中的依赖包的引用,这就至关于导入了jar包。并且,maven存储了大量的jar包和大量的依赖规则,因此你能够直接去百度搜索一下某个关键字+maven
,就能够查找到某个框架或工具的依赖信息,直接把这个依赖信息拷贝到pom.xml中,maven就会帮你管理这个依赖。spring
2.maven能够帮咱们进行工程管理。在以往的时候,咱们开发一个项目都是在一个工程中开发,但事实上这对多人开发并不友好,多个开发者之间的开发产生了耦合关系,这对整合形成了一些小困扰(但并非说很差,只是说有更好的手段)。而使用maven以后,能够创建多个工程来组成一个项目,在不一样的工程中开发不一样的模块,而多个工程之间的关系由maven管理,maven能够帮咱们把多个工程组合成一个项目。数据库
点击连接,下载Maven:
apache
下载完了以后,直接解压便可,它是免安装的。windows
JAVA_HOME
环境变量,值是jdk程序根目录【若是已经配置过的,能够省略】
%JAVA_HOME%\bin
添加到path环境变量中【若是已经配置过的,能够省略】【注意不要弄乱了path的值】MAVEN_HOME
环境变量,值是maven程序根目录
%MAVEN_HOME%\bin
添加到path环境变量中【注意不要弄乱了path的值】配置了环境变量后,能够在CMD中键入mvn -v
来测试是否能够运行,下面是个人输出结果:api
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00) Maven home: J:\software\apache-maven-3.5.4\bin\.. Java version: 1.8.0_91, vendor: Oracle Corporation, runtime: E:\SOFTWARD\Java\jdk1.8.0_91\jre Default locale: zh_CN, platform encoding: GBK OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
在学会maven以前,先了解几个概念。下面的概念了解便可,后面会在实际的配置中涉及。tomcat
在以往的build path过程当中,其实只是把jar包的路径引用添加到eclipse中,eclipse知道须要的包的路径以后,在编译的时候会去引用。服务器
而maven能够根据坐标来指定使用哪一个依赖包,坐标通过必定的组合规则就能够得出依赖包所在的路径,maven会根据坐标对应的路径在仓库中来查找jar包。
maven用三个向量来组成一个坐标,这个坐标肯定惟一的依赖包:
maven会根据坐标在仓库中来查找jar包,把三个向量拼接起来就是依赖包的路径。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.0.RELEASE</version> </dependency> <!--对应的路径转换格式:groupid/artifactid/artifactid+version+.jar --> <!--org/springframework/spring-core/spring-core4.3.0.RELEASE .jar-->
在上面提到了坐标,你应该认识到了坐标标识了依赖包的路径,而这个路径是相对于仓库的路径的。为何须要一个仓库呢?上面说了eclipse实质上也是经过路径来导入依赖包的,若是你没有一个统一的文件夹来管理依赖包的话,零散的依赖包足以让你头疼了。而maven的仓库是一个包含了众多依赖包的仓库,并且maven的依赖管理能够很方便地添加依赖包信息。
下面以建立一个maven项目,并使用maven的依赖管理来给项目添加依赖为例:
关于如何建立一个maven项目,下面以eclipse中的为例,若是你须要idea的,能够点击下面的连接学习。
图解在IntelliJ IDEA中建立第一个Maven项目
新建工程->选择maven project
在pom.xml中添加下列代码:
<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> </dependencies>
能够看得出来,依赖已经导入了咱们项目的类库。
因此咱们利用依赖包中的类来编写代码的时候就不会报错了。
maven要依据必定的目录规范来管理项目,因此要想用maven管理项目,要遵循规范。下面会讲一下目录定义规范,这样是面向全手动建立maven项目的时候,在不少时候,都会使用工具来建立,好比eclipse中就能够直接建立一个maven工程,这个工程遵循maven工程的目录规范。
maven构建一个工程要遵循这个目录规范。
依赖信息中的scope标签是用来定义依赖范围的。依赖范围影响依赖的生存周期(就比如游戏中的特殊状态,可能一些状态可用于pk,一些状态可用于打副本,一些状态可用于任务,不一样的地方影响效果是否生效。),依赖范围的值有如下几个:
要注意,在一个工程中,若是导入的依赖须要一系列依赖(A包须要B包才能正常,那么也会导入B包),那么也会导入这一些依赖,例如struts2-core依赖一系列的包。
演示:基于eclipse
仅仅导入struts2-core的时候,maven会自动导入struts2-core所依赖的包:
发现maven自动导入了struts2-core依赖的包(这些依赖包是由struts2-core项目中的pom.xml指定的)
可能会遇到一种状况,在同一个工程中,A包依赖B包的1.0版本,C包依赖B包的1.5版本。那么B的1.0和1.5都被引入了。这可能会致使紊乱,由于构建的时候会不清楚使用哪一个版本的B依赖包。这时候咱们须要使用依赖排除来解决这个问题。【通常都是排除低版本】
例如struts2-core依赖javassist包,hibernate-core也依赖javassist包,根据依赖的依赖的导入规则,这时候会有两个javassist
为了不紊乱,咱们要使用exclusions排除。在eclipse中,咱们能够在Dependency Hierarchy中右键选中包进行排除,也可使用如下xml式排除:
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.34</version> <exclusions> <!-- 排除struts2-core的依赖中的javassist依赖 --> <exclusion> <groupId>javassist</groupId> <artifactId>javassist</artifactId> </exclusion> </exclusions> </dependency>
在创建多个有继承关系的工程时,父工程的依赖信息会传递给子工程。
在父工程中声明了依赖后,就算子工程没有声明,也会传递到子工程中
在分模块开发时,多个子模块可能会使用上同一个依赖包,那么如何限定多个子模块都使用同一版本的依赖包呢?可使用版本锁定。
<dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement>
你应该常常见到某个框架的依赖包都是同一版本的,若是咱们将这些依赖信息都添加到pom.xml中,可能会出现多个重复的version标签,若是你要修改的话是很麻烦的,要逐个逐个去修改版本。
事实上,是能够统一管理依赖版本的,同一管理依赖版本以后,若是咱们要修改这个框架下的包的版本,那么只须要修改一处就好了。
<properties> <!-- 使用自定义标签统一版本号,标签名是自定义的 --> <struts2-version>2.3.34</struts2-version> </properties> <dependencies> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <!--在version标签中引用 --> <version>${struts2-version}</version> </dependency> </dependencies>
注意:properties标签并非只能用于统一声明依赖版本,但凡是须要统一声明的地方均可以考虑使用properties标签。
如下命令针对于maven工程,必须到pom.xml目录才能执行命令
每个阶段都有一个对应的命令,且有相应的插件来支持命令的运行。
maven安装路径下\conf\settings.xml文件,在settings.xml中配置localResposity标签。,它是被注释了的,有配置方法的提示。
默认目录:用户目录下.m2/repository
<mirrors> <!-- 中央仓库1 --> <mirror> <id>repo1</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo1.maven.org/maven2/</url> </mirror> <!-- 中央仓库2 --> <mirror> <id>repo2</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo2.maven.org/maven2/</url> </mirror> </mirrors>
eclipse有自带的maven插件,但不建议使用。
把独立的maven添加成一个新的maven:
配置user settings:
【maven model用于分模块开发时建立子工程,多个子工程与核心工程组成一个完整的项目。】
新建工程->选择maven project
下面给的是打包方式为war的时候的目录结构:
默认状况下,maven工程引用的jre库是1.5的,这可能会致使一些语法问题(例如泛型的语法问题),因此一般须要更改这个引用的jre库版本。
<profile> <id>jdk18</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> <maven.compiler.encoding>utf-8</maven.compiler.encoding> </properties> </profile>
方式一:手动添加,经过手动拷贝等方式统一增长。能够百度包名+maven
来查找依赖信息的写法,拷贝下来粘贴到pom.xml中便可。
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
方式二:在eclipse,双击打开pom.xml,默认状况下不是xml界面,点击下面的dependencies选项,再点击add,在中间的搜索框输入信息搜索依赖,选择依赖包,最后点击确认。这要求你比较熟悉须要哪些包。
有时候咱们但愿给maven工程添加额外的插件,例如tomcat7:run插件,这个插件能使得咱们的工程虚拟地部署到tomcat中。
mvn tomcat:run 命令是一个插件,须要添加才能执行这条命令,添加方式:项目右键选择maven,再add plugin,而后搜索tomcat
<!--build与dependencies是同一级的 --> <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> <configuration> <!-- 端口 --> <port>8080</port> <!-- 访问路径 --> <path>/helloworld</path> <!-- 编码 --> <uriEncoding>utf-8</uriEncoding> </configuration> </plugins> </build>
这里仅仅给一个添加插件的示例,其余的插件有兴趣能够自查。
工程右键->run as ->第一个maven build可让你选择以前执行过的命令来执行,第二个maven build可让你输入指定命令来执行(在goals中输入命令,mvn test只须要输入test便可);至于后面的clean,install和test的意思已经显而易见了。
若是想建立一个web工程,须要在建立工程的时候打包方式改为war。但默认状况下src/main下是没有webapp目录(存放WEB-INF目录和web.xml的目录)的。
什么是依赖范围冲突呢?这涉及到依赖范围问题,主要是provided问题。以servlet-api依赖为例,这个依赖tomcat会提供给咱们部署的项目,但若是咱们添加这个依赖的时候选择了compile,那么这个依赖也会带到部署的项目中,使得存在了两个servlet-api依赖。
解决方法:这时候要修改servlet-api依赖的范围,改为provided。
这个在pom配置的依赖排除中讲过了。这里只提一下,再也不演示。
mvn exec
。tomcat7:run
工程的拆分是建立一个核心父工程,而后建立多个子模块的状况。核心父工程通常不会编写什么内容,通常只做为依赖的汇总(让父工程引入共有依赖,子工程单独依赖的单独引入)。
为了让父工程能管理到子工程,因此在父工程下右键"new-->maven module"
建立完父工程和子模块后,能够在父工程的pom.xml中看到父工程管理到了子模块:
而子模块也指向了父工程:
而后子模块怎么开发呢?它至关于与一个独立的模块,因此你能够像往常同样开发。不过提一下的是,可能会发生service层调用dao层,那么这怎么实现呢?这就须要咱们在service层中添加dao层的依赖了,这样service层就能够调用dao层的方法了。
这里提一下工程拆分与框架整合的问题,在之前一个工程中,dao和service都是交给spring去管理的,那么如今
该怎么处理呢?首先,要注意的是,只要咱们配置了spring(这里注意,依赖已经导入了),不管是xml仍是注解
式,那么spring就可以管理好咱们的bean。因此,咱们如今其实只须要关心咱们的bean是否交给了spring来管理
便可。而这个单个模块的测试能够在test目录下再编写代码来测试。
拆分工程以后,开发完成了,怎么聚合使用呢?
首先,要注意父工程管理着子模块,
若是打包父工程,那么子工程也会进行打包。
而一般咱们在进行web开发的时候,因为子模块web是核心项目,而子模块web又依赖着子模块service,而在打包的时候依赖的包也会打成jar包,因此打包子模块web的时候,web工程的lib里面是有依赖的兄弟工程的,因此咱们能够直接运行web工程便可。【这是运行war包的状况】
咱们也能够选择在IDE中直接运行子模块web(在eclipse直接run as),也是可以调用到其余兄弟模块的功能的。
这篇关于maven的博文看完了,你应该能对maven的使用有一个基本的了解。
这里给一个经常使用的查maven的依赖信息的网站:mvnrepository.com