一个小时学会Maven张果

在开发中经常需要依赖第三方的包,包与包之间存在依赖关系,版本间还有兼容性问题,有时还里要将旧的包升级或降级,当项目复杂到一定程度时包管理变得非常重要。

Maven是当前最受欢迎的Java项目管理构建自动化综合工具,类似以前Java中的Ant、node.js中的npm、dotNet中的nuget、PHP中的Composer。

Maven这个单词来自于意第绪语(犹太语),意为知识的积累。

每个Java项目的目录结构都没有一个统一的标准,配置文件到处都是,单元测试代码到底应该放在那里也没有一个权威的规范。

因此,我们就要用到Maven(使用Ant也可以,不过编写Ant的xml脚本比较麻烦)----一个项目管理工具。

Maven主要做了两件事:

如果没有Maven,你可能不得不经历下面的过程:

1如果使用了spring,去spring的官网下载jar包;如果使用hibernate,去hibernate的官网下载Jar包;如果使用Log4j,去log4j的官网下载jar包.....2当某些jar包有依赖的时候,还要去下载对应的依赖jar包3当jar包依赖有冲突时,不得不一个一个的排查4执行构建时,需要使用ant写出很多重复的任务代码5当新人加入开发时,需要拷贝大量的jar包,然后重复进行构建6当进行测试时,需要一个一个的运行....检查有了Maven,它提供了三种功能:

中央仓库资源:

其实主流的开发工具如IDEA、Eclipse都集成了Maven(可见重要性),但为了更加深刻的学习与管理该工具(比如多个IDE共享的问题),个人建议还是单独安装比较好。

注意:安装maven之前,必须先确保你的机器中已经安装了JDK,如果是Maven3则必须JDK1.7以上。

1.解压压缩包

2.添加环境变量MAVEN_HOME,值为apache-maven的安装路径(没有中文)

3.在Path环境变量的变量值末尾添加%MAVEN_HOME%\bin;

4.在cmd输入mvn–version,如果出现maven的版本信息,说明配置成功。

如果您不配置,默认会在如下位置存放从远程下载到的包:

从中央仓库下载的jar包,都会统一存放到本地仓库中。我们需要配置本地仓库的位置。

打开maven安装目录,打开conf目录下的setting.xml文件。

可以参照下图配置本地仓储位置。

你还可以在运行时指定本地仓库位置:

mvncleaninstall-Dmaven.repo.local=d:\yourpath2.4、中央仓库配置当构建一个Maven项目时,首先检查pom.xml文件以确定依赖包的下载位置,执行顺序如下:

修改默认中央仓库地址

常用地址:

输入命令mvnarchetype:generate,按回车,根据提示输入参数,如果是第一次使用,需要下载插件,稍等几分钟即可。

切换目录,输入指令

选择骨架(模板):

输入座标:

确认后下载骨架,成功后的提示如下:

将项目转换成IDEA项目:

成功后可以看到增加了项目信息:

在IDEA中就可以直接打开项目了:

将项目打包

输入指令:mvnpackage

打包成功后:

方法二:

在命令中指定参数

mvnarchetype:generate-DgroupId=com.mycompany.app-DartifactId=myapp-DarchetypeArtifactId=maven-archetype-quickstart-DinteractiveMode=false执行结果:

在命令行输入:

mvnarchetype:generate-DgroupId=com.zhangguo.mvntest04-DartifactId=MvnTest04-DarchetypeArtifactId=maven-archetype-webapp-DinteractiveMode=falseViewCode在命令行输入指令时请注意当前目录:

成功提示:

新建一个简单web项目

mvnarchetype:generate-DgroupId=com.zhangguo-DartifactId=webappdemo-Dpackage=com.zhangguo.webappdemo-DarchetypeArtifactId=maven-archetype-webapp-Dversion=1.0-DinteractiveMode=No如果下载骨架的速度太慢,可以用-DarchetypeCatalog=指定下载位置,如下所示:

是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。

jetty的特点:

2.6.1、修改pom,增加jetty插件:

org.mortbay.jettymaven-jetty-plugin6.1.26src/main/webapp3/jetty40002.6.2、将项目部署到jetty中运行:

2.6.3、在浏览器中输入访问地址:

结束运行使用ctrl+c

2.6.4、idea中使用maven方式使用jetty

配置好后可直接点击idea中右边的maven选项卡,在plugins下有jetty选项,展开随便点那个都可以启动jetty,启动好后就可以在浏览器中输入地址访问web应用了。

添加插件:

执行命令:

tomcat:deploy--部署一个webwar包tomcat:reload--重新加载webwar包tomcat:start--启动tomcattomcat:stop--停止tomcattomcat:undeploy--停止一个war包tomcat:run启动嵌入式tomcat,并运行当前项目三、Maven概要Maven是一个Java项目管理工具,主要功能是统一开发规范与包的依赖管理。

