A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 我是楠楠 于 2018-5-22 14:38 编辑

【郑州校区】项目管理工具Maven4

五、聚合与继承(一)聚合
随着技术的飞速发展和各类用户对软件的要求越来越高,软件本身也变得越来越复杂,然后软件设计人员开始采用各种方式进行开发,于是就有了我们的分层架构、分模块开发,来提高代码的清晰和重用。针对于这一特性,maven也给予了相应的配置。
我们在开发过程中,创建了2个以上的模块,每个模块都是一个独立的maven project,在开始的时候我们可以独立的编译和测试运行每个模块,但是随着项目的不断变大和复杂化,我们期望能够使用简单的操作来完成编译等工作,这时Maven给出了聚合的配置方式。
所谓聚合,顾名思义,就是把多个模块或项目聚合到一起,我们可以建立一个专门负责聚合工作的Maven 工程。
建立该project的时候,我们要注意以下几点:
1.聚合模块本身也做为一个Maven项目,它必须有自己的POM
2.它的打包方式必须为: pom
3.引入了新的元素:modules---module
4.版本:聚合模块的版本和被聚合模块版本一致
5.相对目录:每个module的值都是一个当前POM的相对目录
6.目录名称:为了方便的快速定位内容,模块所处的目录应当与其artifactId一致(Maven约定而不是硬性要求),总之,模块所处的目录必须和<module>模块所处的目录</module>相一致。
7.习惯约定:为了方便构建,通常将聚合模块放在项目目录层的最顶层,其它聚合模块作为子目录存在。这样当我们打开项目的时候,第一个看到的就是聚合模块的POM
8.聚合模块减少的内容:聚合模块的内容仅仅是一个pom.xml文件,它不包含src/main/Java、src/test/java等目录,因为它只是用来帮助其它模块构建的工具,本身并没有实质的内容。
9.聚合模块和子模块的目录:他们可以是父子类,也可以是平行结构,当然如果使用平行结构,那么聚合模块的POM也需要做出相应的更改。
(二)继承
我们在项目开发的过程中,可能多个模块独立开发,但是多个模块可能依赖相同的元素,比如说每个模块都需要Junit,使用spring的时候,其核心jar也必须都被引入,在编译的时候,maven-compiler-plugin插件也要被引入。这时我们采用继承,就不用在每个子模块分别定义了。
如何配置继承:
1.说到继承肯定是一个父子结构,那么我们在父工程中来创建一个parent project
2.<packaging>: 作为父模块的POM,其打包类型也必须为POM
3.结构:父模块只是为了帮助我们消除重复,所以它也不需要src/main/java、src/test/java等目录
4.新的元素:<parent> , 它是被用在子模块中的
5.<parent>元素的属性:<relativePath>: 表示父模块POM的相对路径,在构建的时候,Maven会先根据relativePath检查父POM,如果找不到,再从本地仓库查找
6.relativePath的默认值: ../pom.xml
7.子模块省略groupId和version: 使用了继承的子模块中可以不声明groupId和version, 子模块将隐式的继承父模块的这两个元素
(三)聚合与继承的区别
聚合和继承通常是结合使用的,但是其作用是不同的。聚合是将多个模块的工程汇聚到一起,而继承则是指明某个模块工程要继承另一个模块功能。
六、构建多模块Maven工程(重点)
Maven多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定的模块。
拆分规则:
(1)按业务模块拆分
(2)按层拆分
创建Maven父工程(erp_parent)
(一)创建Maven父工程
注意:打包方式选择pom
工程创建完成,后打开pom.xml ,添加一下内容
[AppleScript] 纯文本查看 复制代码
<properties>[/align]          <hinernate.version>5.0.7.Final</hinernate.version>
          <spring.version>4.2.4.RELEASE</spring.version>
          <struts.version>2.3.24</struts.version>
  </properties>
  
  <dependencies>
          <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <version>2.5</version>
          </dependency>
  
          <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-core</artifactId>
          <version>${hinernate.version}</version>
          </dependency>
          <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</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-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.aspectj</groupId>
          <artifactId>aspectjweaver</artifactId>
          <version>1.7.4</version>
          </dependency>
          <dependency>
          <groupId>org.apache.struts</groupId>
          <artifactId>struts2-core</artifactId>
          <version>${struts.version}</version>
          <exclusions>
          <exclusion>
          <groupId>javassist</groupId>
          <artifactId>javassist</artifactId>
          </exclusion>
          </exclusions>
          </dependency>
          <dependency>
          <groupId>org.apache.struts</groupId>
          <artifactId>struts2-spring-plugin</artifactId>
          <version>${struts.version}</version>
          </dependency>
          <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.6</version>
          </dependency>
  
          <dependency>
          <groupId>jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
          </dependency>
  </dependencies>
  
  <build>  
  <plugins>
      <plugin>  
          <groupId>org.apache.maven.plugins</groupId>  
          <artifactId>maven-compiler-plugin</artifactId>  
          <version>2.3.2</version>  
          <configuration>  
              <source>1.7</source>  
              <target>1.7</target>  
          </configuration>  
      </plugin>
  </plugins>           
  </build>   
