Maven 的多模块可以让项目结构更明确, 提高功能的内聚, 降低项目的耦合度, 真正的体现出分层这一概念.
我们在操作中, 要明白为什么这样做, 要了解到更深的层次, 这样, 我们就不限于个别软件了.
话不多说, 直入主题:
如果对 Maven 还不够熟悉, 请看该博客: Maven 基础
整个项目做完之后的结构是这样的:
在开始之前我放出这两张图是 maven 多模块项目做完后的目录结构, 以免大家被 eclipse 的结构迷惑了.
首先, 新建一个 maven 项目, 如图:
选 project, 注意是 Create a simple project, 然后特别注意, root 目录的聚合模块的 packing 是 pom!!!
完后在该 maven 项目上新建模块:
在这里, service 层使用简单的 maven-archetype-quickstart 即可, packing 使用 jar 类型, web 层则使用 maven-archetype-webapp 的 web 项目, packing 使用 war 类型. 在这里, jar 类型是为了让其他项目引用更方便, 而 war 类型是为了能在服务器部署它.
结构说明
到了这一步, 我们已经将这些模块建好了, 接下来我要深入一下项目结构, 以及多模块的原理, 然后我们再配置 pom 文件.
这是一个项目大概运行机制, ssm-integration 作为聚合父级项目, 就是为了管理其他子项目 (模块), 多模块就是基于聚合父级项目的. 子模块 service 是对数据处理的模块, 在这里是 ssm 框架, 那么它负责完成对数据库的操作的封装 (大概结构, 具体不细说), 然后对外暴露一个接口供 web 模块调用即可. 也就是当 web 模块引用了 ssm-service.jar 之后, 供 web 项目调用的只有你对外暴露的接口, 这就真正实现分层. 而 web 模块, 只负责 servlet, 视图模型, 前端页面和一些简单的逻辑, 需要时调用 ssm-service.jar 的接口方法就行了. 当对项目进行部署时, 只需部署 ssm-web 即可, 因为 ssm-integration 仅仅负责管理, 你可以将它理解为承载着多模块的大框架, 而 ssm-service 已经打包给 ssm-web 了 (ssm-web 里面已经有 ssm-service 了).
pom.xml 分析
在这之前, 我声明一下, 聚合和继承是可以分开的, 只是大家想方便一下, 所以统称为父项目.
我们开始看 pom 的配置, 首先时父项目的 pom.xml(这里只截取一部分, 了解方法为重点):
父类 pom.xml 分析
- <?xml version="1.0" encoding="UTF-8"?>
- <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>cn.zuoyu.ssm</groupId>
- <artifactId>ssm-integration</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>pom</packaging>
- <name>ssm-integration</name>
- <description>spring&springMVC&mybatis 的整合 </description>
- <modules>
- <module>ssm-service</module>
- <module>ssm-controller Maven Webapp</module>
- </modules>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <spring.version>4.3.8.RELEASE</spring.version>
- </properties>
- <build>
- <pluginManagement>
- <plugins>
- <!-- 编译插件 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>2.3.2</version>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- </configuration>
- </plugin>
- <!-- 用 UTF-8 编码处理资源文件 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-resources-plugin</artifactId>
- <version>2.6</version>
- <configuration>
- <encoding>UTF-8</encoding>
- </configuration>
- </plugin>
- </plugins>
- </pluginManagement>
- <!-- <resources>
- <!-- 资源位置配置 -->
- <resource>
- <directory>src/main/java</directory>
- <includes>
- <include>**/*.xml</include>
- </includes>
- </resource>
- <!-- 指定资源的位置 -->
- <resource>
- <directory>src/main/resources</directory>
- </resource>
- </resources> -->
- </build>
- <dependencyManagement>
- <dependencies>
- <!-- 单元测试 -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- <scope>test</scope>
- </dependency>
- <!-- spring 核心包 -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <!-- 扫描用包 -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <!-- 缓存扫描用包 -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context-support</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <!-- bean 支持 -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-beans</artifactId>
- <version>${spring.version}</version>
- </dependency>
- </dependencyManagement>
- </project>
在这里,<modules>xxx<modules > 是将需要管理的模块放进去, 放进去的模块归该聚合项目管理. 例如 < pluginManagement>xxx</pluginManagement > 或 < dependencyManagement>xxx</dependencyManagement > 是父类里独有的, 为的是统一资源包, 方便管理.
子类 pom.xml 分析
看一下子类的代码, 以 web 模块为例
- <?xml version="1.0"?>
- <project
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
- xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>cn.zuoyu.ssm</groupId>
- <artifactId>ssm-integration</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </parent>
- <artifactId>ssm-controller</artifactId>
- <packaging>war</packaging>
- <name>ssm-controller</name>
- <url>http://maven.apache.org</url>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- </dependency>
- <!-- springMVC 核心包 -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- </dependency>
- <!-- jstl 支持 -->
- <dependency>
- <groupId>jstl</groupId>
- <artifactId>jstl</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.taglibs</groupId>
- <artifactId>taglibs-standard-impl</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.taglibs</groupId>
- <artifactId>taglibs-standard-spec</artifactId>
- </dependency>
- <!-- 对 service 的依赖 -->
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>ssm-service</artifactId>
- <version>${project.version}</version>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <!-- 编译插件 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- </plugin>
- <!-- 编码设置 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-resources-plugin</artifactId>
- </plugin>
- </plugins>
- <finalName>ssm-controller</finalName>
- </build>
- </project>
你会发现多了 < parent></parent > 标签, 这里面写的就是它要继承的父项目. 你还会发现项目没有声明 groupId 和 version, 因为它已经有父项目了, 父项目已经管理了它的来源和版本号. 你还会发现 plugin 插件和 dependency 依赖没有声明 version, 这就是父项目里写 pluginManagement 和 dependencyManagement 的优点, 父项目里的这个如果子项目没有声明则不会导入该依赖或插件, 如果需要, 只需声明 groupId 和 artifactId 即可, 方便管理. 另外, 必须将该项目依赖的其他项目的 pack 引用过来, 不然多模块就失去了意义, 根本运行不起来.
注意:
在 maven 多模块项目里, 子项目的 classpath 共用的.
部署:
在 IntelliJ IDEA 里部署 MavenWeb 项目和 MyEclipse 部署是有差异的, MyEclipse 要很简单:
就好了, 只部署 ssm-web 即可.
到了这一步, 还差很关键的一部, 就是在你运行之前, 要保证你的 maven 仓库有 ssm-service, 就是你 service 层的 jar 包, 不然 ssm-web 根本找不到 ssm-service.jar, 所以, 我们要这样:
否则无法运行.
然后...
看一下整体结构:
就可以运行了...
若有不对的地方欢迎 + 感谢评论指出或邮件我 zuoyuip@qq.com
共同进步
来源: https://www.cnblogs.com/1214804270hacker/p/8748027.html