您的位置:首页 > 其它

Maven简明教程(4)---依赖关系(理论篇)

2016-02-25 20:33 246 查看
[工欲善其事,必先利其器]

在本文中,我们来简单介绍maven中几个常见的概念,这些概念在日常开发中经常见到。各位看官可以下面的介绍作为参考知识。

-----------------------------------------------------------------------------------------------------------------------------------------

正文开始:

1.本地仓库与远程仓库

本地仓库:即我们本地jar存放的目录,正常情况下pom文件中存在的依赖关系都会在本地仓库中出现。即使本地暂时不存在,maven也会帮我们自动下载到本地目录。

远程仓库:即一个包括所有公有jar包的地址,我们项目中所有需要使用的jar包都会从此地址上寻找。

2.依赖关系

a.jar包的依赖关系

如junit包,即使我们在pom文件中只配置了一个依赖关系,但是,我们在maven dependencies下能够看到2个jar包。这其实是maven帮助我们下载了junit包的依赖,而在开发时,我们不需要关心junit的依赖。我们以下面的关系来说明:

A----->B----->C----->D...

在使用时,我们如果只想使用A包,那个我们只需要引入A包即可。BCD等我们并不需要关心。

在如同一个项目中存在如下关系:

A----->B----->C----->D,X----->Y----->D

我们发现,A与X都依赖了D。此时,maven只会下载一个D供我们使用而不用关心重复。

b.项目的依赖关系:

在项目管理过程中,我们经常遇到的场景是MVC结构划分的系统。为此我们创建了不同的层次概念如controller层,dao层,service层等。对于这些内容常用的做法是用package来划分。这里,我们来介绍一种更加推荐的做法,使用maven管理这些不同的模块。

本例中我们使用的依赖关系图,如下:



这里实际来演示这个工程的各个模块会占据大量篇幅,因此,我们下面仅叙述步骤,即配置文件的配置方式,请各位看官自行创建工程来查看结果。

(1)以maven创建hello-entity工程,工程类型为quickstart。具体请参照前文。

(2)在src/main/java下,自定义一个包,创建一个实体类,如User.java.

(3)以maven创建hello-dao工程,工程类型为quickstart。具体请参照前文。

(4)在src/main/java下,自定义一个包,创建一个接口或者类,如userDao.java.将User实体引入,此时会报错,请读者稍安勿躁。[这里读者可以根据需求来决定真实/模拟的访问数据库]

(5)以maven创建hello-service工程,工程类型为quickstart。具体请参照前文。

(6)在src/main/java下,自定义一个包,创建一个接口及实现类,如IUserSerivce.java,将UserServiceImpl.java来接入dao,此时会报错,请读者稍安勿躁。[这里读者可以根据需求使用spring等基础框架,或者仅作为外壳使用]

(7)以maven创建hello-web工程,工程类型为webapp。具体请参照前文。

(8)在src/main/java下,自定义一个包,创建一个controller,或者servlet,将IUserSerivce或者UserServiceImpl引入。此时会报错,请读者稍安勿躁。[这里读者可以根据需求使用spring等基础框架,或者使用servlet]

重点来了!!!我们接下来介绍各个工程的pom文件的配置。

(a)hello-entity工程,作为最底层的模块,起不需要配置别的依赖项。但是请在其pom文件上右键run as-->maven install

(b)hello-dao工程需要依赖hello-entity工程,需要在pom文件中加入下面的配置:

<dependency>
<groupId><!-- 创建工程时hello-entity时填写的内容,可在其pom文件中查看--></groupId>
<artifactId>hello-entity</artifactId>
<version><!-- 这里如果是第一次创建工程一般为:0.0.1-SNAPSHOT--></version>
</dependency>
这里如果正确配置,即可在maven dependencies下看到hello-entity工程文件夹。【下图仅为举例】



(c)类似的,我们在service层pom文件只写入dao层的依赖,在web层只写入service层的依赖。正如我们前文介绍的,我们只关心紧相邻的上一层,maven会帮助我们自动引入其他依赖。

c.最后,我们介绍一种常用的继承关系

对于上面工程中的依赖关系我们最好能够统一管理,这样能够防止不同模块之间可能存在的依赖项不同带来的风险,如版本号不同造成的差异等。

第一步,我们先创建一个hello-parent工程,创建工程时,请在前文步骤2中选择create a simple project。

第二部,在其pom文件中,写入所有子工程的依赖项,示例pom文件如下:

<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.java.hello</groupId>
<artifactId>hello-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
<module>../hello-dao</module>
<module>../hello-service</module>
<module>../hello-web</module>
<module>../hello-entity</module>
</modules>

<properties>
<spring.version>4.1.7.RELEASE</spring.version>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
</properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
pom文件里,我们首先用modules表示各个字模块,”../“表示相对路径,因为parent工程与我们其他工程平级。接着,我们使用porperties来管理我们各个jar包的版本号,书写方式如上文示例。最后,在下面的dependencies中写入jar的名称即可。

第三步:在子模块的pom文件中写入如下内容:

<parent>
<groupId>com.java.hello</groupId>
<artifactId>hello-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../hello-parent/pom.xml</relativePath>
</parent>
写入之后,pom文件中出现的黄叹号行删除即可,这是由于继承关系已经自定的加入其中,不需要再写一遍。

----------------------------------------------------------------------------------------------------------------------------------------------

至此,Maven简明教程(4)---依赖关系(理论篇)结束

特别备注:

上面的说明,我们没有以实际用例来说明,是因为一方面举例会涉及大篇幅的代码,另一方面,也会涉及到spring,servlet,数据库等方面的内容,与我们这里的主题相距甚远,还请各位读者能够谅解!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: