计算机系统应用教程网站

网站首页 > 技术文章 正文

Maven技术方案最全手册 maven详细教程

btikc 2024-10-18 04:41:34 技术文章 13 ℃ 0 评论

Maven简介

Maven(翻译为"专家","内行")是跨平台的项目管理工具。作为apache组织中的一个颇为成功的开源项目,主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。无论是小型的开源类库项目,还是大型的企业级应用;无论是传统的瀑布式开发,还是流行的敏捷模式,Maven都能大显身手。

Maven能够很方便的帮你管理项目报告,生成站点,管理JAR文件,等等。

1) maven可以通过布署在网路上的maven仓库去拿你需要的jar包。

2) maven不是万能,有时会多拿包,当然这种情况很少但它会自动帮你把有依赖关系的包全拿到本地来的;

3) 由于maven是通过网络去拿 你需要的jar包的,因此你的工程发布可以不用再把几十mb的jar文件连同你的工程一起发布了,而只需要把一份“jar包使用清单”伴随着你的工程一起发布就可以了。当别人拿着你的maven工程时,它只要也装有maven也能连入internet环境,它就可以在布署时自动把工程需要用到的jar包取下来然后布署入j2ee服务器的。

4) 我们所在的环境不让员工上网,这时我们建立了自己的本地maven库,即maven私服. 把所有的jar包通过正式的手段搞到后在你所在的环境的局域网内建立一台maven服务器,把这些通过下载收集到的jar布署到我们的“私服”上去,再把工程的maven连接仓库的url指向我们本地的这台私服就行了。

项目构建

项目构建过程包括【清理项目】→【编译项目】→【测试项目】→【生成测试报告】→【打包项目】→【部署项目】这几个步骤,这六个步骤就是一个项目的完整构建过程。理想的项目构建是高度自动化,跨平台,可重用的组件,标准化的,使用maven就可以帮我们完成上述所说的项目构建过程。

依赖管理

依赖指的是jar包之间的相互依赖,比如我们搭建一个Struts2的开发框架时,光有struts2-core-2.3.16.3.jar这个jar包是不行的,struts2-core-2.3.16.3.jar还依赖其它的jar包,依赖管理指的就是使用Maven来管理项目中使用到的jar包,Maven管理的方式就是“自动下载项目所需要的jar包,统一管理jar包之间的依赖关系”。

项目信息管理POM (Project Object Model)

