前言
上一节我们将Maven已经配置完成了(个人觉得下载配置真的枯燥乏味…),那么本节就先来入个门,来初步的使用Maven,模拟Maven的项目聚合和继承吧~
创建Maven项目
打开Eclipse,我们先来new一个Maven项目,面板中没有Maven的话点击Other,在输入框中输入Maven就可以啦
我们这边勾选Create a simple project就可以啦
填写Group Id组名称,其他的部分暂时不用变,Packing就是我们的包的导出方式,一般我们遇到的都是jar包对吧?里面还有另外两种方式,分别是pom和war,这个我们后续会一一讲到。
讲到这里我们不得不了解一下Maven中的坐标系的概念啦
groupId :定义当前Maven项目隶属的实际项目。首先,Maven项目和实际项目不一定是一对一的关系。比如SpringFrameWork这一实际项目,其对应的Maven项目会有很多,如spring-core,spring-context等。这是由于Maven中模块的概念,因此,一个实际项目往往会被划分成很多模块。其次,groupId不应该对应项目隶属的组织或公司。原因很简单,一个组织下会有很多实际项目,如果groupId只定义到组织级别,而后面我们会看到,artifactId只能定义Maven项目(模块),那么实际项目这个层次将难以定义。最后,groupId的表示方式与Java包名的表达方式类似,通常与域名反向一一对应。上例中,groupId为junit,是不是感觉很特殊,这样也是可以的,因为全世界就这么个junit,它也没有很多分支。
artifactId : 该元素定义当前实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目名称作为artifactId的前缀。比如上例中的junit,junit就是实际的项目名称,方便而且直观。在默认情况下,maven生成的构件,会以artifactId作为文件头,如junit-3.8.1.jar,使用实际项目名称作为前缀,就能方便的从本地仓库找到某个项目的构件。
version : 该元素定义了使用构件的版本,如上例中junit的版本是3.8.1,你也可以改为4.0表示使用4.0版本的junit。
packaging :定义Maven项目打包的方式,使用构件的什么包。首先,打包方式通常与所生成构件的文件扩展名对应,如上例中没有packaging,则默认为jar包,最终的文件名为junit-3.8.1.jar。也可以打包成war等。
相信提到坐标大家肯定不会陌生啦,例如通过雷达的坐标,我们可以精准的定位到敌人的方位,又例如我们玩LOL,小地图上的坐标也可以显示己方队友的位置,等敌人出现之后可以快速的去支援友军,这些都是我们的平面二维坐标,那么使用三维坐标则可以在基本空间层面定位到所有人的位置,其实这个世界绝对不止三维空间,可能还有更多未知的东西等着我们去探索,就好比程序一样,肯定还有着更多为止的"宝藏"等待我们去挖掘。
那么再看上面的坐标系,其实已经定义的很清晰,groupId就是组名称,比如我们的Spring公司下的spring框架的groupId都是springframework,artifactId则是项目名称,比如说spring的项目下有很多分支,core核心、tx事务管理、jdbc数据库操作、aop面向切面等等,因此这些不同的项目的groupId是固定的,但是artifactId却是不一样的。version应该就更好理解了,他就是每一个项目的版本号,这三个属性一经确定,那么我们要导入哪个jar包就肯定可以确定下来了。
Eclipse下Maven项目聚合
项目与项目间的依赖
我们之前在学习的时候,有一个固定的认知就是在同一个包下我们的类只要是public的,都可以访问,但是如果不在同一个项目中,那么类于类之间是不能相互访问的。而Maven完全颠覆了我们认知,也就是说不同的项目之间的类是可以访问的!
其实呢原理很简单,大家想,我们在使用框架的时候是不是导入了别人的jar包到Librarys中,我们就可以使用框架中类了?而Maven的特点是什么?只要在pom.xml中配置了我们需要的包的坐标定位,找到这个包之后就可以导入进来并使用,这么说大家应该就能懂了吧?
没错,想使用其他项目的类关联其他的项目,通过Maven配置就可以了!是不是很强大,那么我们来测试看看吧
首先按照我们之前交给大家的方法自己创建一个Maven项目,暂且就叫A
在src/main/java中创建一个User,字段的话大家随意,记得添加上get和set方法,其他地方不变
紧接着我们创建项目B,按照我们的想法,B是需要依赖A的,那么B里面的pom.xml配置我们就要变动了
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>B</groupId>
<artifactId>B</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>A</groupId>
<artifactId>A</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
<dependencies></dependencies>
就是包含依赖组的标签,学习过前面的配置,大家应该一看就懂它的意思啦
<dependency></dependency>
叫做依赖标签,在这个标签中我们需要配置我们所需要依赖的包的三维定位坐标,添加完成之后,那么当前的包就会对我们所配置的包产生依赖关系。
那么配置好之后我们来测试一下,在B下面创建一个测试类
package com.marco.test;
import com.marco.domain.User;
public class Test {
public static void main(String[] args) {
User user = new User(1,"marco");
System.out.println(user.getName());
}
}
我们发现虽然B中并没有创建User,但是却可以正常使用User,这就是我们Maven对依赖关系的处理!
Eclipse下Maven项目继承
Maven项目之间的聚合就好比我们的类的聚合,当一个类聚合了另外一个类之后,就可以使用该类,并调用该类的方法,类于类之间还存在着继承的关系,那么Maven是否可以帮助我们实现项目之间的继承呢?
答案是肯定的,那接下来我们来看看Eclipse下Maven项目是怎么继承的吧~
第一步:创建maven_parent父项目
首先我们还是按照之前的方式创建Maven项目,命名为maven_parent,只不过,打包方式Packing这里需要改成pom的打包方式,注意了,只有这个项目是父项目的时候,才勾选pom
第二步:修改maven_parent的pom.xml
添加对spring-jdbc、servlet以及对jsp的依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.maro</groupId>
<artifactId>maven_parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<servlet.version>3.1.0</servlet.version>
<jsp.version>2.3.1</jsp.version>
<spring.version>4.3.24.RELEASE</spring.version>
</properties>
<dependencies>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
<!-- 排除logging的包 -->
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- javax.servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<!-- javax.servlet.jsp -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>${jsp.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
添加之后更新Maven,我们发现居然多了这么多spring的包?则就是Maven的包之间依赖传递特性,因为
spring-jdbc
是需要依赖其他几个包的,因此其他的几个包也就跟着"传递"过来了。
这里我们还发现一个不认识的标签<exclusions></exclusions>
,其实根据字面意思也知道是排除的意思,上面我们不是提到了包之间的依赖传递关系么?我们导入了spring-jdbc
,其他的包都传递进来了,但是有的时候我不想要其中传递进来的某个包,因为大量无用的包会对我们项目造成负担,而且包之间可能会存在冲突,那么这个时间就需要用到我们的<exclusions></exclusions>
标签了。
第三步:修改maven_children的pom.xml
接下来我们创建子项目,子项目的创建就和上面不太一样了,我们需要选择Maven Module
然后下面的步骤和之前就是一样啦,大家可以看到我们子项目中的父项目的包也都被依赖传递进来了
子项目的选择性继承
但是有的时候我们子类不想要这么多包怎么办?解决方案当然是有的。
我们只用在父类的pom.xml中使用<dependencyManagement></dependencyManagement>
将<dependency></dependency>
的内容包裹起来就可以啦
紧接着我们修改maven_children的pom.xml
只需要添加你所需要的包的GA坐标就可以啦,不需要添加Version,当然如果子类不想用这个包的版本号,比如说我的servlet想使用3.0.1的版本,像上面一样添加<properties></properties>
标签重新声明版本号即可,这一点是不是和Java中的类的继承中,子类重新声明和父类同名的变量很像呢?