Maven工程的拆分与聚合(重点)
一个完整的早期开发好的crm项目,现在要使用maven工程对它进行拆分,这时候就可以将dao拆解出来形成表现独立的工程,同样service,action也都这样拆分
工程拆分之后,将来还要聚合(聚合就是将拆分的工程进一步组合在一起,又形成一个完整的项目)
为了达到聚合的目标,所以今天会引入
父工程(maven project)
子模块(maven module) dao ,service, web
开发步骤:
-
新建项目,和之前一样,在这里只标注不一样的地方,项目命名
ssh_parent
父工程目录结构
从它的目录结构可以看出,父工程本身不写代码,它里面有一个pom.xml文件,这个文件可以将多个子模块中通用的jar所对应的坐标,集中在父工程中配置,将来的子模块就可以不需要在pom.xml中配置通用jar的坐标了 -
如何创建父工程的子模块
再次查看父工程的pom.xml文件
4.0.0
com.huachao
ssh_parent
0.0.1-SNAPSHOT
pom
ssh_dao
- 查看子模块的pom.xml,发现多了一个 parent结点
com.huachao
ssh_parent
0.0.1-SNAPSHOT
并且内部所包含的结点,其实就是父工程的坐标
坐标=groupId+artifactId+version
组织名 项目名 版本
- 在父工程
ssh_parent
的pom.xml
中,添加struts2和hibernate的jar
查看依赖包
发现在struts2
和hibernate
中有javassist
,存在包冲突的问题
解决方案一:排除依赖
解决包冲突问题,我们需要屏蔽掉strutrs
中低版本的javassist
步骤:
在javassist:3.11.0.GA
上右键点击------>Exclude Maven Artifact
最后点击保存,会自动刷新
查看pom.xml是怎么处理的
加了exclusions
标签
解决方案二:依赖调节原则
maven自动按照下边的原则调解:
- 第一声明者优先原则
在pom文件定义依赖,先声明的依赖为准。就是谁在前面声明,就依赖谁 - 路径近者优先原则
例如:A依赖 spirng-beans-4.2.4,A依赖B,B依赖 spirng-beans-3.0.5,则spring-beans-4.2.4优先被依赖在A中,因为spring-beans-4.2.4相对spirng-beans-3.0.5被A依赖的路径最近。
解决冲突一般做法:
- 排除依赖,使用
exclusions
和exclusion
标签,图形化操作参考上面
org.springframework
spring-beans
org.springframework
spring-context
- 锁定版本
面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中,此方法在企业开发中常用。
如下的配置是锁定了spring-beans和spring-context的版本:
org.springframework
spring-beans
4.2.4.RELEASE
org.springframework
spring-context
4.2.4.RELEASE
注意:在工程中锁定依赖的版本并不代表在工程中添加了依赖,如果工程需要添加锁定版本的依赖则需要单独添加
标签,如下:
org.springframework
spring-beans
org.springframework
spring-context
上边添加的依赖并没有指定版本,原因是已在
中锁定了版本,所以在
下不需要再指定版本。
一份已经调好的框架的jar包的pom.xml(项目中可以直接使用)
4.0.0
com.huachao
ssh_parent
0.0.1-SNAPSHOT
pom
ssh_dao
ssh_service
ssh_web
4.2.4.RELEASE
2.3.24
5.0.7.Final
1.6.6
1.2.12
1.2.3
3.0.1
0.9.1.2
5.1.6
org.springframework
spring-context
${spring.version}
org.springframework
spring-aspects
${spring.version}
org.springframework
spring-orm
${spring.version}
org.springframework
spring-test
${spring.version}
org.springframework
spring-web
${spring.version}
org.hibernate
hibernate-core
${hibernate.version}
org.apache.struts
struts2-core
${struts2.version}
org.apache.struts
struts2-spring-plugin
${struts2.version}
org.apache.httpcomponents
httpclient
4.4
com.alibaba
fastjson
1.1.37
commons-beanutils
commons-beanutils
1.9.1
commons-fileupload
commons-fileupload
1.3.1
jstl
jstl
1.2
org.aspectj
aspectjweaver
1.6.8
org.springframework
spring-aop
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-orm
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-core
${spring.version}
org.apache.struts
struts2-core
${struts2.version}
javassist
javassist
org.apache.struts
struts2-spring-plugin
${struts2.version}
org.apache.struts
struts2-json-plugin
${struts2.version}
org.apache.struts
struts2-convention-plugin
${struts2.version}
org.hibernate
hibernate-core
${hibernate.version}
org.hibernate
hibernate-entitymanager
${hibernate.version}
org.hibernate
hibernate-validator
5.2.1.Final
c3p0
c3p0
${c3p0.version}
log4j
log4j
${log4j.version}
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
commons-lang
commons-lang
2.6
org.codehaus.xfire
xfire-core
1.2.6
dom4j
dom4j
1.6
junit
junit
3.8.1
test
mysql
mysql-connector-java
${mysql.version}
javax.servlet
servlet-api
2.5
provided
javax.servlet.jsp
jsp-api
2.0
provided
net.sf.ehcache
ehcache-core
2.6.6
crmssh
org.apache.maven.plugins
maven-compiler-plugin
3.2
1.7
UTF-8
true
依赖关系
依赖具有传递性,但不是无限传递的,传递的规则如下:
解决方法:
如果在依赖传递过程中,导致jar包丢失,我们的做法很简单,就是再导入一次坐标
Maven整合SSH框架
父工程与Dao的Module整合
- 新建
Maven Project
,名称为ssh_parent
,打包类型选择pom
,pom.xml
使用上面已经调好的配置 - 新建
Maven Module
,名称为ssh_dao
项目,Parent Project
选择ssh_parent
,打包类型选择jar
- 编写Customer的实例,已经对应的hibernate映射文件
package com.huachao.crm.domain;
import java.io.Serializable;
/**
* po的规范 (Persistent Object 持久化对象)
* 1.公有类
* 2.私有属性
* 3.公有的getter与setter
* 4.不能使用final修饰
* 5.提供默认无参构造
* 6.如果是基本类型,就写它对应的包装类
* 7.一般都要实现java.io.Serializable
* @author Administrator
*/
public class Customer implements Serializable {
private Long custId;
private String custName;
private Long custUserId;
private Long custCreateId;
private String custIndustry;
private String custLevel;
private String custLinkman;
private String custPhone;
private String custMobile;
public Long getCustId() {
return custId;
}
public void setCustId(Long custId) {
this.custId = custId;
}
public String getCustName() {
return custName;
}
public void setCustName(String custName) {
this.custName = custName;
}
public Long getCustUserId() {
return custUserId;
}
public void setCustUserId(Long custUserId) {
this.custUserId = custUserId;
}
public Long getCustCreateId() {
return custCreateId;
}
public void setCustCreateId(Long custCreateId) {
this.custCreateId = custCreateId;
}
public String getCustIndustry() {
return custIndustry;
}
public void setCustIndustry(String custIndustry) {
this.custIndustry = custIndustry;
}
public String getCustLevel() {
return custLevel;
}
public void setCustLevel(String custLevel) {
this.custLevel = custLevel;
}
public String getCustLinkman() {
return custLinkman;
}
public void setCustLinkman(String custLinkman) {
this.custLinkman = custLinkman;
}
public String getCustPhone() {
return custPhone;
}
public void setCustPhone(String custPhone) {
this.custPhone = custPhone;
}
public String getCustMobile() {
return custMobile;
}
public void setCustMobile(String custMobile) {
this.custMobile = custMobile;
}
}
Customer.hbm.xml
-
CustomerDao
接口和实现类
package com.huachao.crm.dao;
import java.util.List;
import com.huachao.crm.domain.Customer;
public interface CustomerDao {
/**
* 查询出Customer 表中的所有记录
* @return
*/
public List findAll();
}
package com.huachao.crm.dao.imp;
import java.util.List;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import com.huachao.crm.dao.CustomerDao;
import com.huachao.crm.domain.Customer;
public class CustomerDaoImp extends HibernateDaoSupport implements CustomerDao{
@Override
public List findAll() {
return (List) this.getHibernateTemplate().find("from Customer");
}
}
hibernate.cfg.xml
org.hibernate.dialect.MySQLDialect
true
false
update
true
none
log4j.properties
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=info, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
applicationContext-dao.xml
- 测试方法
package cn.huachao.test;
import java.util.List;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.huachao.crm.dao.CustomerDao;
import com.huachao.crm.domain.Customer;
public class CustomerTest {
@Test
public void testFindAll(){
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext-dao.xml");
CustomerDao customerDao = (CustomerDao) ac.getBean("customerDao");
List list = customerDao.findAll();
System.out.println(list.size());
}
}
- 测试在
testFindAll
方法上右键----->Run As----->Junit Test
与Service的Module整合
新建
Maven Module
,名称为ssh_service
项目,Parent Project
选择ssh_parent
,打包类型选择jar
-
在
ssh_service
需要使用ssh_dao
中Customer的实例类和方法,需要导入ssh_dao
的jar包
在ssh_service
的pom.xml
中
CustomerService
接口和实现类
package com.huachao.crm.service;
import java.util.List;
import com.huachao.crm.domain.Customer;
public interface CustomerService {
/**
* 查询所有客户列表
*
* @return
*/
public List findAll();
}
package com.huachao.crm.service.impl;
import java.util.List;
import com.huachao.crm.dao.CustomerDao;
import com.huachao.crm.domain.Customer;
import com.huachao.crm.service.CustomerService;
public class CustomerServiceImpl implements CustomerService {
//注值
private CustomerDao customerDao;
public void setCustomerDao(CustomerDao customerDao) {
this.customerDao = customerDao;
}
public List findAll() {
return customerDao.findAll();
}
}
applicationContext-service.xml
与Web的Module整合
- 新建
Maven Module
,名称为ssh_web
项目,Parent Project
选择ssh_parent
,打包类型选择war
- 新建完报错,在
Deployed Resources/webapp
下新建WEB-INF/web.xml
contextConfigLocation
classpath:applicationContext.xml
org.springframework.web.context.ContextLoaderListener
openSessionInViewFilter
org.springframework.orm.hibernate5.support.OpenSessionInViewFilter
singleSession
true
sessionFactoryBeanName
sessionFactory
openSessionInViewFilter
/*
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
-
在
ssh_web
需要使用ssh_service
中类和方法,需要导入ssh_service
的jar包
在ssh_web
的pom.xml
中
编写
CustomerAction
package com.huachao.crm.action;
import java.util.List;
import com.huachao.crm.domain.Customer;
import com.huachao.crm.service.CustomerService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class CustomerAction extends ActionSupport {
private static final long serialVersionUID = -4325471976423944510L;
private CustomerService customerService;
public void setCustomerService(CustomerService customerService) {
this.customerService = customerService;
}
@Override
public String execute() throws Exception {
List list = customerService.findAll();
System.out.println(list.size());
ActionContext.getContext().put("list", list);
return SUCCESS;
}
}
applicationContext-web.xml
struts.xml
/success.jsp
- spring配置文件整合,
applicationContext.xml
- 在
Deployed Resources/webapp
下新建success.jsp
,查询成功跳转到该界面
从域中取出数据,显示出来
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
${list }
运行的第一种方式
-
添加项目到Tomcat
-
添加
ssh_web
项目
-
Degbug 运行,或者Start运行
访问路径
http://localhost:8080/crmssh/crm