maven初识

来源:互联网 发布:网络视频编码器 编辑:程序博客网 时间:2024/05/17 00:01
一、什么是Maven
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。不恰当的来说,Maven是用来帮助我们管理项目中的依赖的(这应该是Maven的作用之一)。比如说我们要搭建一个structs2+spring+mybatis架构的web项目,首先我们要做的一件事情就是创建工程,然后就是导入相关的jar包,导入jar包的过程和管理jar是一个繁琐而且麻烦的事情,所以我们可以使用Maven来帮助我们管理这些jar。

二、在windows上如何安装maven
(1)从maven官网下载对应版本的maven,然后解压;
(2)配置maven的环境变量:
M2_HOME=D:\文档\资料\jar包\maven\apache-maven-3.3.9
PATH=%M2_HOME%\bin;
(3)打开dos界面,然后输入mvn -v命令,回车,如果出现 maven的相关信息就说明配置成功了:


三. maven项目的目录结构
src
main
java
package
test
java
package
resources

注:
src/main/java是我们的源代码存放目录;
src/test/java是我们的测试代码存放目录;
resources是我们的资源文件存放目录。

四、常用的构建命令
mvn -v :查看maven版本
mvn compile:编译我们的maven项目,只编译我们的src下的main目录下的源文件,编译好的字节码文件放在target目录下
mvn test:测试,编译(src目录下的test目录下的源文件)并执行我们的测试代码
mvn package:打包我们的项目(将我们的项目打包成一个jar或者其他格式,并放在target目录下)

mvn clean:删除target目录(target中是编译之后的字节码文件和报告)
mvn install:安装jar包到本地仓库中

五、自动创建Maven目录框架
我们可以自己根据Maven项目的目录结构去创建maven项目框架,但是这很不方便,maven提供了一个archetype插件——用来创建符合maven规定的目录骨架。

两种方式:
首先,都得手动创建项目根目录,然后在dos界面进入项目根目录下,输入如下命令:
  • 方式一、 mvn archetype:generate:按照提示进行选择填写相关信息
  • 方式二、 mvn archetype:generate -DgroupId=组织名(一般为公司网址的反写+项目名)
-DartifactId=项目名-模块名
-Dversion=版本号
-Dpackage=代码所存在的包名

注意:第二种方式与第一种方式不的是一次性创建完成。

六、maven中的坐标和仓库
坐标:
<groupId>com.wangyi.maven</groupId>
<artifactId>maven-model</artifactId>
<version>0.0.1SNAPSHOT</version>
仓库:本地仓库和远程仓库
maven项目的依赖会先去本地仓库中去找是否有该依赖的jar,如果本地仓库中没有,则去远程仓库去找对应的依赖。maven有一个全球的远程仓库(中央仓库),这里面基本上包含了所有的开源的项目的jar,这个全球性的仓库的位置可以在maven的安装目录下的lib包下的maven-model-builder-3.5.2.jar中找到,如:maven-model-builder-3.5.2.jar\org\apache\maven\model\pom-4.0.0.xml中


镜像仓库:由于全球性的maven中央仓库是在国外,有时候因为网络原因访问会很慢,在国内也有这样的中央仓库,这些就叫做镜像仓库。
注意:本地仓库和镜像仓库的位置都是可以在settings.xml中进行修改的。

修改镜像仓库:
打开maven安装路径下的conf/settings.xml,然后找到<mirrors>这一行,将其给的一个示例复制出来配置为国内的镜像仓库即可:


maven默认情况下,从远程仓库中下载构件或者是mvn install命令,都会将jar包放到当前用户的目录中的,如:C:\Users\14907\.m2\repository

更改本地仓库的默认路径:
修改maven安装目录下的conf目录下的settings.xml文件,找到<localRepository>/path/to/local/repo</localRepository>这一行,然后复制出来,把值改为你要更改的位置,如:


最后把修改后的settings.xml文件复制到你刚设置的目录下,这样以后即使更新maven版本,也不需要修改配置文件了。


七、在eclipse中安装maven插件和创建maven项目
安装maven插件:直接将maven文件夹复制到eclipse安装目录下的dropins目录下,然后重启eclipse即可.

注意:安装之后需要进行如下几点配置:
1、由于maven的一些操作需要jdk的支持,而eclipse是在jre上运行的,所以需要将eclipse关联的jre设置为jdk自带的jre;
2、 设置installations中的maven为自己的maven,而不是eclipse自带的;

