将Maven-SSM项目以层为单位拆分,按模块开发
1.创建父项目,在父项目中加入依赖;
<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>com.sikiedu</groupId> <artifactId>MavenSSM2</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <properties> <!-- lib version --> <spring.version>5.0.8.RELEASE</spring.version> <mybais.version>3.4.6</mybais.version> <mybatis-spring.version>1.3.2</mybatis-spring.version> <mysql-connector.version>5.1.46</mysql-connector.version> <ojdbc7.version>12.1.0.2.0</ojdbc7.version> <druid.version>1.0.16</druid.version> <aopalliance.version>1.0</aopalliance.version> <aspectj.weaver.version>1.6.4.RELEASE</aspectj.weaver.version> <commons.logging.version>1.1.1</commons.logging.version> <jstl.version>1.2</jstl.version> <log4j.version>1.2.16</log4j.version> <slf4j-api.version>1.6.1</slf4j-api.version> <slf4j-nop.version>1.6.4</slf4j-nop.version> <fileupload.version>1.3.1</fileupload.version> <jackson.version>2.9.6</jackson.version> <servlet-api.version>8.5.32</servlet-api.version> <jsp-api.version>8.5.32</jsp-api.version> <!-- plugins version --> <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version> <tomcat7-maven-plugin.version>2.2</tomcat7-maven-plugin.version> </properties> <!-- 锁定版本, --> <dependencyManagement> <dependencies> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!-- spring end --> <!-- mybais --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybais.version}</version> </dependency> <!-- mybatis - spring 整合包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis-spring.version}</version> </dependency> <!-- json --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <!-- json end --> </dependencies> </dependencyManagement> <dependencies> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> </dependency> <!-- spring end --> <!-- mybais --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </dependency> <!-- mybatis - spring 整合包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql-connector.version}</version> </dependency> <dependency> <groupId>cn.easyproject</groupId> <artifactId>ojdbc7</artifactId> <version>${ojdbc7.version}</version> </dependency> <!-- mysql end --> <!-- 阿里巴巴的数据库连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <!-- aop --> <dependency> <groupId>aopalliance</groupId> <artifactId>aopalliance</artifactId> <version>${aopalliance.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>com.springsource.org.aspectj.weaver</artifactId> <version>${aspectj.weaver.version}</version> </dependency> <!-- aop end --> <!-- logging --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>com.springsource.org.apache.commons.logging</artifactId> <version>${commons.logging.version}</version> </dependency> <!-- jsp标准标签库 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <!-- log --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j-api.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-nop</artifactId> <version>${slf4j-nop.version}</version> </dependency> <!-- log end --> <!--文件上传--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>${fileupload.version}</version> </dependency> <!-- json --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <!-- json end --> <!-- servlet-api 8.5.32 --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-servlet-api</artifactId> <version>${servlet-api.version}</version> <scope>provided</scope> </dependency> <!-- jsp-api 8.5.32 --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jsp-api</artifactId> <version>${jsp-api.version}</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin.version}</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>${tomcat7-maven-plugin.version}</version> <configuration> <url>http://localhost:8080/manager/text</url> <username>joey</username> <password>123123</password> </configuration> </plugin> </plugins> <!-- 配置文件放行 --> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <!-- 放行main/resources下的配置文件 如果不放行spring mybatis等配置文件不会被打到包里从而导致错误 --> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build> </project>
2.创建mapper层子项目继承父项目;
3.maven-ssm-base/maven-ssm-mapper相关(此时没有bean对象,导致mapper.java中报错,可以根据第四步中先创建bean对象)
(1)在/maven-ssm-base/maven-ssm-mapper中添加/maven-ssm-base/maven-ssm-mapper/src/main/java/com/azuma/mapper/ItemMapper.java和/maven-ssm-base/maven-ssm-mapper/src/main/java/com/azuma/mapper/ItemMapper.xml
import java.util.List; import com.azuma.bean.ItemInfo; public interface ItemMapper { List<ItemInfo> getAllList(); }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.azuma.mapper.ItemMapper"> <select id="getAllList" resultType="ItemInfo"> SELECT * FROM item_info </select> </mapper>
(2)/maven-ssm-mapper/pom.xml中添加父类bean依赖
4./maven-ssm-base/maven-ssm-bean相关
(1)/maven-ssm-bean/src/main/java/com/azuma/bean/ItemInfo.java
/** * 游戏信息bean */ public class ItemInfo { //id private String item_id; //name private String item_name; //type private String item_type; //price private Double item_price; public String getItem_id() { return item_id; } public void setItem_id(String item_id) { this.item_id = item_id; } public String getItem_name() { return item_name; } public void setItem_name(String item_name) { this.item_name = item_name; } public String getItem_type() { return item_type; } public void setItem_type(String item_type) { this.item_type = item_type; } public Double getItem_price() { return item_price; } public void setItem_price(Double item_price) { this.item_price = item_price; } @Override public String toString() { return "ItemInfo [item_id=" + item_id + ", item_name=" + item_name + ", item_type=" + item_type + ", item_price=" + item_price + "]"; } }
(2)/maven-ssm-bean/src/main/java/com/azuma/bean/User.java(如果显示jdk有问题,重新构建jdk路径)
public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [username=" + username + ", password=" + password + "]"; } }
5.子项目可以继承父项目的依赖;
6.利用junit测试mapper模块项目;
(1)/maven-ssm-mapper/pom.xml中添加Junit依赖(设置scope属性一般是test)
(2)mapper接口右键新建example,搜索Junit,选择Junit4,然后放在src/test/java目录下,然后点击finish,会自动创建一个testjava类
(3)/maven-ssm-mapper/src/test/java/com/azuma/mapper/ItemMapperTest.java
package com.azuma.mapper; import static org.junit.Assert.*; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.azuma.bean.ItemInfo; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext_mapper.xml") public class ItemMapperTest { @Autowired private ItemMapper itemMapper; @Test public void test() { List<ItemInfo> allList = itemMapper.getAllList(); for (ItemInfo itemInfo : allList) { System.out.println("itemInfo = " + itemInfo); } } }
(4)右键运行test,看看能不能拿到数据库的数据
7.Maven的依赖传递,与依赖版本管理;
(1)依赖传递:添加依赖的jar包如果还依赖其他jar包,则在添加时会一起引入;
(2)依赖冲突:Base-project由3个子项目组成,A-project依赖Tools.jar 1.0版本,C-project依赖Tools.jar 2.0版本,根据依赖传递机制,Base-project将同时依赖Tools.jar两个版本,但这造成了冲突。根据路径最近获胜策略,该项目最终依赖Tools.jar 1.0,导致C-project无法调用getAll方法从而报错,因此我们要手动选择一个适合项目的版本。
(Maven模块化开发项目依赖关系)
(3)解决依赖冲突的办法:
a.直接声明:直接添加Tools.jar 2.0依赖;
b.排除:使用<dependency>标签中的<exclusions>标签排除A-project中的Tools.jar 1.0依赖;
例子:
c.依赖管理,版本锁定:<dependencyManagement>
i.<dependencyManagement>是依赖管理,该标签下添加的<dependencies>可以声明依赖,但是不会引入jar包;
ii.只有声明在<project>标签下<dependencies>中的依赖才会被引用到项目中;
iii.在<dependencyManagement>下添加jar包坐标后,<project>标签下<dependencies>标签的版本号可以忽略不写;
iv.< properties>标签可以自定义版本号,用el表达式赋值给<version>标签;
v.统一管理jar包版本,修改方便;
8. 创建scervice模块项目,利用junit测试service模块项目;
(1)新建一个maven Module,并继承父类,package选择jar包
(2)添加service.java
import java.util.List; import com.azuma.bean.ItemInfo; public interface ItemService { List<ItemInfo> getAllList(); }
(3)添加serviceimpl.java
import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.azuma.bean.ItemInfo; import com.azuma.mapper.ItemMapper; @Service public class ItemServiceImpl implements ItemService { @Autowired private ItemMapper itemMapper; @Override public List<ItemInfo> getAllList() { return itemMapper.getAllList(); } }
(4)添加service相关xml配置文件
a.applicationContext_service.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 开启注解扫描 --> <context:component-scan base-package="com.azuma.service"/> </beans>
b.applicationContext_transaction.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> <!-- 事务核心管理器 --> <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 开启注解事务 --> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>
(5)在service层的pom.xml导入mapper中导包
<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> <parent> <groupId>com.sikiedu.maven-ssm</groupId> <artifactId>maven-ssm-base</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>maven-ssm-service</artifactId> <dependencies> <dependency> <groupId>com.azuma.maven-ssm</groupId> <artifactId>maven-ssm-mapper</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> </project>
(6)在/maven-ssm-service/src/main/java/com/azuma/service/ItemServiceImpl.java中右键new other新建一个Junit测试,选择Junit4,放在/maven-ssm-service/src/test/java下
import static org.junit.Assert.*; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.azuma.bean.ItemInfo; @RunWith(SpringJUnit4ClassRunner.class) /*@ContextConfiguration(locations = {"classpath:applicationContext_service.xml", "classpath:applicationContext_mapper.xml"})*/ @ContextConfiguration("classpath*:applicationContext_*.xml") public class ItemServiceImplTest { @Autowired private ItemService itemService; @Test public void test() { List<ItemInfo> allList = itemService.getAllList(); for (ItemInfo itemInfo : allList) { System.out.println("itemInfo = " + itemInfo); } } }
(7)上一步如果新建Junit测试错误,因为Junit包没能导入service中,因为在mapper/pom.xml中的scope属性是test,无法传递给service,所以在service/pom.xml中添加Junit依赖包即可
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
(8)进行Junit测试即可
9.依赖作用域对依赖传递的影响;
10.创建controller模块项目,运行程序;
(1)新建一个Controller子类
(2)在WEB-INF下添加web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>MavenSSM1</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> <!-- 静态资源放行 --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> <url-pattern>*.ttf</url-pattern> <url-pattern>*.woff</url-pattern> <url-pattern>*.js</url-pattern> <url-pattern>*.png</url-pattern> <url-pattern>*.jpg</url-pattern> <url-pattern>*.gif</url-pattern> </servlet-mapping> <!-- 过滤器 解决表单post提交乱码问题 --> <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <!-- 拦截全部 /* --> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:applicationContext_*.xml</param-value> </context-param> <!-- 配置springmvc前端控制器 和读取配置文件 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!-- 读取配置文件 --> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- / --> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
(3)报错的话,配置一下jdk
(4)/maven-ssm-controller/pom.xml中导入service的jar包
<dependency> <groupId>com.azuma.maven-ssm</groupId> <artifactId>maven-ssm-service</artifactId> <version>0.0.1</version> </dependency>
(5)在/maven-ssm-controller/src/main/webapp/WEB-INF/jsp下,添加相关jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <c:forEach items="${itemList }" var="item"> <label>${item.item_name }</label> <label>${item.item_type }</label> </c:forEach> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 用户名:<label>${User.username }</label> 密码:<label>${User.password }</label> </body> </html>
(6)给/maven-ssm-controller配置一个jdk,以免报错
(7)启动tomcat进行测试,右键项目run as-maven install--clean tomcat7:deploy(第一次部署)
(8)出来可以在maven-ssm-controller运行该项目,也可以在父类项目中运行该项目