Maven采用了一种被称之为project object model (POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xml的文件中,通过该文件,Maven可以管理项目的整个声明周期,包括编译,构建,测试,发布,报告等等。

一个项目所有的配置都放置在 POM 文件中:定义项目的类型、名字,管理依赖关系,定制插件的行为等等。比如说,你可以配置 compiler 插件让它使用 java 1.7 来编译。

Xml 代码

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.helloworld</groupId>
<artifactId>helloworld</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>helloworld</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

在 POM 中,groupId, artifactId, packaging, version 叫作 maven 坐标,它能唯一的确定一个项目。有了 maven 坐标,我们就可以用它来指定我们的项目所依赖的其他项目,插件,或者父项目。一般 maven 坐标写成如下的格式:

groupId:artifactId:packaging:version

像我们的例子就会写成:

com.mycompany.helloworld: helloworld: jar: 1.0-SNAPSHOT

我们的 helloworld 示例很简单,但是大项目一般会分成几个子项目。在这种情况下,每个子项目就会有自己的 POM 文件,然后它们会有一个共同的父项目。这样只要构建父项目就能够构建所有的子项目了。子项目的 POM 会继承父项目的 POM。另外,所有的 POM都继承了一个 Super-POM。Super-POM 设置了一些默认值

$mvn help:effective-pom

为什么要用Maven

  • 构建:比如生成class、jar、war或者ear文件
  • 生成文档:比如生成javadoc、网站文档
  • 生成报告:比如junit测试报告
  • 生成依赖类库:生成文档,说明项目多其他软件的依赖
  • 有关SCM:SCM(Software Configuration Management),软件配置管理,比如版本控制,比如bug管理等等
  • 发布:生成供发布的分发包,比如生成Struts2的分发包,供提交给用户使用
  • 部署:比如,web应用程序,自动部署到指定的服务器上

Ant和Maven对比(忽略)

Maven 和 Ant 针对构建问题的两个不同方面。Ant 为 Java 技术开发项目提供跨平台构建任务。Maven 本身描述项目的高级方面,它从 Ant 借用了绝大多数构建任务。因此,由于 Maven 和 Ant代表两个差异很大的工具,所以接下来只说明这两个工具的等同组件之间的区别。


  

Maven

Ant

标准构建文件

project.xml 和 maven.xml
  

build.xml

特性处理顺序

${maven.home}/bin/driver.properties

${project.home}/project.properties

${project.home}/build.properties

${user.home}/build.properties

通过 -D 命令行选项定义的系统特性

最后一个定义起决定作用。

通过 -D 命令行选项定义的系统特性

由 任务装入的特性

第一个定义最先被处理。

构建规则

构建规则更为动态(类似于编程语言);它们是基于 Jelly 的可执行 XML。

构建规则或多或少是静态的,除非使用<script>任务

扩展语言
  

插件是用 Jelly(XML)编写的。

插件是用 Java 语言编写的。

构建规则可扩展性

通过定义 <preGoal> 和 <postGoal> 使构建 goal 可扩展。

构建规则不易扩展;可通过使用 <script> 任务模拟 <preGoal> 和 <postGoal> 所起的作用。

Maven本地的安装和配置

Maven安装

安装前,先检查是否正确安装JDK,maven可以运行在JDK1.4以及以上版本。

  • 本地安装:下载绿色版apache-maven-3.3.9,直接解压即可
  • 解压目录,如图:
  • 配置环境,如图:这里应该是M2_HOME
  • 在系统变量PATH中添加;%M2_HOME%\bin;
  • 检查安装情况,如图:
  • echo %M2_HOME% 用来检查环境变量M2_HOME是否指向了正确的Maven安装目录;
  • mvn –v 检查Windows是否能够找到正确的mvn执行脚本.

Maven配置

Maven的仓库只有两大类:1.本地仓库 2.远程仓库。

在远程仓库中又分成了3种:1 中央仓库 2 私服 3 其它公共库

本地仓库配置

本地仓库,顾名思义,就是Maven在本地存储构件的地方。maven的本地仓库,在安装maven后并不会创建,它是在第一次执行maven命令的时候才被创建。maven本地仓库的默认位置:无论是Windows还是Linux,在用户的目录下都有一个.m2/repository/的仓库目录,这就是Maven仓库的默认位置

  • 如何更改maven默认的本地仓库的位置:这里要引入一个新的元素:localRepository,它是存在于maven的settings.xml文件中,这个文件来源于D:\apache-maven-3.3.9\conf 下,要放在window下, Win7和Winxp还是有点不一样 , Win7 ---C:\Users\用户名\.m2 , Winxp ---C:\Documents and Settings\用户名\.m2 。
  • 修改”settings.xml” 文件,在这个文件中找到<localRepository> E:/maven</localRepository>这一行,进行修改。这一行代表了Maven的Jar包仓库的位置。work下放的都是项目所用到的jar包,每个Project都可以共用一个work。

这时候,maven的本地仓库地址就变成了 E:/maven ,注:此时配置的maven的本地仓库是属于用户范围的。

远程仓库配置

我们所在的环境不让员工上网,这时我们建立了自己的本地maven库,即maven私服. 把所有的jar包通过正式的手段搞到后在你所在的环境的局域网内建立一台maven服务器,把这些通过下载收集到的jar布署到我们的“私服”上去。

私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。我们还可以把一些无法从外部仓库下载到的构件上传到私服上。

Maven私服的特性:

1.节省自己的外网带宽:减少重复请求造成的外网带宽消耗

2.加速Maven构件:如果项目配置了很多外部远程仓库的时候,构建速度就会大大降低

3.部署第三方构件:有些构件无法从外部仓库获得的时候,我们可以把这些构件部署到内部仓库(私服)中,供内部maven项目使用

4.提高稳定性,增强控制:Internet不稳定的时候,maven构建也会变的不稳定,一些私服软件还提供了其他的功能

5.降低中央仓库的负荷:maven中央仓库被请求的数量是巨大的,配置私服也可以大大降低中央仓库的压力

当前主流的maven私服:

1.Apache的Archiva

2.JFrog的Artifactory

3.Sonatype的Nexus

目前我们用的私服为Sonatype的Nexus

中央仓库

说到远程仓库先从最核心的中央仓库开始,中央仓库是默认的远程仓库,maven在安装的时候,自带的就是中央仓库的配置,在maven的聚合与继承中我们说过,所有的maven项目都会继承超级pom,具体的说,包含了下面配置的pom我们就称之为超级pom,中央仓库包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载到。

私服

私服配置

配置远程仓库将引入新的配置元素:<repositories> <repository>

在repositories元素下,可以使用repository子元素声明一个或者多个远程仓库。该例中声明了一个id为nexus,名称为Nexus的仓库。任何一个仓库声明的id必须是唯一的,尤其需要注意的是,maven自带的中央仓库使用的id为central,如果其他的仓库声明也使用该id,就会覆盖中央仓库的配置。该配置中的url值指向了仓库的地址,一般来说,该地址都基于http协议,maven用户都可以在浏览器中打开仓库地址浏览构件。

该例配置中的releases和snapshots元素比较重要,它们用来控制Maven对于发布版构件和快照版构件的下载。该例中releases的enabled值为true,表示开启Nexus仓库的发布版本下载支持,而snapshots的enabled值为false,表示关闭Nexus仓库的快照版本的下载支持。该例中的layout元素值default表示仓库的布局是Maven2及Maven3的默认布局,而不是Maven1的布局。

对于releases和snapshots来说,除了enabled,它们还包含另外两个子元素updatePolicy和checksumPolicy:

元素updatePolicy用来配置Maven从远程仓库检查更新的频率,默认的值是daily,表示Maven每天检查一次。其他可用的值包括:never---从不检查更新;always---每次构建都检查更新;interval:X---每隔X分钟检查一次更新(X为任意整数)。

元素checksumPolicy用来配置Maven检查检验和文件的策略。当构件被部署到Maven仓库中时,会同时部署对应的校验和文件。在下载构件的时候,Maven会验证校验和文件,如果校验和验证失败,怎么办?当checksumPolicy的值为默认的warn时,Maven会在执行构建时输出警告信息,其他可用的值包括:fail---Maven遇到校验和错误就让构建失败;ignore---使用Maven完全忽略校验和错误。

我们搭建的Maven服务器地址为:http://172.172.9.222/nexus/content/groups/public/

Id:nexus

name: Nexus

远程仓库的认证

大部分远程仓库无须认证就可以访问,但有时候出于安全方面的考虑,我们需要提认证信息才能访问一些远程仓库。例如,组织内部有一个Maven仓库服务器,该服务器为每个项目都提供独立的Maven仓库,为了防止非法的仓库访问,管理员为每个仓库提供了一组用户名级密码。这时,为了能让Maven访问仓库内容,就需要配置认证信息。

配置认证信息和配置仓库信息不同,仓库信息可以直接配置在POM文件中,但是认证信息必须配置在settings.xml文件中。这是因为POM往往是被提交到代码仓库中供所有成员访问的,而settings.xml一般只放在本机。因此,settings.xml中配置认证信息更为安全。假设需要为一个id为Snapshots的仓库配置认证信息,编辑settings.xml文件见代码清单:

这里的id必须与POM中需要认证的repository元素的Id一致。

Maven使用settings.xml文件中并不显而易见的servers元素及其server子元素配置仓库认证信息。上例中,仓库的认证用户名为repo-user,认证密码为repo-pwd。这里的关键是id元素,settings.xml中server元素的id必须与POM中需要认证的repository元素的id完全一致。换句话说,正是这个Id将认证信息与仓库配置联系在了一起。

部署至远程仓库

私服的一大作用是部署第三方构件,包括组织内部生成的构件以及一些无法从外部仓库直接获取的构件。无论是日常开发中生成的构件,还是正式版本发布的构件,都需要部署到仓库中,供其他团队成员使用。

Maven除了能对项目进行编译、测试、打包之外,还能将项目生成的构建部署到仓库中。首先,需要编辑项目的pom.xml文件。配置distributionManagement元素,见代码:

distributionManagement包含repository和snapshotRepository子元素,前者表示发布版本构件的仓库,后者表示快照版本的仓库。这两个元素下都需要配置id、name和url,id为该远程仓库的唯一标识,name是为了方便人阅读,关键的url表示该仓库的地址。

往远程仓库部署构件的时候,往往需要认证。就是需要在settings.xml中创建一个server元素,其id与仓库的id匹配,并配置正确的认证信息。不论远程仓库下载构件,还是部署构件至远程仓库,当需要认证的时候,配置的方式是一样的。配置正确后,在命令行运行mvn clean deploy,Maven就会将项目构建输出的构件部署到配置对应的远程仓库,如果项目当前的版本是快照版本,则部署到快照版本仓库地址,否则就部署到发布版本仓库地址。

使用使用Eclipse构建Maven项目

进入Maven安装目录下的conf子目录中,打开settings.xml进行配置修改。

修改默认的本地仓库位置

Maven默认的本地仓库位置是当前用户工作目录下的“.m2/repository”,使用过程中这个目录里的文件会比较多,占用空间越来越大。一般建议更换到其它磁盘目录下。如下配置,就把默认的本地仓库更改到E:/maven这个目录(这个目录结构需要自己创建好)。

<localRepository> E:/maven</localRepository>

修改默认的中央仓库镜像

Maven默认的中央仓库里的文件不全。所以,都需要自行添加其它的镜像地址。在settings.xml文件中的“<mirrors>”标签里添加如下内容:

<mirrors>

<mirror>

<id>nexus</id>

<mirrorOf>*</mirrorOf>

<name>Nexus</name>

<url>http://172.172.9.222/nexus/content/groups/public/</url>

</mirror>

</mirrors>

设置eclipse插件所关联的Maven程序

依次选择Eclipse菜单栏的“Window”à“Preferences”菜单项,就会弹出如下对话框:

这个对话框左边的导航栏中展开“Maven”目录结点,并选择“Installations”子节点,选择Maven安装目录的选择对话框:如下图所示:

这里需要关联上对应的Maven安装程序。具体操作是,在右边面板中选择“Add…”按钮,会弹出如下

通过这个对话框来选择Maven的具体安装目录。选择好之后就点击“确定”按钮。如下图所示:

设置自定义的本地仓库

选择如上图对话窗口左边菜单树 “Maven”节点下的“UserSettings”子节点,它默认的配置文件是“C:\Documents and Settings\wangrz\.m2\settings.xml”, 这边需要修改为我们自定义仓库位置下的settings.xml文件。具体操作是,点击“Browse…”按钮来选择上一步骤修改的本地仓库目录下的settings.xml文件,如下图所示:

创建Maven的项目

在eclipse菜单栏中选择“File”à“News”à“Other”菜单项,就会打开如下对话窗口,在窗口中选择“Maven”节点下“Maven Project”条目,如下图所示:

点击“Next>”按钮,进入如下窗口:

再次选择“Next >”按钮,在此窗口下填写group id,artifact id,可以随便写一个,在Packaging中选择war类型,点击下一步,在以下步骤中一直next,直到最后点击finish:

转maven为web项目

创建webapp文件夹

项目右键选择项目,在此界面右边导航栏选中 Project Facets,点击超链接Convert Faceted from,在Configuration中选择custom,在下方的Project Facet的Dynamic Web Module中选择3.0版本在java中选择1.7

接下来点击右边面板的Runtime面板

在项目属性面板中的作部导航栏选择Deployment Assembly选项,在右边Web Deployment Assembly如果看到以下的图示,那么配置就完成了

这里解释一下以上文件夹

src/main/java

该文件夹是存放java源码的,发布项目时会将该文件夹下的class文件复制到WEB-INF/classes目录下

src/main/resources

该文件夹一般放置配置文件,如xml,properties文件等,其实也可以放置java文件,只是一种约定罢了,发布项目时

该文件夹的文件也会复制到WEB-INF/class中

至于test,有些类似,只不过这些是测试代码,用过maven的应该会知道这一点

src/main/webapp

maven中约定是把该文件夹当成是普通web项目中的WebRoot目录,看看右边的deploy path,发布项目时

是发布到根目录/了。该文件夹在建成的maven web项目中,在其内尚没有WEB-INF/classes,WEB-INF/lib文件夹

需要手工建立

注意:有时候由于某种原因,你打开的以上视图可能是下面这样的,

其实,这样也是可以运行项目,调试项目的,但是,如果你运行该项目的pom.xml文件时就会报错,为什么呢,

因为maven会把src/main/webapp文件当成是普通web项目中的WebRoot,而该你的配置里面(上图)却

没有配置,故而会报错。

怎么办呢,分2步

1、选中 WebContent,remove掉它

2、新建一个,Source文件夹为src/main/webapp,deploy path为 /

点击apply,ok即可。

最后还必须将maven库映射到WEB-INF/lib下,具体操作如下,点击add按钮,进入下图

选择java build path entries,点击next,进入下图

选择Maven Dependencies,点击finish,最终如下图

文件夹解释与转换

src/main/java:

该文件夹是存放java源码的,发布项目时会将该文件夹下的class文件复制到WEB-INF/classes目录下

src/main/resources:

该文件夹一般放置配置文件,如xml,properties文件等,其实也可以放置java文件,只是一种约定罢了,发布项目时,该文件夹的文件也会复制到WEB-INF/class中

至于test,有些类似,只不过这些是测试代码,用过maven的应该会知道这一点

src/main/webapp

maven中约定是把该文件夹当成是普通web项目中的WebRoot目录,看看右边的deploy path,发布项目时是发布到根目录/了。该文件夹在建成的maven web项目中,在其内尚没有WEB-INF/classes,WEB-INF/lib文件夹

需要手工建立

注意:有时候由于某种原因,你打开的以上视图可能是下面这样的,

其实,这样也是可以运行项目,调试项目的,但是,如果你运行该项目的pom.xml文件时就会报错,为什么呢,

因为maven会把src/main/webapp文件当成是普通web项目中的WebRoot,而该你的配置里面(上图)却没有配置,故而会报错。

怎么办呢,分2步

1、选中 WebContent,remove掉它

2、新建一个,Source文件夹为src/main/webapp,deploy path为 /点击apply,ok即可。

最后还必须将maven库映射到WEB-INF/lib下,具体操作如下,点击add按钮,进入下图

选择java build path entries,点击next,进入下图

选择Maven Dependencies,点击finish,最终如下图

如果不把Maven Dependencies映射到WEB-INF/lib,则在服务端如servlet中用到maven中的库时,则会提示找不到类(虽然你在编写代码时没有红xx,但是运行程序时却会找不到类)

Maven操作

添加依赖

右键项目依次选择maven—add dependency

输入关键信息,enter查询会列出所有相关jar信息,选择需要的版本ok即可添加

添加成功后再pom.xml中会有信息展示

添加插件

右键项目依次选择maven—add plugin

输入关键信息enter键会列出相关插件信息

Ok后pom.xml中会显示

插件运行

如果Eclipse 安装了Maven插件,选 择pom.xml文件,击右键——>选择 Run As——> Maven build 。

如果是第一次运行,会弹出下面对话框。在Goals框加加入以下命令: tomcat:run

常用Goal

命令

命令

描述

描述

tomcat:deploy

tomcat:deploy

部署一个web war包

部署一个web war包

tomcat:reload

tomcat:reload

重新加载web war包

重新加载web war包

tomcat:start

tomcat:start

Maven常用命令

创建Maven的普通java项目

mvn archetype:create

-DgroupId=packageName

-DartifactId=projectName

创建Maven的Web项目

mvn archetype:create

-DgroupId=packageName

-DartifactId=webappName

-DarchetypeArtifactId=maven-archetype-webapp

编译源代码

mvn compile

编译测试代码

mvn test-compile

运行测试

mvn test

产生site

mvn site

打包

mvn package

在本地Repository中安装jar

mvn install

清除产生的项目

mvn clean

生成eclipse项目

mvn eclipse:eclipse

生成idea项目

mvn idea:idea

组合使用goal命令,如只打包不测试

mvn -Dtest package

编译测试的内容

mvn test-compile

只打jar包

mvn jar:jar

只测试而不编译,也不测试编译

mvn test -skipping compile -skipping test-compile ( -skipping 的灵活运用,当然也可以用于其他组合命令)

清除eclipse的一些系统设置

mvn eclipse:clean

ps:

一般使用情况是这样,首先通过cvs或svn下载代码到本机,然后执行mvn eclipse:eclipse生成ecllipse项目文件,然后导入到eclipse就行了;修改代码后执行mvn compile或mvn test检验,也可以下载eclipse的maven插件。

常见问题

报错:-Dmaven.multiModuleProjectDirectory

  1. 在build clean install maven项目的时候报错:-Dmaven.multiModuleProjectDirectory system propery is not set. Check$M2_HOME

解决:配置环境变量M2_HOME 指向mven目录,并在path中添加

在eclipse中查看jdk环境

修改jdk环境,添加-Dmaven.multiModuleProjectDirectory=$M2_HOME

内存溢出问题

Eclipse.ini文件修改-Xmx1024m,设置最大堆内存-Xmx为2048m,设置初始化堆内存为512m

依赖找不到问题。

到nexus上下载下来jar,然后放到自己的仓库中

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表