Maven项目的拆分与聚合
---------------------siwuxie095
Maven 项目的拆分与聚合
1、对已有的
Maven 项目 maven-ssh 先拆分,再聚合
(1)拆分思路:将
DAO 层、Service 层、Web 层
的代码以及配置文件分别提取到三个表现上独立的项
目中(实际上并不独立)
(2)聚合思路:对拆分后的项目进行聚合
2、对应到
Maven 中,就是父项目与子模块的概念
(1)父项目将子模块聚合在一起
(2)子模块继承父项目中的依赖
3、具体如下:
(1)ssh-parent(父项目)
(2)ssh-dao(子模块)
(3)ssh-service(子模块)
(4)ssh-web(子模块)
4、父项目和子模块的创建方法
(1)父项目:File->New->Maven Project
(2)子模块:选择父项目,右键->New->Other->Maven->Maven Module
「先有父项目,再有子模块」
注意:创建时要勾选
跳过原型选项
或
跳过骨架选项

5、创建父项目
ssh-parent

注意:打包方式(Packaging)要选择 pom
6、父项目
ssh-parent 目录结构一览:

当前父项目的核心配置文件
pom.xml:
|
<project 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.siwuxie095.ssh</groupId> <artifactId>ssh-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging>
<!-- modules 标签用于配置子模块,其中的 内容无需手动配置,随着子模块的创建, 将自动生成
当然,也可以手动配置 --> <modules> <module>ssh-dao</module> <module>ssh-service</module> <module>ssh-web</module> </modules>
<!-- 归类依赖 --> <properties> <struts.version>2.3.33</struts.version> <spring.version>4.3.7.RELEASE</spring.version> <hibernate.version>5.0.12.Final</hibernate.version> </properties>
<dependencies>
<!-- +++++++ (1) Struts2 相关 +++++++ -->
<!-- Struts2 相关的基本依赖 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>${struts.version}</version> <!-- 由于 Struts2 和 Hibernate 中都有 javassist, 为避免冲突,留下高版本,排除低版本即可
这里,Struts2 中的 javassist 版本更低 --> <exclusions> <exclusion> <groupId>javassist</groupId> <artifactId>javassist</artifactId> </exclusion> </exclusions> </dependency>
<!-- +++++++ (2) Spring 相关 +++++++ -->
<!-- Spring 相关的基本依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency>
<!-- Spring AOP 相关的依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency>
<!-- Spring 单元测试相关的依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency>
<!-- +++++++ (3) Hibernate 相关 +++++++ -->
<!-- Hibernate 相关的基本依赖 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency>
<!-- +++++++ (4) SSH 整合相关 +++++++ -->
<!-- Struts2 整合 Spring 相关的依赖 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>${struts.version}</version> </dependency>
<!-- Spring 整合 Web 项目相关的依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency>
<!-- Spring 整合 Hibernate 相关的依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency>
<!-- +++++++ (5) 数据库连接相关 +++++++ -->
<!-- JDBC 驱动相关的依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.43</version> <scope>runtime</scope> </dependency>
<!-- C3P0 连接池相关的依赖 --> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency>
<!-- +++++++ (6) 日志相关 +++++++ -->
<!-- 日志相关的依赖 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency>
<!-- +++++++ (7) 其它相关 +++++++ -->
<!-- JUnit 相关的依赖 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
<!-- JSTL 相关的依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
<!-- servlet-api 相关的依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency>
<!-- jsp-api 相关的依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency>
</dependencies>
</project> |
父项目中并不进行编码,它的主要作用是:
(1)在
pom.xml 中声明依赖,子模块继承之
(2)在
pom.xml 中将各个子模块聚合到一起
7、创建子模块
ssh-dao


注意:打包方式(Packaging)要选择 jar
8、子模块
ssh-dao 目录结构一览:

(1)当前子模块的核心配置文件
pom.xml:
|
<project 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>
<parent> <groupId>com.siwuxie095.ssh</groupId> <artifactId>ssh-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
<artifactId>ssh-dao</artifactId>
</project> |
(2)实体类及其
Hibernate 映射配置文件
User.java:
|
package com.siwuxie095.entity; public class User {
Integer uid; String username; String address;
public Integer getUid() { return uid; } public this.uid = uid; }
public String getUsername() { return username; } public this.username = username; }
public String getAddress() { return address; } public this.address = address; }
@Override public String toString() { return ", address=" + address + "]"; }
} |
User.hbm.xml:
|
<?xml <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping> <class
<id <generator </id>
<property <property
</class>
</hibernate-mapping> |
(3)Hibernate 核心配置文件
hibernate.cfg.xml:
|
<?xml <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory>
<property <property <!-- 注意:只有配置 hibernate.hbm2ddl.auto 为 update,才能自动创建表 --> <property <property <!-- 原来的配置: <property name="hibernate.current_session_context_class">thread</property>
在 SSH 框架整合中会报错,要么将这个配置删了,要么改成如下配置
参考链接:http://blog.csdn.net/maoyuanming0806/article/details/61417995 --> <property org.springframework.orm.hibernate5.SpringSessionContext </property> <!-- 如果没有如下配置,控制台将有如下异常信息: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
* 配置 * <property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
其实该配置加不加都无所谓,并不影响什么
参考链接:http://blog.csdn.net/jiong_long/article/details/51340685 --> <property
<mapping
</session-factory> </hibernate-configuration> |
(4)DAO 接口及其实现类
UserDao.java:
|
package com.siwuxie095.dao; import com.siwuxie095.entity.User; public interface UserDao { void add(User user);
} |
UserDaoImpl.java:
|
package com.siwuxie095.dao.impl; import org.springframework.orm.hibernate5.support.HibernateDaoSupport; import com.siwuxie095.dao.UserDao; import com.siwuxie095.entity.User; /** * 让 DAO 接口实现类继承 HibernateDaoSupport 类,直接获取 HibernateTemplate */ public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
@Override public
// 直接通过 this 获取 HibernateTemplate,调用 save() 方法保存 this.getHibernateTemplate().save(user);
/* * 此时,也可以获取 SessionFactory * * 法一:this.getSessionFactory() * 法二:this.getHibernateTemplate().getSessionFactory() * * * 此时,也可以获取 Session * * 法一:this.getSessionFactory().getCurrentSession() * 法二:... */ }
} |
(5)拆分后的
Spring 核心配置文件
applicationContext-dao.xml:
|
<?xml <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- (1) --> <!-- 配置 C3P0 连接池 --> <bean <property <!-- jdbc:mysql:///ssh_db 是 jdbc:mysql://localhost:3306/ssh_db 的简写 --> <property <property <property </bean>
<!-- SessionFactory 对象的创建交给 Spring 进行管理 --> <bean class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <!-- 因为在 Hibernate 核心配置文件中,没有数据库配置, 而是在 Spring 的核心配置文件中进行配置,所以需要 注入 dataSource LocalSessionFactoryBean 中有相关属性,所以可以 注入 --> <property <!-- 指定 Hibernate 核心配置文件的位置 --> <property </bean>
<!-- (2) --> <!-- 配置事务管理器 HibernateTransactionManager --> <bean class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <!--注入 SessionFactory 对象 --> <property </bean>
<!-- 开启事务注解 --> <tx:annotation-driven
<!-- (3) --> <!-- 配置 Dao 实现类对象 --> <bean <!-- 注入 SessionFactory 对象 --> <property </bean>
</beans> |
9、创建子模块
ssh-service


注意:打包方式(Packaging)要选择 jar
10、子模块
ssh-service 目录结构一览:

(1)当前子模块的核心配置文件
pom.xml:
|
<project 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>
<parent> <groupId>com.siwuxie095.ssh</groupId> <artifactId>ssh-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
<artifactId>ssh-service</artifactId>
<!-- ssh-service 依赖于 ssh-dao,所以添加 ssh-dao 依赖
注意:由于添加了 ssh-dao 依赖,在对 ssh-service 执行 compile、test、install 等命令之前,必须先将 ssh-parent 安装(install)到本地仓库,否则这些命令 将执行失败 --> <dependencies> <dependency> <groupId>com.siwuxie095.ssh</groupId> <artifactId>ssh-dao</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies>
</project> |
(2)Service 类
UserService.java:
|
package com.siwuxie095.service; import org.springframework.transaction.annotation.Transactional; import com.siwuxie095.dao.UserDao; import com.siwuxie095.entity.User; @Transactional public class UserService {
private UserDao userDao;
public this.userDao = userDao; } public userDao.add(user); }
} |
(3)拆分后的
Spring 核心配置文件
applicationContext-service.xml:
|
<?xml <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 配置 Service 对象 --> <bean <property </bean>
</beans> |
11、创建子模块
ssh-web


