2.1、maven父子模块

在实际开发中,我们基本都会用maven父子分模块的方式进行项目的开发。

2.2、实际操作

2.2.1、手工建立一个ssmm0的文件夹,并在该文件夹中加入一个pom.xml文件,该pom.xml文件内容如下:

java maven pom文件父子模块依赖管理 maven父子项目的作用_maven

java maven pom文件父子模块依赖管理 maven父子项目的作用_maven_02

1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 4 
 5     <modelVersion>4.0.0</modelVersion>
 6 
 7     <groupId>com.xxx</groupId>
 8     <artifactId>ssmm0</artifactId>
 9     <version>1.0-SNAPSHOT</version>
10 
11     <name>ssmm0</name>
12     <packaging>pom</packaging><!-- 父模块 -->
13     
14     <!-- 管理子模块 -->
15     <modules>
16         <module>ssmm</module>
17     </modules>
18 
19     <properties>
20         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
21         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
22     </properties>
23 </project>

View Code

注意:

  • 父模块的pom.xml文件的<packaging>标签内容为pom;而需要部署的子项目为war;只是作为其他项目的工具的子项目为jar
  • 使用<modules>标签管理所有的子模块,以后再有新的子模块,只需要在<modules>添加新的<module>子标签即可

2.2.2、将上一章建好的那个项目ssmm放入ssmm0文件夹下,修改pom.xml如下:

java maven pom文件父子模块依赖管理 maven父子项目的作用_maven

java maven pom文件父子模块依赖管理 maven父子项目的作用_maven_02

1 <?xml version="1.0" encoding="UTF-8"?>
  2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  4 
  5     <modelVersion>4.0.0</modelVersion>
  6 
  7     <!-- 指定父模块 -->
  8     <parent>
  9         <groupId>com.xxx</groupId>
 10         <artifactId>ssmm0</artifactId>
 11         <version>1.0-SNAPSHOT</version>
 12     </parent>
 13     
 14     <groupId>com.xxx.ssmm0</groupId>
 15     <artifactId>ssmm0-ssmm</artifactId>
 16     <!--<version>1.0-SNAPSHOT</version>--><!-- 父模块已经指定了版本号,这里就不用了-->
 17 
 18     <name>ssmm0-ssmm</name>
 19     <packaging>war</packaging>
 20 
 21     <properties>
 22         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 23         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 24     </properties>
 25 
 26     <!-- 引入实际依赖 -->
 27     <dependencies>
 28         <!-- json -->
 29         <dependency>
 30             <groupId>com.alibaba</groupId>
 31             <artifactId>fastjson</artifactId>
 32             <version>1.1.39</version>
 33         </dependency>
 34         <!-- servlet -->
 35         <dependency>
 36             <groupId>javax.servlet</groupId>
 37             <artifactId>javax.servlet-api</artifactId>
 38             <version>3.0.1</version>
 39             <scope>provided</scope>
 40         </dependency>
 41         <!-- spring -->
 42         <dependency>
 43             <groupId>org.springframework</groupId>
 44             <artifactId>spring-core</artifactId>
 45             <version>3.2.6.RELEASE</version>
 46         </dependency>
 47         <dependency>
 48             <groupId>org.springframework</groupId>
 49             <artifactId>spring-beans</artifactId>
 50             <version>3.2.6.RELEASE</version>
 51         </dependency>
 52         <dependency>
 53             <groupId>org.springframework</groupId>
 54             <artifactId>spring-context</artifactId>
 55             <version>3.2.6.RELEASE</version>
 56         </dependency>
 57         <dependency>
 58             <groupId>org.springframework</groupId>
 59             <artifactId>spring-web</artifactId>
 60             <version>3.2.6.RELEASE</version>
 61         </dependency>
 62         <dependency>
 63             <groupId>org.springframework</groupId>
 64             <artifactId>spring-webmvc</artifactId>
 65             <version>3.2.6.RELEASE</version>
 66         </dependency>
 67         <!-- 这个是使用velocity的必备包 -->
 68         <dependency>
 69             <groupId>org.springframework</groupId>
 70             <artifactId>spring-context-support</artifactId>
 71             <version>3.2.6.RELEASE</version>
 72             <scope>compile</scope>
 73         </dependency>
 74         <!-- mysql -->
 75         <dependency>
 76             <groupId>mysql</groupId>
 77             <artifactId>mysql-connector-java</artifactId>
 78             <version>5.1.27</version>
 79             <scope>runtime</scope>
 80         </dependency>
 81         <!-- 数据源 -->
 82         <dependency>
 83             <groupId>org.apache.tomcat</groupId>
 84             <artifactId>tomcat-jdbc</artifactId>
 85             <version>7.0.47</version>
 86         </dependency>
 87         <!-- mybatis -->
 88         <dependency>
 89             <groupId>org.mybatis</groupId>
 90             <artifactId>mybatis</artifactId>
 91             <version>3.1.1</version>
 92         </dependency>
 93         <dependency>
 94             <groupId>org.mybatis</groupId>
 95             <artifactId>mybatis-spring</artifactId>
 96             <version>1.1.1</version>
 97         </dependency>
 98         <!-- velocity -->
 99         <dependency>