1.POM(ProjectObjectModel)项目对象模型

Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。

POM与Java代码实现了解耦,当需要升级版本时,只需要修改POM,而不需要更改Java代码,而在POM稳定后,日常的Java代码开发基本不涉及POM的修改。

2.坐标

groupId,artifactId,version三个元素是项目的坐标,唯一的标识这个项目。

groupId项目所在组,一般是组织或公司

artifactId是当前项目在组中的唯一ID;

version表示版本,SNAPSHOT表示快照,表示此项目还在开发中,不稳定。

groupId和实际项目不一定是一一对应的,maven有模块的概念,例如spring-core,spring-context...;groupId也不应该只对应公司或组织名,建议具体到项目名,因为公司或者组织下有多个项目,而artifactId只能代表模块名。

junitjunit4.11test3.依赖范围

1.compile:编译,测试,运行都有效,默认的选择2.test:测试有效,例如junit3.provided:编译,测试有效,例如servlet,运行时容器会提供实现4.runtime:运行和测试有效,例如jdbc,编译时只需相应的接口,测试和运行时才需要具体的实现5.system:编译,测试有效。使用此范围的依赖必须通过systemPath元素显式的指定依赖文件,因而此类依赖是不通过Maven仓库解析的,一般适合于本机测试环境下,依赖本地起的服务。

构建

maven支持许多种的应用程序类型,对于每一种支持的应用程序类型都定义好了一组构建规则和工具集。

输出管理

maven可以管理项目构建的产物,并将其加入到用户库中。这个功能可以用于项目组和其他部门之间的交付行为

依赖关系

maven对依赖关系的特性进行细致的分析和划分,避免开发过程中的依赖混乱和相互污染行为

文档和构建结果

maven的site命令支持各种文档信息的发布,包括构建过程的各种输出,javadoc,产品文档等。

项目关系

一个大型的项目通常有几个小项目或者模块组成,用maven可以很方便地管理

移植性管理

maven可以针对不同的开发场景,输出不同种类的输出结果

maven把项目的构建划分为不同的生命周期(lifecycle)。粗略一点的话,它这个过程(phase)包括:编译、测试、打包、集成测试、验证、部署。maven中所有的执行动作(goal)都需要指明自己在这个过程中的执行位置,然后maven执行的时候,就依照过程的发展依次调用这些goal进行各种处理。

这个也是maven的一个基本调度机制。一般来说,位置稍后的过程都会依赖于之前的过程。当然,maven同样提供了配置文件,可以依照用户要求,跳过某些阶段。

三种生命周期

下面列出了default、clean和site生命周期的所有构建阶段,这些阶段按照指定的顺序执行。

clean生命周期

Default生命周期

Site生命周期

注意:执行某个生命周期的某个阶段不会影响其它的生命周期!

如果要同时执行多个生命周期的阶段可在命令行输入多个命令,中间以空格隔开,例如:cleanpackage该命令执行clean生命周期的clean阶段和default生命周期的package阶段。

Maven的标准工程结构如下:

所谓的"约束优于配置",在maven中并不是完全不可以修改的,他们只是一些配置的默认值而已。但是除非必要,并不需要去修改那些约定内容。maven默认的文件存放结构如1.3所示。

每一个阶段的任务都知道怎么正确完成自己的工作,比如compile任务就知道从src/main/java下编译所有的java文件,并把它的输出class文件存放到target/classes中。

对maven来说,采用"约定优于配置"的策略可以减少修改配置的工作量,也可以降低学习成本,更重要的是,给项目引入了统一的规范。

maven有自己的版本规范,一般是如下定义..-,比如1.2.3-beta-01。要说明的是,maven自己判断版本的算法是major,minor,incremental部分用数字比较,qualifier部分用字符串比较,所以要小心alpha-2和alpha-15的比较关系,最好用alpha-02的格式。

maven在版本管理时候可以使用几个特殊的字符串SNAPSHOT,LATEST,RELEASE。比如"1.0-SNAPSHOT"。各个部分的含义和处理逻辑如下说明:

SNAPSHOT这个版本一般用于开发过程中,表示不稳定的版本。

RELEASE是指仓库中最后的一个非快照版本

规范:

1、同一项目中所有模块版本保持一致2、子模块统一继承父模块的版本3、统一在顶层模块Pom的节中定义所有子模块的依赖版本号,子模块中添加依赖时不要添加版本号4、开发测试阶段使用SNAPSHOT5、生产发布使用RELEASE6、新版本迭代只修改顶层POM中的版本

