聚合
当有多个项目需要打包进仓库时(其实就是当前项目依赖很多项目,所以当前项目执行前,需要把这些依赖的项目全部install进本地仓库),一个一个执行install太麻烦,maven有一个方法可以多个项目一起install到本地仓库。就是聚合。
例如:
有A,B,C三个项目需要install,新建一个用来聚合的项目aggreation(要保证aggreation和那三个项目是同一个GroupID。这句话的意思是如果这多个项目不是同一个GroupID,就不能用聚合了?)。
然后修改aggreation项目的pom文件:
1. 打包方式由jar修改为pom:
<packaging>pom</packaging>
2. 添加<modules> </modules>标签
<modules> <module>../A</module> <module>../B</module> <module>../C</module> </modules>
ps:
这个 ../ 指什么?指maven的根目录?
应该是当前项目pom的上一级目录,其实就是所有项目存放的那个文件夹(也就是maven项目的根目录),然后就通过/A /B /C 代表当前项目和这三个项目的相对路径
然后对aggreation项目执行install命令,则项目A,B,C就都打包到本地仓库了。
执行aggreation项目如test,A,B,C项目也都会执行。即便ABC之间有依赖关系,如B依赖A,不用把A先执行安装,B同样会被执行。这是聚合的优势。
配置完聚合项目,只需要操作聚合项目,里面的项目都会被操作。不管这些项目之间是否有依赖。
继承
当很多项目都有相同的依赖时,每个项目的pom都要修改,很麻烦。可以像继承那样处理,把这个依赖抽象成一个父类。
同上面聚合一样,新建一个项目parent专门用来处理 继承。
把共有的依赖放到这个新建项目parent的pom里的<dependencyManagement>(这部分是不在项目里运行的)里面。
<dependencyManagement> <dependencies> <dependency> 共同依赖的jar的坐标 </dependency> </dependencies> </dependencyManagement>
然后修改打包方式为pom:
<packaging>pom</packaging>
也可以在新建项目时选择pom打包
然后还需要去其他项目的pom里修改,添加<parent>标签继承上面那个专门的项目,既然每一个项目还是需要修改pom,还不如直接写依赖,何必搞这个继承。感觉没用。并没有省事,也可能是那个教程里讲的不详细
应该说,比较简单是是如果依赖很多,每一个子项目的pom都要写很多依赖时,这时只写一个<parent>标签,比较简单。而且格式上更好?
类似代码开头写常量变量那样,需要修改变量值,只在开头修改一次就可以,如果需要修改依赖,只需要去父工程里修改?
其实就是把公用的东西提取到一块,结构更清晰,修改更方便。
ps:
看到另一个教程里讲,继承还有另一个用法:
A依赖B,B依赖C,B对C的依赖是compile,则A 默认是传递依赖C。如果不想看B和C是不是compile,那只要A是继承B,就自然接受B的所有依赖关系。
注意父工程B的打包方式要是pom。(Java工程是jar,web项目是war)
继承的写法:
1. 建立父工程
父工程只用来写一些依赖关系的,结构很简单,注意打包方式和,依赖的格式。
2. 子项目
(1)子项目的pom里添加<parent>标签,写入父工程坐标:
(2)然后还要写入从当前项目pom到父工程的pom文件地址的相对路径:
..是从当前项目的pom向上一级,退到存放所有项目的文件夹,然后B是父工程的文件夹,然后是父工程的pom
这是相对路径,这样写完,打包安装部署时,可不一定连着父工程一块打包啊?还是说,子项目编译打包后的文件,已经包含从父工程里继承过来的东西了?部署后这个相对路径已经用不到了?
我记得哪里看到说项目里的路径都要写相对路径?
(3)在子类中要声明引用父类中的那些依赖jar,因为如果父类的依赖jar太多,子类未必要全部引用。
声明方式:
在子类的依赖标签中写要使用父类依赖中的哪些jar的信息:
使用父类依赖中的junit
只是相对于直接写依赖,写的信息只有g,a,没有版本和范围了(也可以写)。但是如果ga两个都写了,干脆直接写成依赖不好了?还搞一个父类继承这么麻烦?只能说,最大的好处就是版本的管理了,只需要去父类里修改,统一管理依赖的版本。