100             <groupId>org.apache.velocity</groupId>
101             <artifactId>velocity</artifactId>
102             <version>1.5</version>
103         </dependency>
104         <dependency>
105             <groupId>velocity-tools</groupId>
106             <artifactId>velocity-tools-generic</artifactId>
107             <version>1.2</version>
108         </dependency>
109         <!-- 用于加解密 -->
110         <dependency>
111             <groupId>commons-codec</groupId>
112             <artifactId>commons-codec</artifactId>
113             <version>1.7</version>
114         </dependency>
115         <dependency>
116             <groupId>org.bouncycastle</groupId>
117             <artifactId>bcprov-jdk15on</artifactId>
118             <version>1.47</version>
119         </dependency>
120         <!-- 集合工具类 -->
121         <dependency>
122             <groupId>org.apache.commons</groupId>
123             <artifactId>commons-collections4</artifactId>
124             <version>4.0</version>
125         </dependency>
126         <!-- http -->
127         <dependency>
128             <groupId>org.apache.httpcomponents</groupId>
129             <artifactId>httpclient</artifactId>
130             <version>4.2.6</version>
131         </dependency>
132     </dependencies>
133 </project>

View Code

注意:在上一章的基础上做了以下几点修改

  • 添加了<parent>标签,用来指定父模块,该标签内有父模块的坐标(三要素:groupId/artifactId/version)
  • 子模块不需要再有版本号了,由父模块来指定就好
  • 将子模块中下边这一块儿代码也删掉(因为在父模块中已经指定了)
<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

建议:

  • "子模块的groupId"设为"父模块的groupId.父模块的artifactId"
  • "子模块的artifactId"设为"父模块的artifactId-子模块的的名称","父模块的artifactId-子模块的的名称"也就是子模块的项目名
  • 无论父模块还是子模块,建议同一个pom.xml文件中的artifactId与name标签内容相同

这几点建议,在我们编写和部署项目的时候都一目了然;以上几点建议,请对照着以上两个pom.xml文件对号入座。

2.2.3、在ssmm0的文件夹中,即父模块pom.xml所在的文件夹中运行命令窗口,执行"mvn clean compile"命令

2.2.4、编译成功后,将项目ssmm0以maven项目引入eclipse(具体方法:见第一章)

引入的项目结构如下:

java maven pom文件父子模块依赖管理 maven父子项目的作用_spring_05

注意:

  • 以上第一个框处的内容是ssmm0-ssmm编译出来的
  • 第二个红框正好印证了"父模块的artifactId-子模块的的名称"也就是子模块的项目名这句

2.2.5、运行ssmm项目,进行测试

这样,就建立起了一个maven的父子模块项目了。

注:若以后再增加一个新的模块该怎么做?

1)我们在父模块的pom.xml文件中添加<module>

2)在ssmm0文件夹下手工创建一个字maven项目(创建方式见第一章),假设为ssmm2,ssmm2的pom.xml文件类似于ssmm子项目的pom.xml即可

3)在ssmm2文件夹中,打开命令窗口,执行"mvn compile"

4)将ssmm2引入eclipse

5)用eclipse的maven插件编译在ssmm0上执行:"Run as"-->"Maven build"-->"clean compile"

java maven pom文件父子模块依赖管理 maven父子项目的作用_spring_06

这样,就新建了一个子项目了。

针对maven这一块有几点建议:(很重要)

  • 安装maven后,最好在M2_HOME/conf/setting.xml文件添加如下代码,将之后项目中用到的jar包全部下载到下边的文件夹中(当然,在修改setting.xml文件时,最好先复制一份最备份),防止C盘撑爆。
<localRepository>E:/Java/mavenLocalRepository</localRepository>
  • 在实际使用中,我们会架设私服(一般采用nexus),这样做主要是为了加快jar的下载速度,之后需要在父pom.xml文件中指定私服的位置
<!-- nexus -->
    <repositories>
        <repository>
            <id>xxx-Nexus</id>
            <name>xxx Maven Repository</name>
            <url>http://xxx.com/nexus/</url>
        </repository>
    </repositories>
  • View Code

一个<repository>标签就是一个私服,可以加多个私服。

  • 在实际使用中,我们会在父pom.xml文件中加入一个依赖管理池<dependencyManagement>,在这个池中指定了jar的版本号<version>和范围<scope>,之后在子项目中实际引入jar的坐标的时候,就不需要写<version>标签和<scope>了;当然,这样做,也可以保证在整个项目中,我们使用的同一个jar都是同一个版本;同时,需要指出的是,为了子模块重复代码的减少,在父模块处,会先引入一些所有子模块都会使用的jar(例如:log4j等),这样在子项目中就不需要再引入这些jar了。这里给出父pom.xml与子项目ssmm的pom.xml的完整版。对着代码,理解一下这一条。