什么是MavenArchetype简单的说就是一个Maven项目的基础模板,利用这个模板我们就可快速的建立一个新的该类型项目,同时也可以建立自己的项目骨架。Maven所提供的archetype功能都是由插件MavenArchetypePlugin完成的

主要命令:

使用archetype:generate创建项目

参数

含义

groupId

当前应用程序隶属的Group的ID

artifactId

当前应用程序的ID

package

代码生成时使用的根包的名字,如果没有给出,默认使用archetypeGroupId

原型有关参数表

archetypeGroupId

原型(archetype)的GroupID

archetypeArtifactId

原型(archetype)ID

archetypeVersion

原型(archetype)版本

archetypeRepository

包含原型(archetype)的资源库

archetypeCatalog

filter

查找时过滤artifactIdorgroupId:artifactId

命令示例:新建一个简单web项目mvnarchetype:generate-DgroupId=com.domain-DartifactId=webappdemo-Dpackage=com.domain.webappdemo-DarchetypeArtifactId=maven-archetype-webapp-Dversion=1.0-DinteractiveMode=No

从一个已有项目生成一个archetype

mvncleanarchetype:create-from-project-Darchetype.properties=./archetype.properties-Darchetype.filteredExtentions=java,xml,jsp,properties,sql

Maven包含了一个项目对象模型(ProjectObjectModel),一组标准集合,一个项目生命周期(ProjectLifecycle),一个依赖管理系统(DependencyManagementSystem),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

项目对象模型(ProjectObjectModel)

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

依赖管理系统(DependencyManagementSystem)

通过maven的依赖管理对项目所依赖的jar包进行统一管理。比如:项目依赖junit4.9,通过在pom.xml中定义junit4.9的依赖即使用junit4.9,如下所示是junit4.9的依赖定义:

junitjunit4.9test一个项目生命周期(ProjectLifecycle)

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

maven通过执行一些简单命令即可实现上边生命周期的各各过程,比如执行mvncompile执行编译、执行mvnclean执行清理。

一组标准集合

maven将整个项目管理过程定义一组标准,比如:通过maven构建工程有标准的目录结构,有标准的生命周期阶段、依赖管理有标准的坐标定义等。

插件(plugin)目标(goal)

maven管理项目生命周期过程都是基于插件完成的。

Maven坐标是一组可以惟一标识构件的三元组值

如果有一个非maven的项目想转换成maven管理的项目,只需如下操作即可:

在项目上右键,添加框架支持

选择maven与其它想添加的框架

选择允许自动导入

这样就成功转换成了一个maven项目

4.1是一种创建maven项目的办法,但不推荐,因为没有使用统一的骨架,可以一开始就选择创建maven项目,步骤如下:

步骤一:首先先创建一个project,上次我说过了创建一个project就是一个工作空间,在这里就是创建一个maven的工作空间

步骤二:选择maven项目,指定骨架,这里选择的是一个webapp,当然webapp骨架有非常多,这里选择apache提供的

步骤三:填写项目的座标,公司编号(一般倒置域名),项目名称,版本:

步骤四:因为IDEA内置了Maven,可以选择默认内置的Maven;当然最好是选择自己安装并配置好的环境,让所有的IDE统一:

这里可以点绿色的小加号添加参数

步骤五:选择项目名称,位置,一般默认

点击Finish项目就创建完成了,如下图所示:

点击右上角下拉框,选择EditConfigurations,编辑配置

添加tomcat的配置

配置tocat服务器,命名,选择tomcat版本,等想配置的信息;最关键的是需要将项目部署出去,可以直接击fix

选择warexplored,他们的区别

当然也可以手动选择要部署出去的项目,特别是有多个项目的情况

配置项目结构,特别是要注意依赖的包需要部署到WEB-INF的lib目录下

完成后可以启服务器,效果如下:

当然可以直接使用插件让项目部署到jetty中通过maven运行,不需tomcat。

是选择war还是warexploded这里首先看一下他们两个的区别:

(1)war模式这种可以称之为是发布模式,看名字也知道,这是先打成war包,再发布;

(2)warexploded模式是直接把文件夹、jsp页面、classes等等移到Tomcat部署文件夹里面,进行加载部署。因此这种方式支持热部署,一般在开发的时候也是用这种方式。

(3)在平时开发的时候,使用热部署的话,应该对Tomcat进行相应的设置,这样的话修改的jsp界面什么的东西才可以及时的显示出来。

两种方式得部署方式是不一样的,在获取项目的路径的时候得到的结果是不一样的

StringcontextPath=request.getSession().getServletContext().getRealPath("/");4.2.4、修改项目结构maven有一个很重要的功能是规范项目,标准的项目结构如下所示:

但是你会发现默认创建的项并非是完整的,如写源代码的目录没有,添加方法如下

当前项目结构如下:

添加相应的目录,选择打开项目结构:

项目结构如下:

蓝色:源代码

绿色:测试

资源文件(配置信息)

测试资源文件

被排除的(打包里被忽视)

目标位置右键添加目录:

添加后的目录结构如下:

打开项目描述文件,指定源代码目录:

修改方法:

这样就可以了:

如果没有添加tomcat的配置信息或没有servet的核心包也可能出现该问题,建议修改pom加上:

javax.servletjstl1.2javax.servletjavax.servlet-api3.0.1providedjavax.servlet.jspjsp-api2.1provided4.3、在Eclipse中创建Maven工程Maven插件在Eclipse中创建Maven工程,需要安装Maven插件。

一般较新版本的Eclipse都会带有Maven插件,如果你的Eclipse中已经有Maven插件,可以跳过这一步骤。

点击Help->EclipseMarketplace,搜索maven关键字,选择安装红框对应的Maven插件。

点击Window->Preferences

如下图所示,配置settings.xml文件的位置

File->New->MavenProject->Next,在接下来的窗口中会看到一大堆的项目模板,选择合适的模板。

接下来设置项目的参数,如下:

groupId是项目组织唯一的标识符,实际对应JAVA的包的结构,是main目录里java的目录结构。

artifactId就是项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称。

点击Finish,Eclipse会创建一个Maven工程。

Eclipse中构建方式

在Elipse项目上右击->RunAs就能看到很多Maven操作。这些操作和maven命令是等效的。例如Mavenclean,等同于mvnclean命令。

你也可以点击Mavenbuild,输入组合命令,并保存下来。如下图:

Maven命令构建方式

当然,你也可以直接使用maven命令进行构建。

进入工程所在目录,输入maven命令就可以了。

如下图

多模块项目不一定要使用Maven,普通项目也可以。

1、创建父模块

创建一个普通的Maven项目,不需要选择骨架(archetype)

指定座标

完成后一个普通的Maven项目就创建好了

2、创建子模块

子模块可以有多个,相互间可以依赖

在父模块上右键创建一个Module(模块)

utils

创建普通maven项目没有骨架

指定模块名称

完成后如下:

entities

创建成一个非maven项目(当然可以是maven的)

指定项目名称

完成后

webapp

创建一个基于骨架的mavenWebApp项目

设置名称

选择mavenhome

完成后的结果

3、模块间依赖

方法一:依赖class

打开项目结构

添加模块依赖

指定要依赖的模块

依赖成功

指定输出

最终项目结构

结果

方法一:通过座标直接依赖jar

hr-ui模块的pom文件

dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)

父模块的pom

当我把父项目中的依赖放到依赖管理中的效果如下所示:

这里的父模块与子模块都并没有依赖junit了,这时的依赖只是用于管理,并没有真正依赖。

元素既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性。

如果想要在某个模块中使用和另一个模块中完全一样的dependencyManagement配置,除了赋值和继承外,还可以使用import范围依赖将这一配置导入。

我们要达到的目的是:父模块作版本管理不实际依赖,子模块按需依赖。

父模块pom

1、显示版本信息

mvn-versionmvn-v结果:

2、使用互动模式创建项目

mvnarchetype:generate结果:

3、使用非互动模式(指定参数创建项目)

普通项目骨架:

mvnarchetype:generate-DgroupId=com.mycompany.app-DartifactId=myapp-DarchetypeArtifactId=maven-archetype-quickstart-DinteractiveMode=falseWeb项目骨架:

4、将项目转化为idea项目

mvnidea:idea结果:

5、将项目转化为Eclipse项目

mvneclipse:eclipse结果:

6、编译,将Java源程序编译成class字节码文件

mvncompile结果:

7、测试,并生成测试报告

mvntest导入到idea中,添加测试用例

结果:

8、将以前编译得到的旧的class字节码文件删除

mvnclean结果:

9、打包,动态web工程打war包,Java工程打jar包

mvnpakage结果:

10、将项目生成jar包放在仓库中,以便别的模块调用,安装到本地

mvninstall结果:

在其它项目中依赖

12.编译测试的内容:mvntest-compile

13.只打jar包:mvnjar:jar

14.只打war包:mvnwar:war

15.清除eclipse的一些系统设置:mvneclipse:clean

16.运行项目于jetty上:mvnjetty:run

17.生成Wtp插件的Web项目:mvn-Dwtpversion=1.0eclipse:eclipse

18.清除Eclipse项目的配置信息(Web项目):mvn-Dwtpversion=1.0eclipse:clean

19、部署项目:

mvndeploy:deploy-file-DgroupId=com-DartifactId=client-Dversion=0.1.0-Dpackaging=jar-Dfile=d:\client-0.1.0.jar-DrepositoryId=maven-repository-inner-Durl=ftp://xxxxxxx/opt/maven/repository/其它指令:

阶段描述

mvnvalidate

验证项目是否正确,以及所有为了完整构建必要的信息是否可用

mvngenerate-sources

生成所有需要包含在编译过程中的源代码

mvnprocess-sources

处理源代码,比如过滤一些值

mvngenerate-resources

生成所有需要包含在打包过程中的资源文件

mvnprocess-resources

复制并处理资源文件至目标目录,准备打包

mvncompile

编译项目的源代码

mvnprocess-classes

后处理编译生成的文件,例如对Java类进行字节码增强(bytecodeenhancement)

mvngenerate-test-sources

生成所有包含在测试编译过程中的测试源码

mvnprocess-test-sources

处理测试源码,比如过滤一些值

mvngenerate-test-resources

生成测试需要的资源文件

mvnprocess-test-resources

复制并处理测试资源文件至测试目标目录

mvntest-compile

编译测试源码至测试目标目录

mvntest

使用合适的单元测试框架运行测试。这些测试应该不需要代码被打包或发布

mvnprepare-package

在真正的打包之前,执行一些准备打包必要的操作。这通常会产生一个包的展开的处理过的版本(将会在Maven2.1+中实现)

mvnpackage

将编译好的代码打包成可分发的格式,如JAR,WAR,或者EAR

mvnpre-integration-test

执行一些在集成测试运行之前需要的动作。如建立集成测试需要的环境

mvnintegration-test

如果有必要的话,处理包并发布至集成测试可以运行的环境

mvnpost-integration-test

执行一些在集成测试运行之后需要的动作。如清理集成测试环境。

mvnverify

执行所有检查,验证包是有效的,符合质量规范

mvninstall

安装包至本地仓库,以备本地的其它项目作为依赖使用

mvndeploy

使用参数

-Dmaven.test.skip=true:跳过单元测试(eg:mcncleanpackage-Dmaven.test.skip=true)

图标1:重新导入所有的maven项目,刷新

图标2:重新生成所有源代码并更新文件夹

图标3:下载源码或文件

图标4:添加一个外部的Maven项目

图标5:执行选择的指令

图标6:执行自定义的指令

图标7:切换离线模式

图标8:切换成跳过测试模式

图标9:显示依赖结构图

图标10:折叠所有

图标11:Maven设置

选择命令后右键run

创建命令,可反复使用并指定名称与参数

定义细节

执行

在POM文件中引入对应的标签即可

groupId:项目组织唯一的标识符,实际对应JAVA的包的结构。

artifactId:项目唯一的标识符,实际对应项目的名称,就是项目根目录的名称。

version:jar包的版本号。可以直接填版本数字,也可以在properties标签中设置属性值。

scope:jar包的作用范围。可以填写compile、runtime、test、system和provided。用来在编译、测试等场景下选择对应的classpath

要添加Maven插件,可以在pom.xml文件中添加标签。

org.mortbay.jettymaven-jetty-plugin6.1.26src/main/webapp3/jetty40006.4、如何一次编译多个工程在Maven中,允许一个MavenProject中有多个MavenModule

这时打开XXX中的pom.xml可以看到其中有以下标签

xxx1

选择编译XXX时,会依次对它的所有Module执行相同操作。

Maven是一个执行插件的框架,每一个任务实际上是由插件完成的。Maven提供以下两种类型插件:构建插件,在生成过程中执行,并在pom.xml中的元素进行配置;报告插件,在网站生成期间执行,在pom.xml中的元素进行配置。

maven-antrun-plugin

maven-antrun-plugin能让用户在Maven项目中运行Ant任务。用户可以直接在该插件的配置以Ant的方式编写Target,然后交给该插件的run目标去执行。在一些由Ant往Maven迁移的项目中,该插件尤其有用。此外当你发现需要编写一些自定义程度很高的任务,同时又觉得Maven不够灵活时,也可以以Ant的方式实现之。maven-antrun-plugin的run目标通常与生命周期绑定运行。

maven-archetype-plugin

Archtype指项目的骨架,Maven初学者最开始执行的Maven命令可能就是mvnarchetype:generate,这实际上就是让maven-archetype-plugin生成一个很简单的项目骨架,帮助开发者快速上手。可能也有人看到一些文档写了mvnarchetype:create,但实际上create目标已经被弃用了,取而代之的是generate目标,该目标使用交互式的方式提示用户输入必要的信息以创建项目,体验更好。maven-archetype-plugin还有一些其他目标帮助用户自己定义项目原型,例如你由一个产品需要交付给很多客户进行二次开发,你就可以为他们提供一个Archtype,帮助他们快速上手。

