对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节点,在该节点下配置:
这样本地仓库中没有的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):
聚合(父工程的pom):
继承和聚合的功能差不多,聚合是在继承的基础上发展出来的。聚合可以只对父工程打包,对应的子工程也会自动打包。
十、Maven配置文件动态切换
例如:现在在resources文件中配置jdbc的连接信息,不同的环境有不同的信息,测试环境有测试环境的信息,开发环境有开发环境的信息,运行环境有运行环境的信息,maven也可以做到动态为我们切换配置文案的环境。
Jdbc中的内容:
pom文件定义profiles标签:
分 别定义三个不同的环境变量,并且不同的环境变量有不同的值。
在bulid标签下添加resource标签
定义随环境变换的资源路径。然后重新打包,在target文件中的class中找到jdbc.properties文件,查看文件的值,会发现和激活的环境的对应的值相同。
一、为什么要用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文件,查看文件的值,会发现和激活的环境的对应的值相同。
相关文章推荐
- Laravel session存储后 意外丢失
- MicroPython支持SPI驱动外部Flash了
- HttpClient TIPS
- Hyperledger Fabric开发环境与运行环境的搭建
- Create Personalized Custom Football Jerseys
- MySQL自学笔记2--select的5个子句
- MySQL自学笔记3--模糊查询
- MySQL自学笔记4--where、from、exists型子查询
- docker运行badjs
- blogs
- 使用存储过程(PL/SQL)向数据库中存储BLOB对象
- Using DBMS_SYS_SQL Package to grant Privilege
- What's mean ORA-25191?
- Why "EXECUTE ANY PROCEDURE" is a dangerous PRIVILEGE?
- 使用UTL_FILE转储数据为逗号分隔符文件
- 如何使用DBMS_LOB从文件中加载CLOB数据
- How to use Oracle Dump Function
- 批量绑定(bulk binds):FOR循环与FORALL的性能比较
- 基于自定义函数的Function-Based索引创建
- 使用Index提示 强制使用索引