1 <?xml version="1.0" encoding="UTF-8"?>
  2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  4 
  5     <modelVersion>4.0.0</modelVersion>
  6 
  7     <groupId>com.xxx</groupId>
  8     <artifactId>ssmm0</artifactId>
  9     <version>1.0-SNAPSHOT</version>
 10 
 11     <name>ssmm0</name>
 12     <packaging>pom</packaging><!-- 父模块 -->
 13 
 14     <!-- 管理子模块 -->
 15     <modules>
 16         <module>ssmm</module>
 17     </modules>
 18 
 19     <properties>
 20         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 21         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 22     </properties>
 23 
 24     <!-- dependencyManagement不会引入实际的依赖,只是作为一个依赖池,供其和其子类使用 -->
 25     <dependencyManagement>
 26         <dependencies>
 27             <!-- json -->
 28             <dependency>
 29                 <groupId>com.alibaba</groupId>
 30                 <artifactId>fastjson</artifactId>
 31                 <version>1.1.39</version>
 32             </dependency>
 33             <!-- servlet -->
 34             <dependency>
 35                 <groupId>javax.servlet</groupId>
 36                 <artifactId>javax.servlet-api</artifactId>
 37                 <version>3.0.1</version>
 38                 <scope>provided</scope>
 39             </dependency>
 40             <!-- spring -->
 41             <dependency>
 42                 <groupId>org.springframework</groupId>
 43                 <artifactId>spring-core</artifactId>
 44                 <version>3.2.6.RELEASE</version>
 45             </dependency>
 46             <dependency>
 47                 <groupId>org.springframework</groupId>
 48                 <artifactId>spring-beans</artifactId>
 49                 <version>3.2.6.RELEASE</version>
 50             </dependency>
 51             <dependency>
 52                 <groupId>org.springframework</groupId>
 53                 <artifactId>spring-context</artifactId>
 54                 <version>3.2.6.RELEASE</version>
 55             </dependency>
 56             <dependency>
 57                 <groupId>org.springframework</groupId>
 58                 <artifactId>spring-web</artifactId>
 59                 <version>3.2.6.RELEASE</version>
 60             </dependency>
 61             <dependency>
 62                 <groupId>org.springframework</groupId>
 63                 <artifactId>spring-webmvc</artifactId>
 64                 <version>3.2.6.RELEASE</version>
 65             </dependency>
 66             <!-- 这个是使用velocity的必备包 -->
 67             <dependency>
 68                 <groupId>org.springframework</groupId>
 69                 <artifactId>spring-context-support</artifactId>
 70                 <version>3.2.6.RELEASE</version>
 71             </dependency>
 72             <!-- mysql -->
 73             <dependency>
 74                 <groupId>mysql</groupId>
 75                 <artifactId>mysql-connector-java</artifactId>
 76                 <version>5.1.27</version>
 77                 <scope>runtime</scope>
 78             </dependency>
 79             <!-- 数据源 -->
 80             <dependency>
 81                 <groupId>org.apache.tomcat</groupId>
 82                 <artifactId>tomcat-jdbc</artifactId>
 83                 <version>7.0.47</version>
 84             </dependency>
 85             <!-- mybatis -->
 86             <dependency>
 87                 <groupId>org.mybatis</groupId>
 88                 <artifactId>mybatis</artifactId>
 89                 <version>3.1.1</version>
 90             </dependency>
 91             <dependency>
 92                 <groupId>org.mybatis</groupId>
 93                 <artifactId>mybatis-spring</artifactId>
 94                 <version>1.1.1</version>
 95             </dependency>
 96             <!-- velocity -->
 97             <dependency>
 98                 <groupId>org.apache.velocity</groupId>
 99                 <artifactId>velocity</artifactId>