maven-assembly-plugin

maven-assembly-plugin的用途是制作项目分发包,该分发包可能包含了项目的可执行文件、源代码、readme、平台脚本等等。maven-assembly-plugin支持各种主流的格式如zip、tar.gz、jar和war等,具体打包哪些文件是高度可控的,例如用户可以按文件级别的粒度、文件集级别的粒度、模块级别的粒度、以及依赖级别的粒度控制打包,此外,包含和排除配置也是支持的。maven-assembly-plugin要求用户使用一个名为assembly.xml的元数据文件来表述打包,它的single目标可以直接在命令行调用,也可以被绑定至生命周期。

maven-dependency-plugin

maven-enforcer-plugin

在一个稍大一点的组织或团队中,你无法保证所有成员都熟悉Maven,那他们做一些比较愚蠢的事情就会变得很正常,例如给项目引入了外部的SNAPSHOT依赖而导致构建不稳定,使用了一个与大家不一致的Maven版本而经常抱怨构建出现诡异问题。maven-enforcer-plugin能够帮助你避免之类问题,它允许你创建一系列规则强制大家遵守,包括设定Java版本、设定Maven版本、禁止某些依赖、禁止SNAPSHOT依赖。只要在一个父POM配置规则,然后让大家继承,当规则遭到破坏的时候,Maven就会报错。除了标准的规则之外,你还可以扩展该插件,编写自己的规则。maven-enforcer-plugin的enforce目标负责检查规则,它默认绑定到生命周期的validate阶段。

maven-help-plugin

maven-help-plugin是一个小巧的辅助工具,最简单的help:system可以打印所有可用的环境变量和Java系统属性。help:effective-pom和help:effective-settings最为有用,它们分别打印项目的有效POM和有效settings,有效POM是指合并了所有父POM(包括SuperPOM)后的XML,当你不确定POM的某些信息从何而来时,就可以查看有效POM。有效settings同理,特别是当你发现自己配置的settings.xml没有生效时,就可以用help:effective-settings来验证。此外,maven-help-plugin的describe目标可以帮助你描述任何一个Maven插件的信息,还有all-profiles目标和active-profiles目标帮助查看项目的Profile。

maven-release-plugin

maven-release-plugin的用途是帮助自动化项目版本发布,它依赖于POM中的SCM信息。release:prepare用来准备版本发布,具体的工作包括检查是否有未提交代码、检查是否有SNAPSHOT依赖、升级项目的SNAPSHOT版本至RELEASE版本、为项目打标签等等。release:perform则是签出标签中的RELEASE源码,构建并发布。版本发布是非常琐碎的工作,它涉及了各种检查,而且由于该工作仅仅是偶尔需要,因此手动操作很容易遗漏一些细节,maven-release-plugin让该工作变得非常快速简便,不易出错。maven-release-plugin的各种目标通常直接在命令行调用,因为版本发布显然不是日常构建生命周期的一部分。

maven-resources-plugin

为了使项目结构更为清晰,Maven区别对待Java代码文件和资源文件,maven-compiler-plugin用来编译Java代码,maven-resources-plugin则用来处理资源文件。默认的主资源文件目录是src/main/resources,很多用户会需要添加额外的资源文件目录,这个时候就可以通过配置maven-resources-plugin来实现。此外,资源文件过滤也是Maven的一大特性,你可以在资源文件中使用${propertyName}形式的Maven属性,然后配置maven-resources-plugin开启对资源文件的过滤,之后就可以针对不同环境通过命令行或者Profile传入属性的值,以实现更为灵活的构建。

maven-surefire-plugin

build-helper-maven-plugin

Maven默认只允许指定一个主Java代码目录和一个测试Java代码目录,虽然这其实是个应当尽量遵守的约定,但偶尔你还是会希望能够指定多个源码目录(例如为了应对遗留项目),build-helper-maven-plugin的add-source目标就是服务于这个目的,通常它被绑定到默认生命周期的generate-sources阶段以添加额外的源码目录。需要强调的是,这种做法还是不推荐的,因为它破坏了Maven的约定,而且可能会遇到其他严格遵守约定的插件工具无法正确识别额外的源码目录。

build-helper-maven-plugin的另一个非常有用的目标是attach-artifact,使用该目标你可以以classifier的形式选取部分项目文件生成附属构件,并同时install到本地仓库,也可以deploy到远程仓库。

exec-maven-plugin

jetty-maven-plugin

versions-maven-plugin

