Maven知识整理

一、概念:

Maven是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

1、项目构建流程:

Maven知识整理

2、Maven项目目录:

目录

说明

src/main/java

存放项目的java文件

src/main/resources

存放项目的资源文件,如spring,hibernate的配置文件。

src/test/java

存放所有的测试的java文件。

src/test/resources

存放测试用的资源文件。

target

项目输出位置。

pom.xml

对象模型配置文件

二、仓库:

Maven的仓库三种:本地仓库、*仓库、远程仓库;

(一)  本地仓库:

本地仓库是指 maven 下载了插件或者 jar 文件后存放在本地机器上的拷贝。在 Linux 上,它的位置在 ~/.m2/repository,在 Windows XP 上,在 C:\Documents and Settings\username\.m2\repository ,在 Windows 7 上,在 C:\Users\username\.m2\repository。当 maven 查找需要的 jar 文件时,它会先在本地仓库中寻找,只有在找不到的情况下,才会去远程库中找。

可以在%MAVEN_HOME%/conf/settings.xml中设置localRepository的值来修改本地仓库路径

运行 mvn install 可以把我们的项目安装到本地库;

(二) *仓库:

Maven的*仓库由Maven社区提供,默认地址是http://repo1.maven.org/maven2,所有不在本地仓库中的依赖都会去这个*仓库查找。然后Maven会将这些依赖下载到你的本地仓库。访问*仓库不需要做额外的配置。

(三) 远程仓库:

远程仓库一般用于放置组织内部的项目,该项目由多个项目共享;

远程仓库是位于web服务器上的一个仓库,Maven可以从该仓库下载依赖,就像从*仓库下载依赖一样。远程仓库可以位于Internet上的任何地方,也可以是位于本地网络中。

远程仓库不能被外部访问,因此不能放在公开的*仓库下,而应该放到内部的远程仓库中。

远程仓库中的依赖也会被Maven下载到本地仓库中。

可以在pom文件里配置远程仓库。将以下的xml片段放到属性之后:

 <repositories>
  <repository>
    <id>jenkov.code</id>
    <url>http://maven.jenkov.com/maven2/lib</url>
  </repository>
</repositories>

三、安装:

1、JDK的安装;

2、在Apache的官网上http://maven.apache.org/download.cgi下载最新版本的Binary zip archive包并解压到硬盘上的某个路径下;

3、配置环境变量:

a)   添加环境变量M2_HOME,值为maven包的路径;

b)   在环境变量PATH里面添加maven的bin的路径;

4、测试安装是否成功:

在cmd命令行窗口下输入:mvn –version,如果显示出maven的版本号,则说明安装成功;

5、Eclipse配置:

a)   配置maven的安装路径:

Maven知识整理

在上图中点击“Add”按钮,然后Maven的路径,确定后就会在列表中显示;

b)   配置maven 本地库的路径:

Maven知识整理

在上图中点击“Browser”按钮,选择maven路径下的settings.xml文件,settings.xml中配置的localRepository项的值就会显示在下面;

c)   运行参数配置:

Maven知识整理

选择jdk项,点击“编辑”按钮,在下面的缺省VM参数里面输入:

-Dmaven.multiModuleProjectDirectory=$M2_HOME

四、常用命令:

命令

说明

mvn archetype:create

创建Maven项目

mvn compile

编译源代码

mvn deploy

发布项目

mvn test-compile

编译测试源代码

mvn test

运行应用程序中的单元测试

mvn site

生成项目相关信息的网站

mvn clean

清除项目目录中的生成结果

mvn package

根据项目生成的jar

mvn install

在本地Repository中安装jar

mvn eclipse:eclipse

生成eclipse项目文件

mvn jetty:run

启动jetty服务

mvn tomcat:run

启动tomcat服务

mvn clean package -Dmaven.test.skip=true

清除以前的包后重新打包,跳过测试类

五、生命周期:

1、    Maven有三个内嵌的生命周期:clean是删除target目录中之前生成的.class和.jar等文件;default是默认生命周期,负责项目的编译和打包; site关注的是为项目生成文档,实际上site可以为项目生成一个网页式的文档。

2、    每一个生命周期被分为一系列的构建阶段,构建阶段又被分为一系列的构建目标。因此,整个构建过程由一系列的生命周期、构建阶段和构建目标组成。

3、    你可以执行一个生命周期,如clean或site,一个构建阶段,如default生命期的install,或者一个构建目标,如dependency:copy-dependencies。注意:你不能直接执行default生命期,你需要指定default生命期中的一个构建阶段或者构建目标。

4、    将构建阶段的名称作为参数传给mvn命令,就是执行该构建阶段,如:mvn package。

(一) Clean清理项目:

a)   pre-clean 执行清理前的工作

b)   clean 清理上一次构建生成的所有文件

c)   post-clean 执行清理后的文件

(二) Default构建项目:

d)   compile 编译项目中的源代码;

