1、maven基础回顾
maven是一个项目管理工具
依赖管理:
maven对项目中的jar的管理过程,传统工程直接把jar放在项目工程中,maven工程把真正的jar包放在仓库中,项目中只用引入jar的坐标!
仓库的种类:本地仓库,远程仓库(私服),中央仓库。
仓库之间的关系:当我们启动一个maven项目以后,maven项目会根据pom.xml中的坐标,先去本地仓库中找对应的jar,默认情况下,如果本地仓库没有jar包,maven工程会自动去中央仓库下载jar包到本地仓库。在公司中,如果本地仓库没有对应jar包,会先从私服下载;如果私服没有jar包,可以从中央仓库下载,也可以在本地上传!
**一键构建:**maven自身集成了Tomcat插件,可以对项目进行编译,打包,测试,安装,发布等操作!
maven常用命令:
清理:clean 编译:compile 测试:test 打包:package 安装:install 打包到私服:deploy
maven三套生命周期:
清理生命周期 默认生命周期 站点生命周期!
2、maven解决jar包冲突
2.1 第一声明优先原则
哪一个jar包的坐标在靠上的位置,这个jar包就是先声明的,先声明的坐标的jar,可以优先进入项目中!
2.2 路径近者优先原则
**直接依赖:**项目中直接导入的jar包,就是该项目的直接依赖包!
**传递依赖:**项目中没有直接导入的jar包,可以通过项目的直接依赖的jar传递到项目中!
**路径近者优先原则:**直接依赖路径比传递依赖路径近,那么最终进入项目的jar包会是路径近的直接依赖!
2.3 直接排除法(推荐)
做法就是在dependency标签下加上:排除传递依赖的jar包,<exclusion>中的坐标可以不用写版本号,因为他用的就是所在dependency标签中声明的版本号!
<exclusions>
<exclusion>
<groupId>xxx</groupId>
<artifact>xxx</artifact>
</exclusion>
...
</exclusions>
3、maven工程是可以分父子依赖关系的
凡是依赖别的项目后,拿到的别的项目的依赖包,都属于传递依赖,比如A项目被B项目依赖,那么A项目中所有的依赖都会传递到B项目中。如果再在B中导入依赖,则会覆盖A项目中的依赖,为了防止以上情况的出现,我们可以把A项目中jar的坐标锁住,那么其他项目中的同名jar包就不会覆盖A中的jar;即把<dependencies>放在<dependencyManagement>中;但是<dependencyManagement>的作用只是锁住jar包,不能导入jar包,所以还要在下面单独用<dependencies>来引入jar!
4、maven工程拆分与聚合的思想
普通项目分三层:dao,serveice,controller
maven解决代码可重用和便于维护问题上是这么解决的:
maven把一个完整的项目分成不同的独立模块,这些模块都有独立的坐标,哪个地方需要其他的独立模块,就直接引用该模块的坐标即可;
如果要开发一个项目,不是先去想dao,service,util,domain这么写,而是看这些模块是否已经存在,如果存在就直接引用即可!
我们可以把拆分零散的模块聚合到一起,编写一个完整的项目,这就是maven工程聚合的思想!
5、maven工程的父子工程创建
maven的父工程只需要有一个pom文件即可!
父工程的pom文件中放了父工程的坐标:artifactId,groupId和version,子工程的坐标会共用父工程groupId和version,所以在父工程pom.xml中出现的子工程的坐标就只有一个artifactId名称,如:
<groupId>cn.melo</groupId>
<artifactId>melo_parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>melo_common</module>
<module>melo_common_web</module>
<module>melo_pojo</module>
<module>melo_interface</module>
<module>melo_service_goods</module>
<module>melo_common</module>
<module>melo_common_service</module>
<module>melo_web_manager</module>
</modules>
父工程的打包方式是pom,所以要加上<packaging>pom</packaging>
6、工程和模块的区别
工程不等于完整的项目,模块也不等于完整的项目,一个完整的项目看的是代码,代码完整就可以说这是一个完整的项目和此项目是工程或者模块没有关系!
工程天生只能使用自己内部的资源,工程天生是独立的,后天可以和工程或者模块建立关联关系!
模块天生不是独立的,模块是属于父工程的,模块一旦创建,所有父工程的资源都可以使用!
父子工程之间:子模块天生继承父工程,可以使用父工程所有资源,不用建立关系,因为继承关系是天生的!
子模块之间:天生是没有任何关系的!
平级之间的引用叫依赖,依赖不是天生的,是需要后天建立的!
7、传递依赖下来的包是否能用
如果对应上-,就表示传递 丢失;直接表现出来的形式就是不能导入jar包中的类,这时候我们只需要再导一次即可!
8、私服的应用
首先想把自己的代码上传到私服,那么就要在maven的settings.xml中配置用户名和密码,使其可以登录:
<servers>
<server>
<id>releases</id>
<username>xxx(默认是admin)</username>
<password>xxx(默认是admin123)</password>
</server>
<server>
<id>snapshots</id>
<username>xxx(默认是admin)</username>
<password>xxx(默认是admin123)</password>
</server>
</servers>
然后再你想要传的jar的pom文件中加上以下内容:
<distributionManagement>
<repository>
<id>releases</id>
<url>http://localhost:8081/nexus/content/repositories/releases/</url>
</repository>
<repository>
<id>snapshots</id>
<url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
</repository>
</distributionManagement>
执行maven的deploy命令即可!
如果想想从私服中下载jar,则需要在maven的settings.xml中配置:
<profiles>
<profile>
<id>dev</id>
<repositories>
<repository>
<id>nexus</id>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepostories>
<pluginRepostory>
<id>public</id>
<name>Public Repositories</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</pluginRepostory>
</pluginRepostories>
</profile>
</profiles>
<!--激活profile-->
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
9、安装第三方jar到本地仓库
#进入ajr包所在的目录运行
mvn install:install-file -DgroupId=xxx.xxx -DartifactId=xxx -Dversion=xxx -Dfile=xxx.jar -Dpackaging=jar
#打开cmd直接运行
mvn install:install-file -DgroupId=xxx.xxx -DartifactId=xxx -Dversion=xxx -Dpackaging=jar -Dfile=xx\xx\xx\xxx.jar
10、安装第三方jar到私服
首先在maven的setting.xml重要配置登录信息:
<server>
<id>thirdparty</id>
<username>xxx(默认是admin)</username>
<password>xxx(默认是admin123)</password>
</server>
#进入ajr包所在的目录运行
mvn deploy:deploy-file -DgroupId=xxx.xxx -DartifactId=xxx -Dversion=xxx -Dfile=xxx.jar -Dpackaging=jar -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty
#打开cmd直接运行
mvn deploy:deploy-file -DgroupId=xxx.xxx -DartifactId=xxx -Dversion=xxx -Dpackaging=jar -Dfile=xx\xx\xx\xxx.jar -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty