SSM分布式开发淘淘商城 - Maven构建系统(00)
概述
Maven构建系统的目的是用Maven管理SSM项目,把项目拆分,再聚合,并能在项目启动的时候加载相应的配置文件实现系统的运转。
拆分
最简单的拆分方式是按照三层架构来拆分项目,但是还可以在三层架构的基础上进行下一步的拆分,所以接下来的讲解不按照简单三层结构接叙述。
-
首先就是有一个父工程,它管理jar包的版本,Maven插件的版本等,是一个聚合工程。但是接下来不再按照三层架构的方式,而是分成服务层和表现层等工程。
- 首先任何一个项目都不会缺少的就是工具类,所以把工具类单独提取出来,成为一个子工程,打包方式是jar包。
- 在服务层中,完成的功能其实是原始三层架构中的Dao层和Service层的功能。它也是一个聚合工程,其下有四个子工程。
- 在Dao层中,由于我们使用Mybatis开发,pojo可以自动生成,所以我们把pojo单独提出来成为一个子工程。
- Mybatis的动态代理开发中接口和Mappers.xml需要在同一路径下,所以我们把这两个打包成一个子工程。
- 在Service中,我们把接口和实现类分来,为什么呢?因为整个服务层工程都是使用Spring进行管理,所以在项目启动的时候我们必须加载web.xml文件,所以必须得要一个Java EE工程,这个实现类就是Java EE工程,被打包成war。
- 剩下的接口单独是一个Java工程,打包成jar。
- 在表现层中,完成的是Web层的功能,自然这个也是war包。它调用服务层中的Service层的接口就可以了。
聚合
创建Java Working Set
为了能更方便的管理项目,我们创建一个Java Working Set来管理我们这次开发要使用的所有项目。虽然是某智培训班的项目学习,但是我们不使用taotao,而是起了个名称叫BlackBoard,简称bb。
输入BlackBoard,然后Finish,我们就创建了一个Working Set。
选择我们创建的Working Set,把所有的项目都放在这个下面。
工程构建
按照下图构建相应的工程和子工程(必须保证你之前学习过Maven,知道如何创建和配置Maven工程)。
配置pom文件
- 配置bb-parent
父工程本身就是用来进行依赖的管理,所以其中包含版本的管理,依赖的锁定,Maven插件等。这里如果配置了全局的Java编译环境,则不需要再配置Java编译环境。否则需要配置一下,不然JRE版本会是1.5。、
下面是某智培训班给的一个父工程配置文件,包含了我们需要的大多数依赖。
<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.zjhstudy</groupId>
<artifactId>bb-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<!-- 集中定义依赖版本号 -->
<properties>
<junit.version>4.12</junit.version>
<spring.version>4.2.4.RELEASE</spring.version>
<mybatis.version>3.2.8</mybatis.version>
<mybatis.spring.version>1.2.2</mybatis.spring.version>
<mybatis.paginator.version>1.2.15</mybatis.paginator.version>
<mysql.version>5.1.32</mysql.version>
<slf4j.version>1.6.4</slf4j.version>
<jackson.version>2.4.2</jackson.version>
<druid.version>1.0.9</druid.version>
<httpclient.version>4.3.5</httpclient.version>
<jstl.version>1.2</jstl.version>
<servlet-api.version>3.1.0</servlet-api.version>
<jsp-api.version>2.0</jsp-api.version>
<joda-time.version>2.5</joda-time.version>
<commons-lang3.version>3.3.2</commons-lang3.version>
<commons-io.version>1.3.2</commons-io.version>
<commons-net.version>3.3</commons-net.version>
<pagehelper.version>3.4.2-fix</pagehelper.version>
<jsqlparser.version>0.9.1</jsqlparser.version>
<commons-fileupload.version>1.3.1</commons-fileupload.version>
<jedis.version>2.7.2</jedis.version>
<solrj.version>4.10.3</solrj.version>
<dubbo.version>2.5.3</dubbo.version>
<zookeeper.version>3.4.7</zookeeper.version>
<zkclient.version>0.1</zkclient.version>
<activemq.version>5.13.0</activemq.version>
<freemarker.version>2.3.23</freemarker.version>
<quartz.version>2.2.2</quartz.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- 时间操作组件 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${joda-time.version}</version>
</dependency>
<!-- Apache工具组件 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>${commons-net.version}</version>
</dependency>
<!-- Jackson Json处理工具包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${httpclient.version}</version>
</dependency>
<!-- quartz任务调度框架 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- 日志处理 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<dependency>
<groupId>com.github.miemiedev</groupId>
<artifactId>mybatis-paginator</artifactId>
<version>${mybatis.paginator.version}</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</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-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- JSP相关 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp-api.version}</version>
<scope>provided</scope>
</dependency>
<!-- 文件上传组件 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
<!-- Redis客户端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
<!-- solr客户端 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>${solrj.version}</version>
</dependency>
<!-- dubbo相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>${activemq.version}</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>${freemarker.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- 资源文件拷贝插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
<!-- 配置打包时跳过测试 ,首次配置使用的时候会自动联网进行下载 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
- 配置bb-common
在common中,我们需要配置处理数据的一些依赖。不需要配置Spring,它不被Spring管理。<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.zjhstudy</groupId> <artifactId>bb-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <groupId>com.zjhstudy</groupId> <artifactId>bb-common</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 依赖工具类的jar包 --> <dependencies> <!-- 时间操作组件 --> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> </dependency> <!-- Apache工具组件 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> </dependency> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> </dependency> <!-- Jackson Json处理工具包 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <!-- httpclient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> <!-- quartz任务调度框架 --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> </dependency> <!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <!-- 日志处理 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> </dependencies> </project>
- 配置bb-manager
在bb-manager中,管理着四个子工程,所以这个工程里要加入它的四个子工程的公共依赖,也就是bb-common。<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.zjhstudy</groupId> <artifactId>bb-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <groupId>com.zjhstudy</groupId> <artifactId>bb-manager</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <dependencies> <dependency> <groupId>com.zjhstudy</groupId> <artifactId>bb-common</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> </project>
- 配置bb-manager-pojo
它的配置是最简单的,本身只需要配置bb-common就可以,但是我们把bb-common配置到它父亲里面了,所以配置文件里不用配置依赖。<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.zjhstudy</groupId> <artifactId>bb-manager</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>bb-manager-pojo</artifactId> </project>
- 配置bb-manager-dao
这个就是操作数据库的子工程,里面肯定有pojo和Mybatis相关的依赖。问题是需不需要Spring?我们知道dao层肯定要交给Spring管理,但是实际上我们不需要配置Spring,因为它最终会打成jar包被service层依赖,在service中配置Spring就可以了。
<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.zjhstudy</groupId>
<artifactId>bb-manager</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>bb-manager-dao</artifactId>
<!-- 依赖的jar包 -->
<dependencies>
<dependency>
<groupId>com.zjhstudy</groupId>
<artifactId>bb-manager-pojo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
<dependency>
<groupId>com.github.miemiedev</groupId>
<artifactId>mybatis-paginator</artifactId>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
</dependencies>
</project>
- 配置bb-manager-interface
它只是接口,但是接口需要返回值,我们需要配置bb-manager-pojo就可以了。<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.zjhstudy</groupId> <artifactId>bb-manager</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>bb-manager-interface</artifactId> <dependencies> <dependency> <groupId>com.zjhstudy</groupId> <artifactId>bb-manager-pojo</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> </project>
- 配置bb-manager-service
它是war包,所以肯定需要配置Spring,同时实现接口需要配置bb-manager-interface。<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.zjhstudy</groupId> <artifactId>bb-manager</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>bb-manager-service</artifactId> <packaging>war</packaging> <dependencies> <!-- bb dao依赖 --> <dependency> <groupId>com.zjhstudy</groupId> <artifactId>bb-manager-dao</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- bb的接口的依赖 --> <dependency> <groupId>com.zjhstudy</groupId> <artifactId>bb-manager-interface</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- spring的依赖 --> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> </dependencies> </project>
- 配置bb-manager-web
bb-manager-web需要和用户打交道,所以需要配置Spring和JSP,它需要依赖service层,但是我们把bb-manager-interface拿过来就可以了。<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.taotao</groupId> <artifactId>taotao-manager</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>taotao-manager-service</artifactId> <packaging>war</packaging> <dependencies> <!-- bb dao依赖 --> <dependency> <groupId>com.zjhstudy</groupId> <artifactId>bb-manager-dao</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- bb的接口的依赖 --> <dependency> <groupId>com.zjhstudy</groupId> <artifactId>bb-manager-interface</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- spring的依赖 --> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> </dependencies> </project>
配置tomcat插件
由于我们有两个war包,所以需要配置两次tomcat插件,一个要配置在bb-manager-web中,但是另一个却不配置在bb-manager-service中,因为配置在这里面我们必须在启动的时候保证它所依赖的所有的包都是最新的,也就是每次都得手动install bb-manager-pojo、bb-manager-dao和bb-manager-interface。
<!-- 配置tomcat插件 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
启动
测试代码
我们刚才构建了项目的结构,所以接下来就是测试看看我们的项目能否正常启动。
在bb-manager-web中写servlet。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns="/hello")
public class Hello extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/NewFile.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
创建一个jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
使用Maven 启动了SSM项目
</body>
</html>
启动
在启动的时候我们需要先把bb-parent和bb-common都install到本地仓库中,因为最终和用户打交道的是bb-manager-web,bb-parent是它的父工程,肯定要先于它存在,common是它的依赖,也要先于它存在。但是对于bb-manager-pojo、bb-manager-dao和bb-manager-interface就不再需要手动install了,因为我们把bb-manager-web的tomcat插件配置在bb-manager中,我们直接在这个中启动项目,它会跳过非war包,但是会把跳过的加载到仓库中。在启动的时候,由于依赖关系,我么需要先启动bb-manger,再启动bb-manager-web。
附录
上面的是一个大致的流程,根据电脑环境的差异,或者API版本的差异可能完全按照上面的配置,项目不能构建成功,但是如果对Maven有了解,应该可以很快的修改错误。
这篇文章没有如何配置SSM项目,只是说Maven如何构建一个项目。下一篇是配置SSM项目,在启动时能加载所有的配置文件,实现系统的运行。