e)   test 使用合适的单元测试框架进行测试,这些测试代码不会被打包或部署;

f)   test-compile 将需要测试的源代码编译到路径,一般是编译src/test/java目录下的java文件至目标输出的测试classpath目录中;

g)   package 接受编译好的代码,打包成可发布的格式,如JAR;

h)   install 将包安装到本地仓库,给其他本地引用提供依赖;

(三) Site生成项目站点:

i)   pre-site 在生成项目站点前要完成的工作;

j)   site 生成项目的站点文档;

k)   post-site 在生成项目站点后要完成的工作;

l)   site-deploy 发布生成的站点到服务器上;

六、新建maven项目:

1、新建maven工程:

Maven知识整理

2、选择工程类型:

Maven知识整理

3、输入工程信息:

Maven知识整理

4、运行项目:

单击右键项目"run as"--->maven build,在Navigator视图下可以看到target目录下有文件了。

Maven知识整理

注意:如果运行时提示“No goals have been specified for this build…………”,则需要打开运行配置窗口,然后在Goals中输入“compile”就行:

七、POM文件:

属性名

说明

modelVersion

表示正在使用的pom模型版本

groupId

群组ID: 公司域名反写

artifactId

项目ID: 一个公司只有一个域名,但是可以有多个项目

version

版本号: 用于描述开发过程的阶段性标识

project.build.sourceEncoding

默认字符集

dependencies

依赖管理

dependency

具体的依赖项

parent

一个pom可以继承自父pom,它可以继承父pom的dependencies,要想让一个pom继承另一个pom,可以使用parent标签来声明父pom,然后在parent标签里面包含groupId, artifactId, version, relativePath属性。

如果子pom和父pom有相同的内容,子pom中的值会覆盖父pom中的值

dependencyManagement

只是声明依赖,并不实现引入

plugins

引入插件

pluginManagement

表示插件声明,Maven不会加载该插件

properties

声明定义一个属性,而要使用这个属性时可以使用“${PropName}”

1、dependencyManagement与dependencies的区别:

dependencies:所有声明在父项目中 dependencies 里的依赖都会被子项目自动引入,并默认被所有的子项目继承。即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)

dependencyManagement :只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且 version 和 scope 都读取自父 pom; 另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

比如如下配置:

首先在父POM中定义:

 <properties>
<javaee-api.version>1.0-SNAPSHOT</javaee-api.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>${javaee-api.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

接着在子POM中定义如下:

 <parent>
<artifactId>parent</artifactId>
<groupId>com.zhisheng</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
</dependency>
</dependencies>

2、plugins与dependencyManagement的区别:

pluginManagement是表示插件声明,即你在项目中的pluginManagement下声明了插件,Maven不会加载该插件,pluginManagement声明可以被继承。pluginManagement一般是用来在父POM中定义,提供给子POM使用,子POM也可以覆盖这个定义,而且你在父POM中定义了版本之后,子模块中直接应用groupId和artifactId,而不用指定版本,同时也方便统一管理;而在父POM中的pluginManagement并不会介入到Maven的生命周期。pluginManagement主要是为了统一管理插件,确保所有子POM使用的插件版本保持一致,类似dependencies和dependencyManagement。

Plugins:就是直接引入一个plugin,而且可以绑定到Maven相关的生命周期上。

八、依赖管理:

1、假设你的项目依赖于一个库,而这个库又依赖于其他库。你不必自己去找出所有这些依赖,你只需要加上你直接依赖的库,Maven会隐式的把这些库间接依赖的库也加入到你的项目中。

2、传递性依赖的嵌套深度没有任何限制,只是在出现循环依赖时会报错。

3、“短路径优先”意味着项目依赖关系树中路径最短的版本会被使用。例如,假设A、B、C之间的依赖关系是A->B->C->D(2.0)和A->E->(D1.0),那么D(1.0)会被使用,因为A通过E到D的路径更短。但如果你想要强制使用D(2.0),那你也可以在A中显式声明对D(2.0)的依赖。

4、依赖范围 – 你可以指定只在当前编译范围内包含合适的依赖。

  a)   Compile:这是默认范围。如果没有指定,就会使用该依赖范围。编译依赖对项目所有的classpath都可用。此外,编译依赖会传递到依赖的项目。

  b)   Provided:和compile范围很类似,但provided范围表明你希望由JDK或者某个容器提供运行时依赖。例如,当使用Java EE构建一个web应用时,你会设置对Servlet API和相关的Java EE APIs的依赖范围为provided,因为web容器提供了运行时的依赖。provided依赖只对编译和测试classpath有效,并且不能传递。

  c)   runtime:runtime范围表明编译时不需要依赖,而只在运行时依赖。此依赖范围对运行和测试classpath有效,对编译classpath无效。

  d)   test:test范围表明使用此依赖范围的依赖,只在编译测试代码和运行测试的时候需要,应用的正常运行不需要此类依赖。

  e)   system:系统范围与provided类似,不过你必须显式指定一个本地系统路径的JAR,此类依赖应该一直有效,Maven也不会去仓库中寻找它。

  f)   import(Maven2.0.9及以上):import范围只适用于pom文件中的部分。表明指定的POM必须使用部分的依赖。因为依赖已经被替换,所以使用import范围的依赖并不影响依赖传递。