很多Maven用户遇到过这样一个问题,当项目包含大量模块的时候,为他们集体更新版本就变成一件烦人的事情,到底有没有自动化工具能帮助完成这件事情呢?(当然你可以使用sed之类的文本操作工具,不过不在本文讨论范围)答案是肯定的,versions-maven-plugin提供了很多目标帮助你管理Maven项目的各种版本信息。例如最常用的,命令mvnversions:set-DnewVersion=1.1-SNAPSHOT就能帮助你把所有模块的版本更新到1.1-SNAPSHOT。该插件还提供了其他一些很有用的目标,display-dependency-updates能告诉你项目依赖有哪些可用的更新;类似的display-plugin-updates能告诉你可用的插件更新;然后use-latest-versions能自动帮你将所有依赖升级到最新版本。最后,如果你对所做的更改满意,则可以使用mvnversions:commit提交,不满意的话也可以使用mvnversions:revert进行撤销。

dependencyManagement主要是为了统一管理插件,确保所有子项目使用的插件版本保持一致,类似的还是plugins和pluginManagement。

1、修改项目文件.iml,添加如下内容

2、添加Servlet-api核心包

这里使用Maven+多模块项目+IDEA+Git+MySQL完成一个简单的综合示例,完成一个TaskList项目,实现任务管理功能。

8.1、创建项目

8.2、创建数据数据库与表

创建表

添加数据

8.3、编写实体模块

8.4、编写工具模块

8.5、数据访问模块

添加依赖

修改Pom

packagecom.zhangguo.tasklist.dao;importcom.zhangguo.tasklist.entities.Task;importcom.zhangguo.tasklist.utils.JDBCUtils;importjava.util.List;publicclassTaskDao{/**获得所有任务清单*/publicListgetAllTasks(){returnJDBCUtils.queryForList("selectid,title,statusfromtask",Task.class);}}8.6、单元测试

8.7、服务模块

pom.xml

8.8、Web项目pom.xml

目录结构:

运行结果:

8.9、Git同步到远程仓库

1、请下载、安装配置好maven,在控制台输出版本号

2、请配置本地仓库路径与远程仓库的镜像

3、请在命令行模式下新建一个maven普通项目,导入到IDEA中,运行,打包输出结果

参数pom

6、将考试的两个项目修改成Maven项目,管理所有的包,测试运行通过

7、预习Git,安装好环境,到coding.net上注册一个帐号

8、完成任务指导手册中所有的理论题

9、将考试中的两个项目合并成一个多模块的Maven项目,两个ui层,一个使用jstl一个使用纯HTML

10、熟练使用maven中常用的指令,自定义一个Maven项目,编写测试用例,部署到本地仓库并在其它项目中引用

2018-09-21

11、根据任务列表示例完成一个汽车管理系统CarSystem(车名,颜色,速度,车牌,详细描述),实现增加、修改、删除、查询功能;最终完成的项目要求同步到远程仓库;

12、完成Git中协同开发的8个场景,2人以上交叉扮演组长与组员

13、完成任务指导手册中的理论题

14、完成个人项目的功能需求,提交给学习委员

15、完成个人项目的数据库设计,提交给组长,组长给学习委员

16、补考的同学请下周二上课前完成试题,并通过学习委员的检查

