作者:啤酒大泡泡\来源:www.cnblogs.com/hzg110/p/6936101.html前言:目前所有的项目都在用maven,但是没时间整理和研究。这两天正好有时间,收拾一下。1、为什么要用Maven这样的构建工具【为什么】①项目就是项目。如果项目很大,不适合用包来划分模块。每个模块最好对应一个项目,有利于分工协作。借助maven,可以将一个项目拆分成多个项目。②如果项目中使用了jar包,需要在项目的lib中“复制”“粘贴”同一个jar包,才能在不同的项目工程中重复出现。你需要做复制和粘贴的重复工作。借助maven,可以将jar包保存在“仓库”中,无论在哪个项目中,引用即可。③需要jar包时,必须自行准备或从官网下载。借助maven,我们可以统一规范的下载jar包。可能会导致各个项目的jar包版本不一致,导致无法执行的错误。借助maven,所有的jar包都放在“仓库”中,所有的项目都使用仓库中的一个jar包。⑤需要在项目FileUpload组件->IO组件中手动添加依赖其他jar包的jar包,commons-fileupload-1.3.jar依赖commons-io-2.0.1.jar,极大浪费了我们的import包时间成本也大大增加了学习成本。借助maven,会自动导入依赖的jar包。2、什么是maven【what】①maven是服务于java平台的自动化构建工具make->Ant->Maven->Gradle名称:我们可以叫它美文或者麦文,但是我们不叫它马文的。②Construction构建定义:将动态Web项目编译得到的编译结果部署到服务器的整个过程。编译:java源文件[.java]->编译->Classz字节码文件[.class]部署:最终部署到sevlet容器中的不是动态web项目,而是一个编译文件③清理所有的构建环节:deleteoldfilecompile之前编译的class字节码文件compile:将java源程序编译成class字节码文件testtest:自动测试,自动调用junit程序reportreport:测试程序执行结果打包包:web项目的动态War包,java项目的jar包Install:Maven特有的概念-----将打包后的文件复制到“仓库”中的指定位置Deployment:将动态Web项目生成的war包复制到Servlet容器中,使其可以运行3、安装maven①当前系统是否配置了JAVA_HOME环境变量②下载maven,解压maven放在非中文路径不带空格③配置maven相关环境变量在环境变量中加入M2_HOME,path是maven解压后的根目录。将maven/bin目录添加到环境变量中的路径中④验证:maven-v查看maven版本,查看版本信息。恭喜你,你没事。4.第一个maven①创建约定的目录结构(maven项目必须按照约定的目录结构创建)[1]根目录:项目名称[2]|---src:源代码[3]|---|---main:存放主程序[4]|---|---|---java:java源代码文件[5]|---|---|---resource:存放框架的配置文件[6]|---|---test:存放测试程序[7]|---pop.xml:maven的核心配置文件,我们根据上面的文件夹目录手动创建结构,无需任何IDE环境(手动其实对我们理解maven最有帮助)文件内容如下在src/main/java/com/hzg/m??a??ven目录下新建文件Hello.java,将内容如下packagecom.hzg.maven;publicclassHello{ publicStringsayHello(Stringname){ return"Hello"+name+"!"; }}POM文件内容:4.0.0com.hzg.maven你好0.0.1-SNAPSHOT你好junitjunit4.0test②maven常用命令mvnclean:清理mvncompile:编译主程序mvntest-compile:编译测试程序mvntest:执行测试mvnpackage:打包mvninstall:安装执行maven命令必须进入pom.xml目录执行进入pom项目的.xml目录后,就可以执行了。1.运行mvncompile确定。运行后,你在pom.xml中配置的依赖包就已经导入到仓库中了。问题是,仓库的默认位置在哪里?仓库默认位置:c:\Usrs[登录当前系统的用户名].m2\repository刚才执行编译后,之前的文件夹已经变了。我们发现Hello项目中多了一个target文件夹。文件夹内容为:发现编译后的字节码文件主要存放在target2.运行mvntest-compile,target文件夹下除了classes之外还有更多的test-classes文件夹3.运行mvnpackage,target文件夹4下还有一个jar包,运行mvnclean发现整个target文件夹都没有了。回到我们编译之前手动创建的文件夹5.仓库和坐标①pom.xml:ProjectObjectModel项目对象模型。它是maven的核心配置文件,所有的构建配置都在这里设置。②坐标:使用以下三个向量在仓库中唯一定位一个maven项目③maven项目坐标与仓库中路径的关系:maven坐标与仓库的映射关系:groupIdversion-[version].jar去本地仓库看看看看这个目录:org\springframework\spring-core\4.3.4.RELEASE\spring-core-4.3.4.RELEASE.jar确实完全对应(默认仓库地址上面已经说了,别说不知道在哪里,没关系,下面说说仓库)④仓库仓库的分类:1.本地仓库:当前电脑上的仓库,如路径2.远程仓库:私服:建在局域网内,大部分公司都会有私服,私服一般都是用nexus搭建的。在具体施工过程中,可以查询其他材料。中央仓库:搭建在网上,像刚才的springframework。6.依赖①maven在解析依赖信息时,会去本地仓库寻找依赖的jar包。不在本地仓库的,会去中央仓库。找到maven坐标获取jar包。获取jar后,会下载到本地仓库。当中央仓库找不到依赖的jar包时,就会编译失败。②如果依赖自己或团队开发的maven项目,需要使用install命令将依赖的maven项目的jar包导入本地仓库。例子:现在我创建了第二个maven项目HelloFriend,它使用了第一个Hello项目中类的sayHello(Stringname)方法。当我们使用mvncompile命令编译HelloFriend项目时,会提示缺少依赖Hello的jar包。怎么做?在第一个maven项目执行mvninstall后,再查看本地仓库,会发现hello项目的jar包。一旦本地仓库有了依赖的maven项目的jar包,在HelloFriend项目中使用mvncompile命令就可以编译成功③Dependencyscope为依赖范围1、compile,默认值,适用于所有阶段(开发、测试、部署、运行),这个jar会一直存在于各个阶段。2.provided只在开发测试阶段使用,目的是防止Servlet容器和你本地仓库的jar包冲突。比如servlet。罐。3.runtime,仅在运行时使用,如JDBCdriver,适用于运行和测试阶段。4.test,仅在测试时使用,用于编译和运行测试代码。不会随项目发布。5.system类似provided,需要显式提供包含依赖的jar,Maven不会去Repository中寻找。7.生命周期Maven有三套相互独立的生命周期。请注意,它是“三套”和“相互独立”的。初学者往往把Maven的生命周期看成一个整体,其实不然。三组生命周期分别是:①CleanLifecycle在实际构建之前进行一些清理工作。Clean生命周期包括三个阶段:pre-clean执行一些在clean之前需要完成的工作clean删除之前构建生成的所有文件post-clean执行一些需要在clean之后立即完成的工作②DefaultLifecyclebuilt的核心部分,编译、测试、打包、部署等validategenerate-sourcesprocess-sourcesgenerate-resourcesprocess-resources将资源文件复制并处理到目标目录,准备打包compile编译项目源码process-classesgenerate-test-sourcesprocess-test-sourcesgenerate-test-resourcesprocess-test-resources复制并处理资源文件,到目标测试目录test-compile编译测试源代码process-test-classestest使用适当的单元测试框架运行测试。这些测试代码不会被打包部署prepare-packagepackage接受编译后的代码,打包成可发布的格式,比如JARpre-??integration-testintegration-testpost-integration-testverifyinstall安装包到本地仓库,供其他项目依赖.deploy会将最终的包复制到远程仓库,以便其他开发者共享到项目中。然后我们在Hello项目中执行mvninstall命令,通过日志看看这中间发生了什么?通过日志,我们发现实际上执行了mvninstall,并且已经执行了编译和测试。总结:无论你要执行生命周期的哪个阶段,maven都是从生命周期的一开始就开始执行插件:每个阶段都有一个插件(plugin),见上图红色标记。插件的职责是执行其相应的命令。③SiteLifecycle生成项目报告、站点、发布站点。pre-site执行生成站点文档之前需要完成的一些工作site生成项目的站点文档post-site执行生成站点文档并准备部署后需要完成的一些工作site-deploy将生成的站点文档部署到特定的服务器上八、在Eclipse中使用maven①、配置选择菜单windows-->preferences(参数)-->maven选择Installations(安装),添加自己下载解压的maven目录。并打上√,点击Apply(应用)然后选择UserSettings目录,在UserSettings中选择Browse(浏览),在自己的maven中选择conf下的settings.xml文件。插一句:settings.xml配置文件主要是配置你本地仓库的路径。如果您不想使用默认路径,请打开文件并添加您自己的路径配置。C:\ProgramFiles\Java\repository至此,整个maven设置就OK了。②使用Eclipse创建mavenweb项目1、选择菜单File-->new-->project,输入maven选择MavenProject,点击Next,点击Next,进入webapp,选择第一项,点击next创建项目,但是jdk还有sevlet-api等jar包还没有选择。右击创建的项目,选择properties找到JavaBuildPath,jdk版本选择自己电脑上正确的jdk版本。选择创建的项目右键,选择properties找到ProjectFacets,version选择3.1,下面java版本选择1.8,点击Apply,选择创建的项目右键,找到buildpath,找到Libaries,并添加Tomcat8.5Repository的依赖,点击确定九、maven项目依赖高级特性①依赖传递性WebMavenDemo项目依赖JavaMavenService1JavaMavenService1项目依赖JavaMavenService2pom.xml文件配置依赖关系后,必须先mvn安装依赖的jar包在它可以被使用之前。如果WebMavenDemo的pom.xml文件可以编译,JavaMavenService1必须是mvninstallJavaMavenService。如果pom.xml文件可以编译,JavaMavenService2必须mvninstalltr??ansitivity:在Eclipse中,给JavaMavenService2添加一个spring-core.jar包后,你会惊喜的发现,jar包自动添加到两个依赖projects,也就是依赖的传递性。注意:非编译范围的依赖项是不可传递的。②版本依赖原则:1、最短路径优先原则。Service2的log4j版本是1.2.7版本。Service1排除了这个包的依赖,增加了一个Log4j1.2.9的版本。然后WebMavenDemo项目遵循最短路径优先原则,Log4j的版本与Sercive1的版本一致。2、同路径先声明优先原则。此场景依赖性已更改。WebMavenDemo项目依赖于Sercive1和Service2。它们是相同的路径,所以谁先在WebMavenDemo的pom.xml中声明依赖,谁就使用谁的版本。③依赖版本统一管理:为了统一管理版本号,可以使用properties标签,可以自定义版本的标签名。在你用到的地方使用${customtagname}十、构建配置资源在项目中的位置--> src/main/java **/*.xml **/*.txt **/*.doc <插件> <插件> org.apache.maven.plugins maven-compiler-plugin 2.1 1.8 <目标>1.8目标> org.apache.maven。plugins maven-resources-plugin 2.1 compile UTF-8 org.apache.maven.plugins maven-war-plugin 2.1 WebMavenDemo1 配置构建后执行mvnpackage,maven工程指定的target目录下的war包和文件都是根据配置生成的,整理maven的所有内容最后推荐最新最全的maven依赖版本查询网站:http://mvnrepository.com/近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4、SpringBoot2.6正式发布,一大波新特性。.5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!