Maven对ssh项目的拆分、聚合与调试

来源:互联网 发布:行助手检测不到网络 编辑:程序博客网 时间:2024/06/06 14:11

   Maven是一个项目管理工具,使用maven对java项目进行构建、依赖管理可以是项目工程分块快发,测试运行更加便利。   Maven的最主要的优点是依赖管理(管理Jar包)和一键构建(一个命令完成编译、测试、运行、打包、部署、运行)。本文我们主要来实验一把如何通过Maven对一个原有的基于SSH的普通项目进行拆分和聚合,改变为一个Maven管理的SSH项目。   这里使用的原有项目是CRM(客户关系管理系统),按照常规的MVC理念,我们在使用Maven管理CRM时可以占时简单的划分DAO、SERVICE、WEB这三个子模块。   下图是CRM的文件结构:

这里写图片描述


下面开始Maven的整合:

  1. 创建Maven项目。

            我们将这个项目定为父工程,主要负责统筹各个子模块以及管理各个子模块公共的资源,负责总的工程配置。 

    进入Eclipse——>新建——>Maven Project.
    这里写图片描述

这里写图片描述

这里写图片描述

    1.1 .在crm_ssh_parent的pom.xml中配置子工程中重复的pom内容,通常包括锁定依赖版本、设置编译版本、tomat运行插件,例如Strutus 、Spring 、Hibernate等项目共用的Jar文件坐标,如:
<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>cn.itcast.crm</groupId>  <artifactId>crm_ssh_parent</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>pom</packaging>  <name>SSH练习项目,Crm,Maven格式的父工程</name>  <description>SSH练习项目Crm的Maven格式的父工程</description>  <!-- 为了确定每个框架的版本号 -->  <!-- 锁定版本常量-->      <properties>         <spring.version>4.2.4.RELEASE</spring.version>        <struts2.version>2.3.24</struts2.version>        <hibernate.version>5.0.7.Final</hibernate.version>        <slf4j.version>1.6.6</slf4j.version>        <log4j.version>1.2.12</log4j.version>        <shiro.version>1.2.3</shiro.version>        <cxf.version>3.0.1</cxf.version>        <c3p0.version>0.9.1.2</c3p0.version>         <mysql.version>5.1.6</mysql.version>    </properties>    <!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 -->    <dependencyManagement>        <dependencies>            <dependency>                <groupId>org.springframework</groupId>                <artifactId>spring-context</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-orm</artifactId>                <version>${spring.version}</version>            </dependency>            <dependency>                <groupId>org.springframework</groupId>                <artifactId>spring-test</artifactId>                <version>${spring.version}</version>            </dependency>            <dependency>                <groupId>org.springframework</groupId>                <artifactId>spring-web</artifactId>                <version>${spring.version}</version>            </dependency>            <dependency>                <groupId>org.hibernate</groupId>                <artifactId>hibernate-core</artifactId>                <version>${hibernate.version}</version>            </dependency>            <dependency>                <groupId>org.apache.struts</groupId>                <artifactId>struts2-core</artifactId>                <version>${struts2.version}</version>            </dependency>            <dependency>                <groupId>org.apache.struts</groupId>                <artifactId>struts2-spring-plugin</artifactId>                <version>${struts2.version}</version>            </dependency>        </dependencies>    </dependencyManagement>  <dependencies>    <dependency>            <groupId>org.apache.httpcomponents</groupId>            <artifactId>httpclient</artifactId>            <version>4.4</version>        </dependency>        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>fastjson</artifactId>            <version>1.1.37</version>        </dependency>        <dependency>            <groupId>commons-beanutils</groupId>            <artifactId>commons-beanutils</artifactId>            <version>1.9.1</version>        </dependency>        <!-- <dependency>            <groupId>org.quartz-scheduler</groupId>            <artifactId>quartz</artifactId>            <version>2.2.1</version>        </dependency> -->        <dependency>          <groupId>commons-fileupload</groupId>          <artifactId>commons-fileupload</artifactId>          <version>1.3.1</version>        </dependency>        <!-- jstl -->        <dependency>          <groupId>jstl</groupId>          <artifactId>jstl</artifactId>          <version>1.2</version>        </dependency>        <!-- shiro -->         <!-- apache shiro dependencies -->         <!-- <dependency>            <groupId>org.apache.shiro</groupId>            <artifactId>shiro-all</artifactId>            <version>${shiro.version}</version>         </dependency> -->       <!-- spring -->        <dependency>            <groupId>org.aspectj</groupId>            <artifactId>aspectjweaver</artifactId>            <version>1.6.8</version>        </dependency>         <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-aop</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>          <groupId>org.springframework</groupId>          <artifactId>spring-context</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-web</artifactId>          <version>${spring.version}</version>        </dependency>        <dependency>          <groupId>org.springframework</groupId>          <artifactId>spring-orm</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-core</artifactId>          <version>${spring.version}</version>        </dependency>    <!-- struts2  begin -->        <dependency>            <groupId>org.apache.struts</groupId>            <artifactId>struts2-core</artifactId>            <version>${struts2.version}</version>            <exclusions>                <exclusion>                    <artifactId>javassist</artifactId>                    <groupId>javassist</groupId>                </exclusion>            </exclusions>        </dependency>        <dependency>            <groupId>org.apache.struts</groupId>            <artifactId>struts2-spring-plugin</artifactId>            <version>${struts2.version}</version>        </dependency>        <dependency>            <groupId>org.apache.struts</groupId>            <artifactId>struts2-json-plugin</artifactId>            <version>${struts2.version}</version>        </dependency>        <dependency>            <groupId>org.apache.struts</groupId>            <artifactId>struts2-convention-plugin</artifactId>            <version>${struts2.version}</version>        </dependency>    <!-- struts2  end -->    <!-- hibernate begin -->        <dependency>            <groupId>org.hibernate</groupId>            <artifactId>hibernate-core</artifactId>            <version>${hibernate.version}</version>        </dependency>        <dependency>            <groupId>org.hibernate</groupId>            <artifactId>hibernate-entitymanager</artifactId>            <version>${hibernate.version}</version>        </dependency>        <dependency>            <groupId>org.hibernate</groupId>            <artifactId>hibernate-validator</artifactId>            <version>5.2.1.Final</version>        </dependency>    <!-- hibernate end -->        <dependency>            <groupId>c3p0</groupId>            <artifactId>c3p0</artifactId>            <version>${c3p0.version}</version>        </dependency>        <!-- <dependency>             <groupId>org.apache.cxf</groupId>             <artifactId>cxf-rt-frontend-jaxws</artifactId>             <version>${cxf.version}</version>         </dependency>         <dependency>             <groupId>org.apache.cxf</groupId>             <artifactId>cxf-rt-transports-http</artifactId>             <version>${cxf.version}</version>         </dependency> -->    <!-- log start -->        <dependency>            <groupId>log4j</groupId>            <artifactId>log4j</artifactId>            <version>${log4j.version}</version>        </dependency>        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-api</artifactId>            <version>${slf4j.version}</version>        </dependency>        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-log4j12</artifactId>            <version>${slf4j.version}</version>        </dependency>    <!-- log end -->    <!-- Javamail -->    <!--     <dependency>          <groupId>javax.mail</groupId>          <artifactId>mail</artifactId>          <version>1.4.4</version>        </dependency> -->        <dependency>            <groupId>commons-lang</groupId>            <artifactId>commons-lang</artifactId>            <version>2.6</version>        </dependency>        <dependency>            <groupId>org.codehaus.xfire</groupId>            <artifactId>xfire-core</artifactId>            <version>1.2.6</version>        </dependency>         <dependency>           <groupId>dom4j</groupId>           <artifactId>dom4j</artifactId>           <version>1.6</version>        </dependency>        <!-- <dependency>             <groupId>org.apache.poi</groupId>             <artifactId>poi</artifactId>             <version>3.11</version>         </dependency>        <dependency>             <groupId>org.apache.poi</groupId>             <artifactId>poi-ooxml</artifactId>             <version>3.11</version>         </dependency>        <dependency>             <groupId>org.apache.poi</groupId>             <artifactId>poi-ooxml-schemas</artifactId>             <version>3.11</version>         </dependency> -->        <dependency>          <groupId>junit</groupId>          <artifactId>junit</artifactId>          <version>3.8.1</version>          <scope>test</scope>        </dependency>        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <version>${mysql.version}</version>        </dependency>       <!--  <dependency>            <groupId>com.oracle</groupId>            <artifactId>ojdbc14</artifactId>            <version>10.2.0.4.0</version>        </dependency> -->        <dependency>            <groupId>javax.servlet</groupId>            <artifactId>servlet-api</artifactId>            <version>2.5</version>            <scope>provided</scope>        </dependency>        <dependency>            <groupId>javax.servlet.jsp</groupId>            <artifactId>jsp-api</artifactId>            <version>2.0</version>            <scope>provided</scope>        </dependency>        <dependency>            <groupId>net.sf.ehcache</groupId>            <artifactId>ehcache-core</artifactId>            <version>2.6.6</version>        </dependency>  </dependencies></project>

1.2. 设置编译版本, tomat运行插件。在pom.xml中配置:

  <build>    <finalName>crm_ssh_parent</finalName>    <pluginManagement>        <plugins>            <plugin>                <groupId>org.apache.maven.plugins</groupId>                <artifactId>maven-compiler-plugin</artifactId>                <version>3.2</version>                <configuration>                    <source>1.7</source>                    <target>1.7</target>                    <encoding>UTF-8</encoding>                    <showWarnings>true</showWarnings>                </configuration>            </plugin>        </plugins>    </pluginManagement>  </build>