5、排除依赖 – 如果项目X依赖于项目Y,项目Y又依赖项目Z,项目X的所有者可以使用”exclusion”元素来显式排除项目Z。

6、可选依赖 – 如果项目Y依赖项目Z,项目Y的所有者可以使用”optional”元素来指定项目Z作为X的可选依赖。那么当项目X依赖项目Y时,X只依赖Y并不依赖Y的可选依赖Z。项目X的所有者也可以根据自己的意愿显式指定X对Z的依赖。(你可以把可选依赖理解为默认排除)。

(一) 项目依赖:

项目A依赖项目B,项目B依赖项目C.众多的项目形成一个有向无环图(DAG),使用maven,就可以自动推导出项目所依赖的全部jar包。

在pom.xml中进行如下配置:

 <dependencies>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>

(二) 外部依赖:

有时只有一个jar包而没有它的groupId和artifactId,并且三种maven仓库中都没有这个jar包项目,但当前项目依赖这个jar包,这种依赖叫做外部依赖。

有两个方法解决:

1、在每个maven项目的pom.xml文件中如下配置:

 <dependency>
<groupId>mydependency</groupId>
<artifactId>mydependency</artifactId>
<scope>system</scope>
<version>1.0</version>
<systemPath>${basedir}\mydependency.jar</systemPath>
</dependency>

2、方法一太过麻烦,可以将第三方jar包安装到本地maven仓库中去:

mvn install:install-file -Dfile=xxx -DgroupId=xxx -DartifactId=xxx -Dversion=xxx -Dpackaging=xxx

其中packaging是打包类型,可以取值war,jar等。

如果第三方jar包有相应的pom.xml,则不必提供groupId,artifactId等信息,因为它们都在pom.xml里面写着呢.可以使用如下命令:

mvn install:install-file -Dfile=xxx -DpomFile=xxx

(三) 快照依赖:

快照依赖指的是那些还在开发中的依赖(jar包)。与其经常地更新版本号来获取最新版本,不如你直接依赖项目的快照版本。快照版本的每一个build版本都会被下载到本地仓库,即使该快照版本已经在本地仓库了。总是下载快照依赖可以确保本地仓库中的每一个build版本都是最新的。

在pom文件的最开头的版本号后追加-SNAPSHOT,则告诉Maven你的项目是一个快照版本。如:

<version>1.0-SNAPSHOT</version>

在配置依赖时,在版本号后追加-SNAPSHOT表明依赖的是一个快照版本。

九、Maven工程类型:

Maven工程类型有三种:

1、WAR包工程;

2、JAR包工程;

3、POM工程;

工程之间的关系:

1、依赖:通过在 dependencies 元素下添加 dependency 子元素,可以声明一个或多个依赖。

依赖是具有传递性的。

2、聚合:一个项目往往是由多个 project 构成的,在进行构建时,我们当然不想针对多个 project 分别执行多次构建命令,这样极容易产生遗漏也会大大降低效率。Maven的聚合功能可以通过一个父模块将所有的要构建模块整合起来,将父模块的打包类型声明为 POM,通过 <modules> 将各模块集中到父 POM 中。配置如下:

 <modules>
<module>../com.dugeng.project1</module>
<module>../com.dugeng.project2</module>
</modules>

父类型的模块,不需要有源代码和资源文件,也就是说,没有 src/main/java 和 src/test/java 目录。Maven 会首先解析聚合模块的 POM 文件,分析要构建的模块,并通过各模块的依赖关系计算出模块的执行顺序,根据这个潜在的关系依次构建模块。将各子模块聚合到父模块中后,我们就可以对父模块进行一次构建命令来完成全部模块的构建。

3、继承:通过构建父模块将子模块共用的依赖,插件等进行统一声明。

例如将 com.dugeng.parent 这个模块声明为 project1 和 project2 的父模块,那么我们在 project1 和 2 中用如下代码声明父子关系:

 <parent>
<groupId>com.dugeng.mavenproject</groupId>
<artifactId>com.dugeng.parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../com.dugeng.parent/pom.xml</relativePath>
</parent>

由于父模块只是用来声明一些可共用的配置和插件信息,所以它也像聚合模块一样只需要包括一个 POM 文件,其它的项目文件如 src/main/java 是不需要的。

父工程应该是一个POM工程;

十、学习资源:

http://www.yiibai.com/maven/

上一篇:【转】MFC 自定义edit 限制输入十六进制内容 响应复制粘贴全选剪切的功能


下一篇:MFC原理第一讲.MFC的本质.以及手工编写MFC的程序