注意:打包方式(Packaging)要选择 war
12、子模块
ssh-web 目录结构一览:

(1)当前子模块的核心配置文件
pom.xml:
|
<project 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>
<parent> <groupId>com.siwuxie095.ssh</groupId> <artifactId>ssh-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
<artifactId>ssh-web</artifactId> <packaging>war</packaging>
<!-- ssh-web 依赖于 ssh-service,所以添加 ssh-service 依赖
注意:由于添加了 ssh-service 依赖,在对 ssh-web 执行 compile、test、install 等命令之前,必须先将 ssh-parent 安装(install)到本地仓库,否则这些命令 将执行失败 --> <dependencies> <dependency> <groupId>com.siwuxie095.ssh</groupId> <artifactId>ssh-service</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies>
</project> |
(2)JSP 页面
add.jsp:
|
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" <html> <head> <meta <title>添加用户</title> </head> <body>
<form 用户名:<input 地址:<input <input </form>
</body> </html> |
succ.jsp:
|
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" <html> <head> <meta <title>添加成功</title> </head> <body>
<h1>添加成功!<a
</body> </html> |
(3)Action 类
UserAction.java:
|
package com.siwuxie095.action; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import com.siwuxie095.entity.User; import com.siwuxie095.service.UserService; public class UserAction extends ActionSupport implements ModelDriven<User> { private User user=new User();
@Override public User getModel() { return user; }
private UserService userService;
public this.userService = userService; }
public String add() { userService.add(user); return } } |
(4)拆分后的
Spring 核心配置文件
applicationContext-action.xml:
|
<?xml <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 配置 Action 对象 --> <!-- 注意:由于 Action 对象是多实例的,所以服务器启动时, 不会被创建,只有在访问时,才会被创建 --> <bean <property </bean>
</beans> |
(5)Struts2 核心配置文件
struts.xml:
|
<?xml <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<package
<action <result </action>
</package> </struts> |
(6)部署描述文件
web.xml:
|
<?xml <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <display-name>ssh-web</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list>
<!-- 配置 Struts2 的核心过滤器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter>
<filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
<!-- 配置 Spring 的监听器 ContextLoaderListener --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
<!-- 配置 Spring 核心配置文件的位置(路径)
classpath 和 classpath* 的区别: (1) classpath 只会到指定的 class 路径下查找文件 (2) classpath* 不仅包括 class 路径,还包括 jar 包中,都会去查找文件
applicationContext-*.xml 即 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:applicationContext-*.xml</param-value> </context-param>
</web-app> |
13、至此,父项目和子模块创建完毕。父项目此时的目录
结构如下:

14、将父项目安装(install)到本地仓库中,否则子模块
之间的依赖无法生效。当然,也可按照创建顺序,依次将
父项目和子模块安装到本地仓库
15、最后,运行项目的两种方式
(1)运行父项目
ssh-parent(建议)
父项目
ssh-parent 将子模块聚合到一起。如果子模块内容有
所修改,不必立即安装到本地仓库,父项目将自动聚合并使用
最新代码执行
(2)运行子模块
ssh-web
子模块
ssh-web 将从本地仓库下载依赖的 jar 包,如果依赖
的其它子模块内容有所修改,必须及时安装到本地仓库
16、访问路径
http://localhost:8080/ssh-web/add.jsp
【made by siwuxie095】
Maven项目的拆分与聚合的更多相关文章
- Maven 通过maven对项目进行拆分、聚合(重点)
对现在已有maven ssh项目进行拆分,拆分思路:将dao层的代码已经配置文件全体提取出来到一个表现上独立的工程中.同样service.action拆分. ssh-parent: 父工程 ssh-d ...
- maven工程的拆分与聚合
1.创建父工程: 首先创建maven Project: 点击next,进入下一个页面,勾选上create a simple project: 点击next,进入下一页面,在这里与创建普通maven工程 ...
- maven(二) maven项目构建ssh工程(父工程与子模块的拆分与聚合)
前一节我们明白了maven是个什么玩意,这一节就来讲讲他的一个重要的应用场景,也就是通过maven将一个ssh项目分割为不同的几个部分独立开发,很重要,加油 --WH 一.maven父工程与子模块的拆 ...
- 转帖:maven(二) maven项目构建ssh工程(父工程与子模块的拆分与聚合)
出处:http://www.cnblogs.com/whgk/p/7121336.html 前一节我们明白了maven是个什么玩意,这一节就来讲讲他的一个重要的应用场景,也就是通过maven将一个ss ...
- maven项目的聚合与继承
maven项目的聚合与继承: 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模 ...
- Eclipse搭建maven项目的流程,聚合所有的子模块项目
Eclipse搭建maven项目的流程 2018年03月01日 15:47:03 阅读数:22 1:搭建parent工程,用来聚合所有的子模块项目 2:搭建公共使用的模块common 这里你要点击空白 ...
- eclipse 创建聚合maven项目
本人不想花太多时间去排版,所以这里排版假设不好看,请多多包涵! 一直都在用maven,可是却基本没有自己创建过maven项目,今天也试着创建一个. 1.打开eclipse.然后new,other,然后 ...
- Maven项目继承与聚合
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6628534.html 一:继承 在Java编程中,如果多个类都使用到了相同的内容.方法时,我们可以用继承的方 ...
- 一个多maven项目聚合的实例
本文转载自:http://my.oschina.net/xuqiang/blog/99854 本文介绍一个多maven项目的实例demo,展示了聚合.继承.工程依赖.单元测试.多war聚合.cargo ...
随机推荐
- appium 3-4-1034等待、日志、性能数据、xpath定位、web driver协议
1.等待 1.1精确等待 sleep 不推荐 @Test public void testWait1() throws InterruptedException{ day_time(); Thread ...
- elasticsearch 复杂查询小记
以下接口调用都基于5.5版本 JSON 文档格式 { "_index": "zipkin-2017-09-06", "_type": &qu ...
- ExtJS模版技术
学习ExtJS一段时间以后,大家基本都会对于一些显示数据的组件不太符合需求,可能自己需要的组件在ExtJS里面不存在,这是大家基本就会使用Html属性,直接使用Html进行绘制页面数据展现. 但是,使 ...
- storm的定时任务
应用场景: 第一种方法 参考代码StormTopologyTimer1.java package yehua.storm; import java.util.Map; import org.apach ...
- 那些你希望N年前就掌握的命令
这篇文章转载自黑客志,短短的一篇文章我找到了3个对我非常有用的技巧,在信息爆炸的今天,简直就跟捡宝似的,希望这些命令对你也有帮助. 有人在Reddit上发帖询问:有没有哪条命令是你希望自己在几年前就掌 ...
- Fork-Join分治编程介绍(一)
一.Fork-Join 框架介绍 1. 什么是 Fork-Join 分治编程框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每 ...
- 使用Larave5.6l提交POST请求出现The page has expired due to inactivity错误
使用Larave5.6l提交POST请求出现The page has expired due to inactivity错误 一般是由于没有添加 csrf造成的 在表单下面的 第一个行 添加如下代码即 ...
- hbase 简介
hbase是hadoop的数据库,能够对大数据提供随机实时的读写访问功能,具有开源,分布式,可扩展行,面向列存储的特点.hbase的目标是存储并处理大量的数据. 它可以直接使用本地文件系统,也可以使用 ...
- leetcode492
public class Solution { public int[] ConstructRectangle(int area) { Dictionary<int, int> dic = ...
- mvc框架路由原理
到目前为止已经使用过很多php框架,比如:Zendframework,ThinkPHP,YII,Slim.但还未静下心来研究过框架的原理. 今天首先来看一下mvc框架中路由的原理: 所谓路由,就是程序 ...