3、 设置user settings为自定义的仓库(可以使用默认的)

4、右击pom.xml文件,然后点击run as,在Goals里面输入compile,点击run,如果控制台没有任何输出,这个时候给jdk配置一个参数(-Dmaven.multiModuleProjectDirectory=$MAVEN_HOME)即可,如下:


创建maven项目(非web项目):new->maven project->选择quickstart 模板,输入必要参数
编译:run as ->maven build ->选择或输入compile命令
打包:run as ->maven build ->选择或输入package命令

八、maven的生命周期及插件
1、maven的生命周期:
clean:清理项目
default:构建项目(最核心)
site:生成项目站点

2、插件:
maven提供了很多插件,如下:


以source插件为例,想要在执行package命令之后也给我们将源代码打成jar包,需要在pom.xml中进行如下配置:
<build>
<plugins>
<plugin>
<!-- source插件的位置信息 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<!-- 定义在执行package命令时,将源代码打包成jar文件 -->
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

九、pom.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">
<!-- 指定了当前pom的版本,是固定的 -->
<modelVersion>4.0.0</modelVersion>

<!-- 坐标信息 -->
<!-- 主项目的标识(项目的包名),用来标识maven属于哪个主项目,一般由公司网址的反写+项目名组成 -->
<groupId>com.tydic.hi</groupId>
<!-- 模块的标识,一般由项目名+模块名组成 -->
<artifactId>hi</artifactId>
<!-- 版本号,一般由三个数字加上版本类型组成:
第一个数字表示大版本号,
第二个数字表示分支版本号,
第三个数字表示小版本号,
版本类型:
snapshot 快照版
alpha 内部测试版
beta 公测版
Release 稳定版
GA 正式发布
-->
<version>0.0.1-SNAPSHOT</version>
<!-- 表示maven项目打包的方式,默认为jar,还可以是war zip pom -->
<packaging>jar</packaging>
<!-- 项目的描述名 -->
<name>hi</name>
<!-- 项目地址 -->
<url>http://maven.apache.org</url>
<!-- 项目描述信息 -->
<description></description>
<!-- 开发人员列表 -->
<developers></developers>
<!-- 许可证信息 -->
<licenses></licenses>
<!-- 组织信息 -->
<organization></organization>
<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>
<!-- 设置依赖是否可选,值为true或者false,默认为false,表示子项目默认继承依赖,如果为true,表示不继承,如果需要必须自己引入该依赖 -->
<optional></optional>
<!-- 排除依赖传递列表 -->
<exclusions>
<exclusion>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- 依赖的管理,在该元素中定义的依赖并不会被运行,也就是说不会被引入到实际的依赖中。这个元素主要用于父模块中,比如junit被多个模块依赖,可以将junit抽象出来放到父模块中的dependencyManagement元素中,然后让子模块去继承父模块 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 对构件的行为做一定的支持 -->
<build>
<!-- 插件列表 -->
<plugins>
<plugin>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</plugin>
</plugins>
</build>
<!-- 子模块对于父模块的继承 -->
<parent>
</parent>
<!-- 聚合多个maven的项目 -->
<modules>
<module></module>
</modules>
</project>

注意:maven项目与实际的项目不是一一对应的关系,maven项目体现的是一个模块化的概念,因此一个实际项目往往会划分为多个模块。

十、依赖范围
<scope></scope>
注意:
在开发的过程中,如果要用到某个框架,就要将框架引用到项目的classpath的路径中,这样我们就可以使用该框架给我们封装好的方法。maven给我们提供了3种classpath:编译 测试 运行,依赖范围就是用来控制与3个classpath之间的关系的。
scope的值有6个:
compile:默认的依赖范围,编译、测试、运行都有效;
provided:在编译和测试时有效;
runtime:在测试和运行时有效;
test:只在测试有效;
system:和有provided效,与本地系统相关联,可移植性差;
import:导入的范围,它只使用在dependencyManagement中,表示从其他的pom中导入dependecy的配置。