THE END
1.图INSIGHT论坛INSIGHT车友会汽车之家本田论坛群聚千万车友,交流买车提车作业,维修保养细节,装饰改装案例以及本田油耗等用车内容,精彩尽在汽车之家本田论坛。https://club.autohome.com.cn/bbs/brand-14-c-723-2.html?orderby=none&qaType=-1
2.汽车之友汽车之友,您身边的汽车专家!https://www.163.com/dy/media/T1582782755152.html
3.汽车之家11.68.3下载安装汽车之家老旧历史版本下载汽车之家,每天超过千万用户访问的汽车网站~为消费者提供选车、买车、用车、换车等所有环节准确、快捷的一站式服务5亿家人与你一起使用汽车之家App。***网友为何都用汽车之家App***热点资讯专业全面 — 专业编辑团队,众多名家创作优质内容;海量用户评论交流 — 千万用户互动,人气火爆的汽车交流平台;前沿技术引领https://www.25pp.com/xiazai/280397/history_v11683/
4.最新安卓汽车之家免费下载–AppChina应用汇软件大小: 92.75MB 最后更新: 2024-11-04 最新版本: 11.68.0 文件格式: apk 应用分类: 便捷生活 使用语言: 中文 网络支持: 需要联网 系统要求: 5.0以上 汽车之家 应用介绍 百万车主成交价,每周新车特卖,十万4S店销售真人问答,汽车之家出品,13年数据积累买车必备助手 ———买车问价,就用汽车报http://m.appchina.com/app/102518
5.Vue3从入门到精通4.6 命名路由 4.7 嵌套路由 设置路由 使用嵌套路由 4.8 路由传参 query参数 params参数 4.9 路由的props配置 4.10 replace属性 4.11 编程式导航 4.12 重定向 5. Pinia Pinia 的特点 5.1、安装 Pinia 5.2、创建 Store 创建一个 store 文件 counter.ts https://blog.csdn.net/iku_n/article/details/140136183
6.yandex软件下载yandex手机版appyandex应用大全yandex软件大全为大家整理了yandex一系列的手机应用,包括yandex maps地图、yandex browser浏览器、yandex go打车软件、yandex translat翻译、yandex disk网盘、yandex mail邮箱、yandex navigator导航、yandex keyboard等,覆盖了生活的方方面面,让您无论是购物、支付、出行都非常的方便,欢迎有需要的朋友下载使用!1500http://m.downcc.com/k/yandex
7.直播App下载最新版本直播平台App大全手机直播软件哪个比较好直播平台有哪些?面对日益火爆的手机网络直播平台,相信不少用户面临丰富的选择时,反而对于良莠不齐的直播内容有些担心。直播平台排行榜为大家带来2017最新的直播平台排名,最全面的直播功能,最精彩好看的节目,最火爆的人气主播,只要你喜欢的这里全都有。欢迎喜欢直播的朋友前来下载,精彩生活从这里开始。https://www.qqtn.com/qqkey/zbptphb/
8.蚂蚁庄园今日答案最新2024支付宝蚂蚁庄园今日答案汇总蚂蚁庄园今日答案最新2024(持续更新),支付宝蚂蚁庄园是支付宝的一个公益项目,那么蚂蚁庄园今日课堂答题答案是什么呢?下面游侠小编就为玩家带来2024蚂蚁庄园答题今日答案汇总,一起来看看蚂蚁庄园今日最新答案吧。 蚂蚁庄园今日答案汇总 【11.30】 人工增雨的必备云层条件是哪个?积雨云 https://m.ali213.net/news/gl1910/371835.html
9.kubeadm方式部署Kubernetes1.19集群环境(二)51CTO博客4.6.禁用swapp分区 将fstab文件中的swap分区注释掉即可 kubernetes要求每个节点都要禁用swap设备 vim /etc/fstab #/dev/mapper/centos-swap swap swap defaults 0 0 关闭成功如下所示 free -h total used free shared buff/cache available Mem: 1.8G 340M 1.0G 12M 425M 1.3G https://blog.51cto.com/jiangxl/4803878
10.2万字干货!产品设计宝典《上瘾》全面解读!现学现用!(上瘾)书评读懂这本书,你会收获一个产品设计模型,它可以用于产品设计和诊断。当你去做一个从0到1的产品时,你可以根据上瘾模型的模板去策划构思,这样可以降低你的产品设计失败率。如果你的产品投放了很多广告,但用户活跃度不高,也无法养成习惯,你也可以用上瘾模型进行诊断。为什么人们每天都会刷朋友圈、刷抖音,而且一刷就是https://book.douban.com/review/14324839/
11.最全详解2018年苹果审核指南最新更新条款②如果我们无法理解 App 的工作方式,或者 App 内购买项目不是那么一目了然,则审核会有所延误,并可能会导致 App 被拒绝。尽管价格由您决定,但是我们不会分发要价明显过高的 App 和 App 内购买项目。对于试图以不合常理的高昂价格欺骗用户的 App,我们将予以拒绝。https://www.jianshu.com/p/76a6b1cc9dd6
12.上汽飞凡R7智联TBOX拆解分析本专栏将介绍智能汽车控制器的拆解分析,为读者呈现最新的量产控制器的参考设计及选型方案。今天为大家分享的是上汽飞凡R7的智联域控制器模块-TBOX。 上汽飞凡R7的电子架构是由零束研发的,共有智联、智算、智驾、座舱四个域控制器。智联域控即类似于传统的T-box模块。 https://www.eet-china.com/mp/a284170.html
13.河北省政府新闻办“2023年河北经济运行情况”新闻发布会文字实录刚才在通报当中提到了,全年河北全体居民人均可支配收入增长6.6%、消费支出增长9.7%,这个成绩来之不易。汽车、石油大宗商品消费拉动明显,拉动限上单位消费品零售额分别增长5.1和2.7个百分点。住宿餐饮消费较快在全国率先出台重点行业环保绩效创A标准,重点行业新增环保绩效A级企业40家,A级钢铁企业达到35http://www.hebei.gov.cn/columns/6b529089-3c22-40ef-8d24-fda72cb33bf5/202401/27/1a11d7c2-983b-4364-973b-f6857fe42ce0.html