对maven的理解
从知道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 ——项⽬输出位置
|----l ----⽤于标识该项⽬是⼀个Maven项⽬
三、如何安装maven?
⾸先下载maven⼯具,⾃⼰可以去官⽹下载(和tomcat差不多)。然后像jdk⼀样配置环境变量。
然后在cmd命令⾏上输⼊mvn -v查看是否配置成功。。。
四、了解下maven的模型
1、本地仓库:
当我们在⼯程的l⽂件中配置jar依赖的时候,maven⾸相会在本地仓库中查该jar包。
本地仓库的默认位置:
C:\Users\Administrator\.m2\repository
2、私服:
这个是要配置的,也可以不配置。当公司需要对不同项⽬的jar包进⾏维护时,可以配置⾃⼰私服。
当配置了私服的时候,⼯程中所依赖的jar包不在本地仓库,则会去私服中下载,并且保存到本地仓库。
3、远程仓库:
Maven默认是使⽤⽶国的远程仓库,下载速度⾮常的慢(因为要)。所以建议使⽤阿⾥云或者开源中国的镜像。可以体验飞⼀般的速度。
配置:
在maven的⼯具中的conf⽂件下,修改l⽂件中的配置。到mirrors节点,在该节点下配置:
<!--使⽤阿⾥云镜像-->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>maven.aliyun/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范围
1pile: 默认编译依赖范围。对于编译,测试,运⾏三种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>
maven打包本地jar包<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标签
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论