2.创建子模块。

2.1 创建crm_ssh_dao子模块    新建——>Maven Project.。

这里写图片描述

这里写图片描述

这里写图片描述

2.2 创建crm_ssh_service子模块    创建方式同 crm_ssh_dao 模块的创建。2.3 创建 crm_ssh_web子模块    注意创建crm_ssh_web模块时注意文件的格式。

这里写图片描述

    注意:创建的crm_ssh_web 模块由于没有 web.xml配置文件,工程会报错,解决方案是将原CRM项目的文件web.xml 移入。同时,为整合工程,可同时将web资源导入。如图:

这里写图片描述

3. Java源文件和配置文件的整合    3.1 crm_ssh_dao整合        将类的Java实体类(domain中)、dao类(daoI和dao.impl中)、工具类(utils中)复制进crm_ssh_dao 的源文件目录中,将对应的domain类的配置文件xxx.hbm.xml放在资源文件夹对应的包结构下,如图:

这里写图片描述

    由于我们使用注解的方式注入类实例,处于需要进行模块测试的考虑,在applicationContext-dao.xml中,配置好连接池、SessionFactory、以及注解使用说明,代码如下:
<?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:aop="http://www.springframework.org/schema/aop"    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/context        http://www.springframework.org/schema/context/spring-context.xsd        http://www.springframework.org/schema/aop        http://www.springframework.org/schema/aop/spring-aop.xsd        http://www.springframework.org/schema/tx         http://www.springframework.org/schema/tx/spring-tx.xsd">    <!--配置使用C3P0连接池  -->    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >        <property name="driverClass" value="com.mysql.jdbc.Driver" />        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/crm" />        <property name="user" value="root" />        <property name="password" value="110011" />    </bean>     <!--配置并创建HibernateTemplate底层使用的SessionFactory -->    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">        <property name="dataSource" ref="dataSource"/>        <property name="hibernateProperties">    <!-- 配置配置文件参数 -->            <props>                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>                <prop key="hibernate.show_sql">true</prop>                <prop key="hibernate.format_sql">true</prop>                <prop key="hibernate.hbm2ddl.auto">update</prop>            </props>        </property>        <property name="mappingResources">            <list>                <value>cn/itcast/domain/Customer.hbm.xml</value>                <value>cn/itcast/domain/Linkman.hbm.xml</value>                <value>cn/itcast/domain/User.hbm.xml</value>                <value>cn/itcast/domain/Dictory.hbm.xml</value>            </list>        </property>    </bean>    <!-- 自动扫描注解,查找工厂需要生成的对象和注入属性 -->    <context:component-scan base-package="cn.itcast" />  </beans>
3.2 crm_ssh_dao整合    复制移入CRM的service 层代码。

这里写图片描述

    基于service层需要处理业务,在applicationContext-service.xml 中,配置好事务配置。代码如下:
        <!-- 导入dao中配置,便于测试时找得到sessionFactory --><import resource="classpath:applicationContext-dao.xml"/>        <!-- 配置平台事务管理器  -->    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">        <property name="sessionFactory" ref="sessionFactory"/>    </bean>        <!--  使用注解控制事务  -->    <tx:annotation-driven transaction-manager="transactionManager" />
3.3  crm_ssh_web整合    复制移入CRM的web层代码

这里写图片描述

    applicationContext.xml是必备的配置文件,在该文件中引入各层的spring配置文件。

这里写图片描述

4.  子模块整合与调试运行    4.1.模块间整合    由于service层依赖dao层,web层依赖service层,所以到格模块的 pom.xml文件中加入依赖模块的jar包。基于测试的目的,由于依赖传递的原则,在dao、service的pom.xml中加入测试用到的jar包,范围scope为test。

这里写图片描述

4.2运行    4.2.1.使用maven内置运行插件     定位到父工程的 pom.xml 文件,右键单击,选择Run As,选择Maven Build,输入tomcat:run,单击运行即可。

这里写图片描述

    4.2.2.使用tomcat运行工程      将crm_ssh_web 工程加入服务器service 中,作为常规的web项目运行。4.3 调试    测试发现在模块测试时会出现中文乱码,在父工程 pom.xml 中的<build>下的<plugins>中配置编译的语言,配置如下:
<!-- 解决测试时中文乱码问题, forkMode=once指测试时虚拟机每次都新开一个线程用于测试-->            <plugin>                  <groupId>org.apache.maven.plugins</groupId>                  <artifactId>maven-surefire-plugin</artifactId>                  <version>2.19.1</version>                  <configuration>                    <forkMode>once</forkMode>                      <argLine>-Dfile.encoding=UTF-8</argLine>                   </configuration>              </plugin>
加入后,发现一切顺利。5.  扩展    实际开发中,可以将 工具类,系统常量类,实体类,异常处理类都作为单独的子模块独立出去,分模块开发。