100                 <version>1.5</version>
101             </dependency>
102             <dependency>
103                 <groupId>velocity-tools</groupId>
104                 <artifactId>velocity-tools-generic</artifactId>
105                 <version>1.2</version>
106             </dependency>
107             <!-- 用于加解密 -->
108             <dependency>
109                 <groupId>commons-codec</groupId>
110                 <artifactId>commons-codec</artifactId>
111                 <version>1.7</version>
112             </dependency>
113             <dependency>
114                 <groupId>org.bouncycastle</groupId>
115                 <artifactId>bcprov-jdk15on</artifactId>
116                 <version>1.47</version>
117             </dependency>
118             <!-- 集合工具类 -->
119             <dependency>
120                 <groupId>org.apache.commons</groupId>
121                 <artifactId>commons-collections4</artifactId>
122                 <version>4.0</version>
123             </dependency>
124             <!-- http -->
125             <dependency>
126                 <groupId>org.apache.httpcomponents</groupId>
127                 <artifactId>httpclient</artifactId>
128                 <version>4.2.6</version>
129             </dependency>
130         </dependencies>
131     </dependencyManagement>
132     
133     <!-- 引入实际依赖 -->
134     <dependencies>
135         <!-- json -->
136         <dependency>
137             <groupId>com.alibaba</groupId>
138             <artifactId>fastjson</artifactId>
139         </dependency>
140         <!-- servlet -->
141         <dependency>
142             <groupId>javax.servlet</groupId>
143             <artifactId>javax.servlet-api</artifactId>
144         </dependency>
145         <!-- spring -->
146         <dependency>
147             <groupId>org.springframework</groupId>
148             <artifactId>spring-core</artifactId>
149         </dependency>
150         <dependency>
151             <groupId>org.springframework</groupId>
152             <artifactId>spring-beans</artifactId>
153         </dependency>
154         <dependency>
155             <groupId>org.springframework</groupId>
156             <artifactId>spring-context</artifactId>
157         </dependency>
158         <dependency>
159             <groupId>org.springframework</groupId>
160             <artifactId>spring-web</artifactId>
161         </dependency>
162         <dependency>
163             <groupId>org.springframework</groupId>
164             <artifactId>spring-webmvc</artifactId>
165         </dependency>
166         <!-- 这个是使用velocity的必备包 -->
167         <dependency>
168             <groupId>org.springframework</groupId>
169             <artifactId>spring-context-support</artifactId>
170         </dependency>
171         <!-- mysql -->
172         <dependency>
173             <groupId>mysql</groupId>
174             <artifactId>mysql-connector-java</artifactId>
175         </dependency>
176         <!-- 数据源 -->
177         <dependency>
178             <groupId>org.apache.tomcat</groupId>
179             <artifactId>tomcat-jdbc</artifactId>
180         </dependency>
181         <!-- mybatis -->
182         <dependency>
183             <groupId>org.mybatis</groupId>
184             <artifactId>mybatis</artifactId>
185         </dependency>
186         <dependency>
187             <groupId>org.mybatis</groupId>
188             <artifactId>mybatis-spring</artifactId>
189         </dependency>
190         <!-- velocity -->
191         <dependency>
192             <groupId>org.apache.velocity</groupId>
193             <artifactId>velocity</artifactId>
194         </dependency>
195         <dependency>
196             <groupId>velocity-tools</groupId>
197             <artifactId>velocity-tools-generic</artifactId>
198         </dependency>
199         <!-- 集合工具类 -->
200         <dependency>
201             <groupId>org.apache.commons</groupId>
202             <artifactId>commons-collections4</artifactId>
203         </dependency>
204     </dependencies>
205 </project>
  • View Code

java maven pom文件父子模块依赖管理 maven父子项目的作用_maven

java maven pom文件父子模块依赖管理 maven父子项目的作用_maven_02

1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 4 
 5     <modelVersion>4.0.0</modelVersion>
 6 
 7     <!-- 指定父模块 -->
 8     <parent>
 9         <groupId>com.xxx</groupId>
10         <artifactId>ssmm0</artifactId>
11         <version>1.0-SNAPSHOT</version>
12     </parent>
13     
14     <groupId>com.xxx.ssmm0</groupId>
15     <artifactId>ssmm0-ssmm</artifactId>
16     <!--<version>1.0-SNAPSHOT</version>--><!-- 父模块已经指定了版本号,这里就不用了-->
17 
18     <name>ssmm0-ssmm</name>
19     <packaging>war</packaging>
20 
21     <properties>
22         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
23         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
24     </properties>
25 
26     <!-- 引入实际依赖 -->
27     <dependencies>
28         <!-- 用于加解密 -->
29         <dependency>
30             <groupId>commons-codec</groupId>
31             <artifactId>commons-codec</artifactId>
32         </dependency>
33         <dependency>
34             <groupId>org.bouncycastle</groupId>
35             <artifactId>bcprov-jdk15on</artifactId>
36         </dependency>
37         <!-- http -->
38         <dependency>
39             <groupId>org.apache.httpcomponents</groupId>
40             <artifactId>httpclient</artifactId>
41         </dependency>
42     </dependencies>
43 </project>
  • View Code
  • 对于maven3来讲,常用的scope有以下4种:
  • compile:默认,作用于编译、测试和运行
  • provided:常见的就是servlet-api,作用于编译和测试(运行的时候由容器提供了)
  • runtime:常见的就是mysql-connector,作用在运行和测试时
  • test:常见的就是junit,spring-test,作用在测试时
  • 在实际使用中,我们会在父pom.xml配置<profiles>标签,在其中配置多套运行环境(一般而言,配置三套:开发,预上线,上线),每套环境配置不同的数据库和服务器。