当前位置: 首页 > 后端技术 > Java

Maven实战与原理解析(二):Maven实战

时间:2023-04-02 01:33:59 Java

1Maven简介1.1为什么要使用Maven由于Java生态丰富,无论你想实现什么功能,都可以找到相应的工具类。这些工具类都是以jar包的形式出现的,比如Spring、SpringMVC、MyBatis、数据库驱动等,都是以jar包的形式出现,jar包之间会有关联。在使用一个依赖之前,需要先确定这个依赖依赖了哪些其他依赖,这样当项目比较大的时候,依赖管理就会变得很麻烦和臃肿。这是Maven解决的第一个问题。Maven还可以处理多模块项目。对于简单的项目,可以分包单个模块。如果项目比较复杂,应该做成多模块项目。比如一个电商项目,有订单模块、会员模块、商品模块、支付模块……一般来说,一个多模块的项目,每个模块不能独立运行,只有多个时项目才能运行模块组合在一起。这时候借助Maven工具,就可以实现对项目的一键打包。在Maven之前,我们主要使用Ant作为项目构建工具。Ant有个特点就是每次都要写,配置比较臃肿。所以,后来想出了Maven。Maven是最先进的发布构建工具吗?不是,只是Maven目前在Java领域用的比较多而已。除了Maven,还有Gradle。1.2什么是MavenMaven是一个项目管理工具,它包括一个项目对象模型(ProjectObjectModel),体现在配置上,是一个pom.xml文件。它是一套标准,一个项目生命周期,一个依赖管理系统,还包括在项目生命周期阶段定义的插件和目标。我们在使用Maven的时候,使用一个自定义的项目对象模型,pom.xml,来详细描述我们自己的项目。Maven中有两个核心:依赖管理:jar的统一管理(Maven提供了一个Maven中央仓库,mvnrepository.com/,当我们把它添加到项目中...它会自动去中央仓库下载相关的依赖,andSolvedependenciesofdependencies)项目构建:编译、测试、打包、部署、上传到私服等。2、Maven安装Maven是一个Java项目,所以必须先安装JDK。下载Maven:下载Maven下载地址:maven.apache.org/download.cg...解压并配置配置,只需要配置环境变量:先配置MAVEN_HOME:再配置环境变量:勾选安装如果使用IntelliJIDEA,不需要另外下载Maven,直接使用IDEA自带的Maven插件即可。IntelliJIDEA自带的Maven插件位于\ideaIU-2019.2.4.win\plugins\maven\lib\maven33。Maven配置其实如果没有特殊要求,安装后直接使用即可。一般来说还是需要一点配置的,比如中央仓库的问题。默认使用Maven自带的中央仓库,网速比较慢。这时候可以通过修改配置文件将仓库改为国内镜像仓库。阿里巴巴的仓库多用于国内仓库。3.1仓库类型仓库类型说明本地仓库就是自己电脑上的仓库。每个人的电脑上都有一个仓库。默认位置是当前用户名\.m2\repository。在局域网中,访问速度更快。这个仓库存放的罐子一般都是公司自己开发的罐子。中央仓库由Apache团队维护,其中包含大部分jar。在早期,不包含Oracle数据库驱动程序。2019年8月开始,包括oracle驱动,现在三个仓库,那么jar包怎么找呢?3.2本地仓库配置本地仓库默认位置为当前用户名\.m2\repository。这个位置可以自定义,但是不建议你自定义这个地址。有几个原因:虽然所有的本地jar都放在这个仓库里,但是并没有占用太多的空间。默认位置比较隐蔽,不容易遇到。从技术上讲,当然可以自定义本地仓库的位置。可以在conf/settings.xml中自定义本地仓库的位置:3.3远程镜像配置由于默认中央仓库下载速度较慢,因此,也可以将远程仓库地址改为阿里巴巴的仓库地址:nexus-aliyuncentralNexusaliyunhttp://maven.aliyun.com/nexus/content/groups/public>复制这段配置代码,添加到settings.xml中的mirrors节点:4.Maven常用命令Maven中有一些常用命令。如果使用Eclipse,则需要手动键入命令。如果你使用IDEA,你不需要点击命令。常用命令中文含义mvncleancleanup该命令可用于清理编译后的文件mvncompile将Java代码编译成Class文件mvntesttestprojecttestmvnpackagepackaging根据用户的配置,将项目打包成一个jar包或者war安装包mvninstall手动安装一个jarmvndeploy到本地仓库上传jar到私服这里需要注意的是这些命令并不是独立运行的,它是有先后顺序的。举个简单的例子:我要上传jar到私服,那么我要构建jar,我要执行package命令,我要打包,当然还要测试,然后我需要运行mvntest命令,我要测试的话需要先编译。。。所以,最终所有的命令都会执行一次。不过开发者也可以手动配置不执行某条命令,这就是skipping。一般来说,除了测试,其他步骤不建议跳过。当然,如果开发者使用IDEA,这些命令不需要手动敲,直接点击:4.1通过命令构建项目可以直接通过命令构建Maven项目,但在实际开发中,通常可以使用Eclipse或者IDEA直接创建Maven项目。创建命令:mvnarchetype:generate-DgroupId=org.javaboy-DartifactId=firstapp-DarchetypeArtifactId=maven-archetype-quickstart-DinteractiveMode=false复制代码看到如下提示,说明项目创建成功:项目创建完成后创建成功,就两个A文件:说明对于任何一个项目,最重要的就是这两个。在pom.xml中定义了所有的项目配置。4.2打包项目接下来我们可以通过mvnpackage命令将刚刚创建的项目打包成jar包。在打包之前,我们需要配置JDK版本至少为7以上。因此,我们还需要手动修改pom.xml文件,即添加如下配置:添加后,执行打包命令。注意,执行所有命令时,命令行都要导航到pom.xml文件所在目录,看到如下提示,说明项目打包成功。4.3安装项目到本地仓库如果需要将项目安装到本地仓库,可以直接执行mvninstall命令。注意mvninstall命令会包含上面的mvnpackage过程。安装到本地仓库后,此时点击自己的本地仓库,即可看到相关的jar。5.在IDEA中使用Maven与Eclipse不同。IDEA安装好后,就可以直接使用Maven了。5.1Maven相关配置在IDEA中,Maven配置在File->Settings->Build,Execution,Deployment->BuildTools->Maven:5.2JavaSE项目创建首先,在创建项目时,选择Maven项目:如果选中OnCreatefromarchetype,则意味着可以根据项目骨架(项目模板)创建新项目。但是,如果您只是创建一个JavaSE项目,则不需要选择项目骨架。只需单击“下一步”。然后填写项目的坐标,即groupId和artifactId。填写完成后直接点击下一步。这样我们就得到了一个JavaSE项目,项目结构和你用命令创建的项目完全一样。5.3JavaWeb项目创建在IDEA中,创建MavenWeb项目有两种方式:先创建JavaSE项目,然后手动将JavaSE项目转为JavaWeb项目。创建项目时选择项目骨架,骨架选择webapp,推荐第一种方法。5.3.1改造JavaSE项目这样,首先创建一个JavaSE项目,创建步骤与上述一致。项目创建完成后,首先修改pom.xml,配置项目的打包格式为war包。这样IDEA就知道当前项目是Web项目了:然后,选中JavaSE项目,右击,选择OpenModuleSettings,或者直接按F4,然后选择Web,如下图:接下来,在webapp目录中,添加web.xml文件。注意,一定要修改web.xml文件的位置:配置完成后,点击确定退出。项目创建完成后,下一步就是部署。部署,首先点击IDEA右上角的EditConfigurations:然后,配置Tomcat:接下来选择Deployment选项卡,配置要发布的项目:最后点击IDEA右上角的三角符号即可启动项目。5.3.2直接通过webapp骨架创建比较简单,基本不需要额外配置。项目创建后,就是一个web项目。我们只需要在创建项目的时候选择webapp骨架即可。选择骨架后,后续步骤同上。项目创建成功后,只有webapp目录。这时候手动创建java和resources目录。创建完成后,右键选择MarkDirectoryAs,将java目录标记为sourcesroot,将resources目录标记为resourcesroot。.每当您在IDEA的右下角看到“启用自动导入”按钮时,请单击它。6.Maven依赖管理Maven项目,如果需要使用第三方控件,是通过依赖管理完成的。这里使用的东西之一是pom.xml文件。这个概念叫做项目对象模型(POM,ProjectObjectModel)。我们在pom.xml中定义了Maven项目的形式,所以pom.xml相当于Maven项目的一张图。它类似于用于描述三大网络组件的web.xml文件。这张地图涉及什么?6.1Maven坐标junitjunit4.11test复制dependencies标签中的代码依赖,添加项目需要的jar对应的maven坐标。dependency一个dependency标签代表一个坐标groupId组、公司、组织等的唯一标识符。社区ID的约定是它以创建该项目的组织的反向域名开头(例如org.javaboy)。Maven坐标必须包含groupId。一些典型的groupId比如apache的groupIdorg.apache.artifactIdartifactId相当于一个项目在一个组织中的唯一标识。version项目的版本。对于一个项目,可能有多个版本。如果是开发中的项目,我们可以在版本号后面加一个SNAPSHOT,表示这是一个快照版本(新项目默认版本号是快照版本)scope表示依赖范围。我们添加了很多依赖,但是不同依赖的使用范围是不一样的。最典型的有两个,一个是数据库驱动,一个是单元测试。在使用数据库驱动的过程中,我们自己编写代码,也就是JDBC代码。只有在项目运行时,才需要执行MySQL驱动中的代码。因此,在项目中添加MySQL驱动依赖后,可以将其作用域设置为运行时,在编译时不会生效。单元测试只在测试时生效,所以可以设置它的作用域为test,这样在项目打包发布时,单元测试的依赖不会被释放。6.2DependencyConflict依赖冲突产生原因图中a.jar依赖b.jar,a.jar依赖d.jar。此时a、b、d之间的关系是直接依赖关系,a、c之间的关系是间接依赖关系。6.2.1冲突解决先定义,使用最近路径原则(直接声明使用)以spring-context为例,下图中的x表示无效依赖(优先级低的依赖,即优先选择路径较近的依赖):以上这两个是默认行为。我们也可以手动控制它。手动控制主要是通过排除依赖实现的,如下:.springframeworkspring-core复制代码这意味着从spring-context中排除spring-core依赖。7、Maven私服Maven仓库管理也叫Maven私服或代理仓库。使用Maven私服有两个目的:私服是开发者和远程仓库之间的代理私服可以用来部署公司自己的jar7.1Nexus简介Nexus是一个强大的Maven仓库管理工具,使用Nexus可以方便的管理内部存储库,同时简化对外部存储库的访问。官网为:www.sonatype.com/7.2安装下载下载地址:www.sonatype.com/download-os...将下载的压缩包解压,复制到没有中文的路径下,然后解压。开始解压后,打开cmd窗口(以管理员身份打开cmd窗口),然后定位到nexus解压目录,执行nexus.exe/run命令启动服务。这个启动有点慢,大概一两分钟。启动成功后,在浏览器中输入http://lcoalhost:8081,打开管理页面。打开管理页面后,点击右上角的登录按钮进行登录,默认用户名/密码为admin/admin123。当然,用户也可以点击设置按钮手动配置其他用户。点击Repositories查看仓库详情:7.2.1仓库类型名称描述proxy表示这个仓库是远程仓库代理,最典型的是代理Maven中央仓库hosted主机仓库,存放公司开发的一些jar在host仓库中,还有一些maven中央仓库上没有的jargroup仓库组,包括proxy仓库和hostwarehousevirtual虚拟仓库7.2.2上传jar上传jar,配置两个地方:Maven的conf/settings.xml文件配置:版本adminadmin123snapshotsadminadmin123复制代码在项目的pom.xml文件中上传jar,配置上传路径:releaseshttp://localhost:8081/repository/maven-releases/快照http://localhost:8081/repository/maven-snapshots/复制代码分发配置完成后点击deploy按钮,或者执行mvndeploy命令将jar上传到私服。7.2.3在私服上下载jar,直接在工程中添加依赖。添加后添加私服地址:local-repositoryhttp://localhost:8081/repository/maven-public/truetrue复制代码8.聚合项目所谓聚合项目,其实就是一个多-模块项目。在一个比较大的互联网项目中,需要将项目拆分成多个模块进行开发,比如订单模块、VIP模块、支付模块、内容管理模块、CMS、CRM等,这种拆分方式其实更接近于微服务。在一个模块里面,还可以继续拆分,比如拆分成dao、service、controller等,可能有人会说,这样分包还不够吗?当然,小项目可以分包,大项目不能分包。例如,在一个大型电子商务系统中,有一个子模块叫用户管理,另一个子模块叫订单管理。两个子模块都涉及用户。在这种情况下,我们需要将用户类单独提取出来,单独做一个模块供其他模块调用。8.1多模块项目展示|--javaboy-parent|--javaboy-cms|--javaboy-crm|--javaboy-manger|--javaboy-manager-model|--javaboy-manager-dao|--javaboy-manager-service|--javaboy-manager-web复制代码以javaboy-manger为例,javaboy-manager本身不提供功能,它只负责管理自己的子模块,而他的每个子模块不能独立运行,需要四者结合运行。项目打包的时候会把model、dao、service打包成jar,然后打包好的jar会自动复制到web中,然后web会自动打包成war包。8.2IDEA中创建聚合项目1.创建一个空的Maven项目:项目创建后,由于parent不参与业务的实现,仅用于管理其子模块,src目录可以删除.2.选择当前项目,右键,New->Module,继续选择创建Maven项目:在IDEA中,默认已经指定了当前Module的parent,开发者只需要填写其artifactId即可当前模块。:javaboy-manager创建完成后,此时观察javaboy-parent的pom.xml文件,发现它自动添加了packing属性:其中,它的packaging属性值为pom,代表是一个聚合项目.同时,他还添加了一个modules节点,表示自己的子模块。同时注意javaboy-manager,它本身有一个父节点,它描述了它的父模块的属性值:javaboy-parentorg.javaboy1.0-SNAPSHOT复制代码这个parent不仅仅是简单的父子关系描述,它具有继承关系。一般我们可以在parent中统一定义依赖或者插件版本号。3、由于javaboy-manager本身也是一个Aggregation作品,因此,javaboy-manager的src目录也可以删除。4.选择javaboy-manager,右击,New->Module新建一个Maven模块。此步骤与第二步类似,此处不再赘述。这里,新的javaboy-manager-model创建成功后,我们手动配置它的packaging属性值为jar。5.按照步骤4,分别创建javaboy-manager-service和javaboy-manager-dao。6.继续创建javaboy-manager-web模块。与其他模块不同,web模块需要打包成war。web模块创建请参考【第五篇】。7.web项目创建后,完善模块之间的继承关系。javaboy-manager-web依赖javaboy-manager-servicejavaboy-manager-service依赖javaboy-manager-daojavaboy-manager-dao依赖javaboy-manager-model注意依赖默认是传递的,即在javaboy-manager-dao依赖于javaboy-manager-service中的javaboy-manager-model,也可以在javaboy-manager-service中访问。配置的依赖如下:接下来可以在不同的模块中编写代码,然后部署项目。部署方法参考【第五篇】有一点需要注意。在多模块项目中,web项目打包需要注意以下问题:不能直接单独打包。如果要打包,有两种方式:第一种是手动将model、dao、service分别安装到本地仓库,从聚合项目中打包,也就是从父类中打包网。微信公众号【程序员黄小邪】作者是前蚂蚁金服的Java工程师。微服务、高并发、JVM、Docker容器、ELK、大数据等。关注后回复【书籍】领取Java面试必备电子书20本精选。