十一、依赖传递
如果a依赖b,b依赖c,在maven项目中,依赖是传递的,所以a也就依赖c。例:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- hongxin.shanji依赖hongxing.nage,引入依赖 -->
<dependency>
<groupId>com.hongxing</groupId>
<artifactId>hongxing.nage</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 本来依赖是有传递性的,hongxing.shanji依赖hongxing.nage,hongxing.nage依赖hongxing.bige,所以hongxing.shanji就也依赖hongxing.bige.但是我们可以使用下面标签来排除依赖,下面将排除hongxing.shanji对hongxing.bige的依赖 -->
<exclusions>
<exclusion>
<groupId>com.hongxing</groupId>
<artifactId>hongxing.bige</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

注意:
1.如果某个maven项目依赖哪个项目,就在<dependencies><dependency></dependency>
</dependencies>中加入该依赖项目的坐标即可,但是如果因为依赖传递的特性导致了不想要的依赖,就在<dependencies><dependency></dependency></dependencies>标签中使用标签<exclusions><exclusion></exclusion></exclusions>来加入要排除的依赖的坐标即可。
2.maven项目在新建项目的时候,默认使用的jdk是jdk1.5,如果想要更改为自己使用的jdk版本,可以右击JRE System Library,选择properties,然后在Execution environment中选择你的jdk版本即可。但是这种方式只能使该项目的jdk版本为你选择的jdk版本,还可以采用修改settings.xml文件的方式一劳永逸,在<profiles></profiles>标签中加入以下代码即可:
<profile>
<id>jdk-1.7</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.7</jdk>
</activation>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
</properties>
</profile>

十二、依赖冲突
两个原则:
1. 短路有先:如下(“->”表示依赖于):则选择短的A-D-X2.0,即A依赖X2.0版本;
A->B->C->X2.5
A->D->X2.0
2.先声明先优先:如果路径长度相同,则谁先声明,先解析谁。
如:A依赖X2.0,B依赖X2.5,而C依赖A和B,如果在C的依赖中,A写在B前面,则C依赖X2.0,反之,C依赖X2.5.

十三、聚合和继承
聚合:如果要将多个maven项目install到本地仓库中,可以使用
<modules>
<module>../hongxing.nage</module>
<module>../hongxing.bige</module>
<module>../hongxin.shanji</module>
</modules>
标签一次性将所有<module><module>中的项目install到本地仓库中去。

继承:如果多个maven项目都要使用同一个框架,就可以新建一个maven项目,然后在该项目中将要被多个maven项目使用的框架放在标签
<dependencyManagement></dependencyManagement>中:

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>3.8.1</junit.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
标签中,最后让其他maven项目使用<parent></parent>标签来继承新建的这个maven项目即可。
<!-- 继承hongxing-parent的依赖 -->
<parent>
<groupId>com.hongxing</groupId>
<artifactId>hongxing-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>

注意:
1、使用聚合的时候,要新建一个maven项目,然后将新建的这个maven项目的打包方式改为pom,即<packaging>pom</packaging>。
2、在<dependencyManagement></dependencyManagement>中写的依赖并不会在该项目中运行。

十四、使用maven新建Web项目
第一步:new->other->maven project->选择maven-archetype-webapp,然后输入相关信息,点击finish;
第二步:给pom.xml添加servlet的依赖,如下:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<!-- 只在编译和测试时运行 -->
<scope>provided</scope>
</dependency>
第三步:给新建的项目新建src/main/java和src/test/java目录,如果在Project Explore视图中不能够创建的话,就切换到Navigator视图中去创建即可。如果在创建这两个source folder时,提示已经存在,可能的原因是build path中已经存在,可以先删除再重建或者是直接新建普通目录;
第四步:将新建的maven项目修改为web项目,右击项目名,选择properties,然后点击Project Facets,勾选上Dynamic Web Module,最后点击Apply和Ok;
第五步:修改一下部署项目时的配置,右击项目名,选择propertis,然后点击Deployment Assembly,最后将其中的test资源给remove掉即可。

以上五步就已经将web项目创建成功了,现在使用jetty容器或者tomcat容器来启动项目,启动之后就可以直接在浏览器中访问了:
<build>
<finalName>webdemo</finalName>
<plugins>
<plugin>
<!-- <groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>7.5.1.v20110908</version> -->
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<!-- 在打包成功后使用jetty:run或者tomcat:run来运行jetty或tomcat服务 -->
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

当jetty作为容器时:http://localhost:8080
当tomcat作为容器时:http://localhost:8080/webdemo