(二)创建Maven子模块
选择菜单file -- new -- other  
一共需要建立4个子模块
erp_domain   存放实体包
erp_dao      存放数据访问接口及实现类
erp_service   存放业务逻辑层接口及实现类
erp_web     存放action类代码和前端代码  (注意:此模块的packaging选择war)
在erp_web 工程中展开src\main\webapp目录,建立WEB-INF文件夹,并将web.xml拷贝到文件夹中。
将struts2和spring配置文件放入erp_web 的 src/main/resources 下面
构建完各个模块后,会发现父工程的pom.xml中自动出现如下信息:
[AppleScript] 纯文本查看 复制代码
  <modules>
          <module>erp_domain</module>
          <module>erp_dao</module>
          <module>erp_service</module>
          <module>erp_web</module>
  </modules>
这部分的配置信息是父工程聚合子模块的信息
而子模块的pom.xml内容如下:
[AppleScript] 纯文本查看 复制代码
<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 [url=http://maven.apache.org/xsd/maven-4.0.0.xsd]http://maven.apache.org/xsd/maven-4.0.0.xsd[/url]">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>cn.itcast.erp</groupId>
    <artifactId>erp_parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>erp_domain</artifactId>
</project>
(三)建立Maven子模块之间的依赖
我们将刚才我们的mavenweb工程的代码分别拷贝到各自的子模块:
将cn.itcast.mavenweb.domain包下的类拷贝到erp_domain的src/main/java下,将cn.itcast.mavenweb.domain下的映射文件拷贝到erp_domain的src/main/resources下。
将cn.itcast.mavenweb.dao和cn.itcast.mavenweb.dao.impl 下的接口和类都拷贝到erp_dao工程。
为什么出红叉了呢?这是因为数据访问层会用到实体类。而erp_dao工程是没有实体类的,实体类在erp_domain工程中,这就需要建立工程之间的依赖
各模块的依赖关系如下:
erp_dao 依赖erp_domain
erp_service 依赖erp_dao
erp_web依赖erp_service
我们现在建立erp_dao和erp_domain的依赖:
工程右键  Maven -->  Add Dependency
步骤与添加依赖jar包类似,操作后erp_dao红叉消失
erp_dao的pom.xml内容如下:
  
[AppleScript] 纯文本查看 复制代码
<dependencies>[/align]          <dependency>
          <groupId>cn.itcast.erp</groupId>
          <artifactId>erp_domain</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          </dependency>
  </dependencies>
按照同样的方法建立其它的工程依赖
(四)代码编写
(1)将cn.itcast.mavenweb.service和cn.itcast.mavenweb.service.impl下的接口和类拷贝到erp_service工程下。
(2)将cn.itcast.mavenweb.web.action下的类拷贝到erp_web工程下,将applicationContext.xml和struts.xml拷贝到erp_web工程的src/main/resources 目录下,将index.jsp拷贝到webapp目录下。
(五)配置文件拆分
(1)在erp_dao工程下创建applicationContext_datasource.xml 用于配置数据源信息
[AppleScript] 纯文本查看 复制代码
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/erpdb?useUnicode=true&characterEncoding=UTF8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<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.MySQLInnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
</props>
</property>
<property name="mappingLocations">
<value>classpath:cn/itcast/mavenweb/domain/*.hbm.xml</value>
</property>
</bean>
        
创建applicationContext_dao.xml 用于存放所有的dao类的bean
[AppleScript] 纯文本查看 复制代码
<bean id="depDao" class="cn.itcast.mavenweb.dao.impl.DepDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
(2)在erp_service工程下创建applicationContext_tx.xml,用于配置声明式事务相关配置信息
        
[AppleScript] 纯文本查看 复制代码
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:advice id="advice" transaction-manager="transactionManager">
    <tx:attributes>             
      <tx:method name="do*" propagation="REQUIRED"/>
      <tx:method name="add*" propagation="REQUIRED"/>
      <tx:method name="update*" propagation="REQUIRED"/>
      <tx:method name="save*" propagation="REQUIRED"/>
      <tx:method name="delete*" propagation="REQUIRED"/>
      <tx:method name="*" read-only="true"/>
    </tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="serviceMethod" expression="execution(* cn.itcast.mavenweb.service.impl.*.*(..))"/>
<aop:advisor pointcut-ref="serviceMethod" advice-ref="advice" />
</aop:config>
        
编写applicationContext_service.xml 用于配置所有的业务逻辑层信息
[AppleScript] 纯文本查看 复制代码
<bean id="depService"  class="cn.itcast.mavenweb.service.impl.DepServiceImpl">
<property name="depDao" ref="depDao"></property>
</bean>
(3)在erp_web工程下创建applicationContext_web.xml
[AppleScript] 纯文本查看 复制代码
<bean id="depAction" class="cn.itcast.mavenweb.web.action.DepAction">
<property name="depService" ref="depService"></property>
</bean>
(六)运行测试及打包
选择erp_parent工程,执行命令package 进行打包(war)
这里我们需要注意一点,我们在将配置文件分到每个子模块后,打成的war包中不并包括其它jar工程的配置文件,这些jar工程的配置文件被直接打到jar包中,这时web.xml中下列配置就可以找到这些jar包中的配置文件:
[AppleScript] 纯文本查看 复制代码
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext*.xml</param-value>
</context-param>
classpath 和 classpath* 区别:
classpath:只会到你指定的class路径中查找找文件;
classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找.
更多
【郑州校区】项目管理工具Maven3
传智播客·黑马程序员郑州校区地址
河南省郑州市高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话0371-56061160 / 61/62
来校路线地铁一号线梧桐街站A口出

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马