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 ...
随机推荐
- hdu 1966 Pie
Pie Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- mysqldump备份脚本---待完善
1. 建立备份文件存放目录:/backup/mysql 2. 编写备份脚本: # vim ~/bak.sh ## 写入如下内容: #! /bin/bash DB1_NAME="db1&quo ...
- java study3
面向过程与面向对象 面向过程:必须了解整个过程,每个步骤互成因果关系,每个因果关系都构成一个步骤,多个步骤就构成了一个系统.因为存在因果关系,每隔步骤难以分离,非常紧密,当任何一步出现问题,将会影响到 ...
- [UE4]蓝图重构
假设现在有一个蓝图类BP_GunRife(已经有其它很多类在使用这个类),现在要增加另外一把枪BP_BunLauncher. 可以新建一个父类BP_Gun,让BP_GunRife和BP_BunLaun ...
- [UE4]产生开枪特效
- 统计numpy数组中每个值的个数
import numpy as np from collections import Counter data = np.array([1.1,2,3,4,4,5]) Counter(data) #简 ...
- 编写函数digit(num, k),函数功能是:求整数num从右边开始的第k位数字的值,如果num位数不足k位则返回0。
function digit(num,k){ var knum = 0; for(var i=1; i<=k; i++){ knu ...
- Python日志配置类
# -*- coding: utf-8 -* """日志工具类 author: Jill usage: from common.logger import Log log ...
- socket编程一些注意的东西
帮一个同学做了一下面试的作业.主要是socket编程要写一个多人博彩游戏室.没注意,被一些地方坑了一下,而且其实如果没有这个概念,还不好发现. 1.readLine() http://blog.csd ...
- MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
优化应该不仅仅是数据库方面使用高性能的服务器多使用缓存页面服务器.数据库服务器.图片服务器.上传下载服务器分离数据库集群,表分割(水平分割和垂直分割)和表散列负载均衡重视每个代码开发细节,特别是大循环 ...