您的位置:首页 > 其它

对maven的理解

2017-01-24 00:00 351 查看
从知道maven开始,就是一直苦于怎么构建maven工程,对maven的理解一直都是抽象的理解,原因可能是因为它太智能了吧,可以通过配置直接从远程仓库中下载jar包。下面准备整理下这几天对maven的理解。

一、为什么要用maven?

当工程越来越大,开发团队的扩大已经工程的拆分,对jar的依赖变得的很麻烦,jar包版本冲突等问题变成了一个让人头疼的问题。我们通过maven可以完成对jar包的统一管理,工程依赖可以通过maven继承和聚合的方式完成jar包的依赖关系。我们还可以用maven来完成【清理项目】→【编译项目】→【测试项目】→【生成测试报告】→【打包项目】→【部署项目】一条龙工程管理,是开发后的项目很轻松的进行部署。

二、maven工程的约定目录

|----src
| |----main
| | |----java ——存放项目的.java文件
| | |----resources ——存放项目资源文件,如spring, hibernate配置文件
| |----test
| | |----java ——存放所有测试.java文件,如JUnit测试类
| | |----resources ——存放项目资源文件,如spring, hibernate配置文件
|----target ——项目输出位置
|----pom.xml ----用于标识该项目是一个Maven项目

三、如何安装maven?

首先下载maven工具,自己可以去官网下载(和tomcat差不多)。然后像jdk一样配置环境变量。



然后在cmd命令行上输入mvn -v查看是否配置成功。。。

四、了解下maven的模型



1、本地仓库:

当我们在工程的pom.xml文件中配置jar依赖的时候,maven首相会在本地仓库中查找该jar包。

本地仓库的默认位置:

C:\Users\Administrator\.m2\repository

2、私服:

这个是要配置的,也可以不配置。当公司需要对不同项目的jar包进行维护时,可以配置自己私服。

当配置了私服的时候,工程中所依赖的jar包不在本地仓库,则会去私服中下载,并且保存到本地仓库。

3、远程仓库:

Maven默认是使用米国的远程仓库,下载速度非常的慢(因为要翻墙)。所以建议使用阿里云或者开源中国的镜像。可以体验飞一般的速度。

配置:

在maven的工具中的conf文件下,修改setting.xml文件中的配置。找到mirrors节点,在该节点下配置:

<!--使用阿里云镜像-->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>

这样本地仓库中没有的jar包就会去阿里云的镜像中下载了。

五、集成myeclipse开发

略去简单的配置(在myeclipse中配置,直接上操作)



用蓝笔画的是建立maven的普通java工程,用红笔画的是建立maven的web工程。

使用web工程的时候,要记得依赖servlet的jar包。



这里填写groupId,和artifactId,以及版本号。

这里介绍下这些名称:

Maven坐标主要组成

groupId:定义maven的项目,可以用包名

artifactId:定义项目中的一个模块,一般都是工程名

version:版本



这里缺少了resource文件夹,因此,需要自己在main和test目录下自行添加src的resource文件夹。

点开pom文件,发现有个junit的jar包依赖,然后发下maven dependencies下有junit的jar包。但我们删除pom中的这个依赖时,maven dependencies文件下的junit的jar包会消失,说明我的maven已经起作用了。

六、dependency依赖中scope范围

1.compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效。

2.test:测试依赖范围。只对于测试classpath有效,只对测试代码有效

3.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api,打包的时候这个包不会打进去

4.runtime:运行时提供。例如:jdbc驱动

Compile、runtime打包会打进去,test、provided打包不会打进去

七、maven命令:

Mvn compile

Mvn test

Mvn package

一条龙服务,包括编译、测试、打包。但是并没有把包同步到仓库

Mvn install

一条龙服务,包括编译、测试、打包。并且把包同步到仓库

Mvn clean

清楚target文件,并将仓库中的jar包移除。

八、工程依赖

在myeclipse中再建一个maven工程test2,将maventest打成jar包,在本地仓库可以找到对应的jar包。然后用在test2的pom文件中进行依赖配置,可观察到,test2中有maventest的jar包。

随即带来了关于jar冲突的问题,下面是jar包冲突的解决方式:

依赖冲突解决:

1.路径最近者优先 CàBàA,C依赖B,B依赖A,会先用B的jar包

2.路径相同,第一声明者优先:CàB,CàA,必须看B,A在C中哪一个先声明

九、工程的继承和聚合(依赖配置)

首先将所有的子工程的公共jar包抽出,作为父工程。主要是可以起到公共配置文件的抽取作用,jar包的统一管理

1.dependencyManagement中定义的依赖子module不会共享

2.dependencies中定义的依赖子module可以共享

3、jar包的统一管理,把jar抽取到parent中

继承(子工程的pom):

<parent>
<groupId>com.procect.btx</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../parent</relativePath>
</parent>

聚合(父工程的pom):

<modules>
<module>../project2</module>
</modules>

继承和聚合的功能差不多,聚合是在继承的基础上发展出来的。聚合可以只对父工程打包,对应的子工程也会自动打包。

十、Maven配置文件动态切换

例如:现在在resources文件中配置jdbc的连接信息,不同的环境有不同的信息,测试环境有测试环境的信息,开发环境有开发环境的信息,运行环境有运行环境的信息,maven也可以做到动态为我们切换配置文案的环境。

Jdbc中的内容:

jdbc.driver = ${jdbc.driver}
jdbc.url = ${jdbc.url}
jdbc.username  = ${jdbc.username}
jdbc.password =${jdbc.password}

pom文件定义profiles标签:

<profiles>
<profile>
<id>test</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<properties>
<jdbc.driver>test.dirver</jdbc.driver>
<jdbc.url>test.url</jdbc.url>
<jdbc.username>test.username</jdbc.username>
<jdbc.password>test.password</jdbc.password>
</properties>
</profile>
<profile>
<id>dev</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<properties>
<jdbc.driver>dev.dirver</jdbc.driver>
<jdbc.url>dev.url</jdbc.url>
<jdbc.username>dev.username</jdbc.username>
<jdbc.password>dev.password</jdbc.password>
</properties>
</profile>
<profile>
<id>product</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<jdbc.driver>product.dirver</jdbc.driver>
<jdbc.url>product.url</jdbc.url>
<jdbc.username>product.username</jdbc.username>
<jdbc.password>product.password</jdbc.password>
</properties>
</profile>
</profiles>

分 别定义三个不同的环境变量,并且不同的环境变量有不同的值。

在bulid标签下添加resource标签

<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
<!-- 设置对auto-config.properties,jdbc.properties进行过虑,即这些文件中的${key}会被替换掉为真正的�?-->
<resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>jdbc.properties</include>
</includes>
<filtering>true</filtering>
</resource>

</resources>

定义随环境变换的资源路径。然后重新打包,在target文件中的class中找到jdbc.properties文件,查看文件的值,会发现和激活的环境的对应的值相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: