文档章节

SSH框架之一详解maven搭建多模块项目

OSC首席小可爱
 OSC首席小可爱
发布于 2015/11/09 09:58
字数 2232
阅读 81
收藏 2

    闲来无事,思量着自己搭建一个ssh框架,一来回顾熟悉一下ssh的内容,hibernate还就没用过了,生疏了都。二来整合一下,将其他掌握的和正在学习的框架核技术糅合到一起,就当是做一个demo练手了。

    首先要把最基层的ssh框架运行起来,利用maven来构建,设想的是将业务分为多个模块,各个模块之间相互独立,甚至每个模块可以独立运行。查询若干资料可以利用maven创建model,然后整合为一个项目,今天先介绍一下基于maven的多模块项目搭建。

多模块其实就是按照层级的管理构建,项目包含一个pom.xml文件和若干个模块,每个模块有一个单独的pom.xml文件,通过pom的依赖和继承关系来构建项目层次。废话不多说,文采也不好,就直奔主题吧,首先贴一张项目结构图:

 

 

从上图中可以清楚的看到模块与项目以及模块与模块之间的层级关系,解释一下为什么这么分模块:

web模块存放的是客户端资源,包括js,css,以及jsp等。其他各模块为业务模块,common为公共模块,其中封装了公用的util工具类以及常量等。

打包方式为项目采用pom方式,业务模块打成jar,web模块打包成war包,最后的war包只包括web模块下的资源,其他业务模块以jar形式存在war包中WEB-INF/lib文件夹下

1、创建maven项目

Maven的安装和配置就不细说了,打开eclipse首先新建一个maven项目,删除src目录(项目中是没有代码的,所有的代码都是在各个模块中编写的),将buildpath中的source文件夹给remove掉,并将output文件夹修改到web模块下web-inf/classes文件夹下(没有则新建)。如下图所示:

打开pom.xml文件,添加或修改代码 :

<packaging>pom</packaging>

将项目的打包方式修改为pom方式,然后添加ssh相关的dependency和plugins等内容。

2、maven项目添加model

在项目上右键,新建选择maven model:

输入model名称,next配置sshFrame和groupId完成后可以看到工作空间中多了一个项目,打开模块pom文件,稍作修改:

重点关注parent标签,其配置的是该模块所属的父级项目,这里当然配置顶级的项目了,子模块的pom文件是继承字父级的pom文件的,所以在父级pom中定义的dependencies在子模块中可以直接引用,模块的属性也只需定义一个artifactId就可以了,groupId和version可以从父级继承,relativePath配置是父级pom.xml文件的相对路径,一般可以省略,不过有时会报错,说找不到父级pom,所以就干脆加上了。

    这时候再次打开项目的pom.xml文件可以发现其中多了一个modules标签,其中内容就是刚刚新建的模块的artifactId。

其他模块的新建依此类推,过程是完全一样的。

3、编译以及运行

模块建立完成后,运行项目的pom文件,run as mvn install 下载jar,运行命令mvn compile进行编译,编译后可以在各个模块的target文件夹下看到编译后的class文件,web模块的输出路径最好也给改成web-inf/classes下。编译通过后就可以启动tomcat进行测试了,我使用的是tomcat插件,需要先进行配置。配置图如下:

打开tomcat中server.xml文件,添加context。

启动tomcat后访问localhost:8080/ssh/user/toUserIndex.action即可查看到页面效果了,该页面访问的是User模块的action。

4、问题以及解决方案

在搭建过程中出现了各种各样的错误,也一直在摸索着前进,总结一下出现的问题和解决办法。

(1) tomcat启动后不能加载到其他模块的代码,只加载到了web模块。

答:运行mvn compile编译后生成的class文件都是在各自模块的target目录下的,需要在tomcat配置中需要加载的模块勾上,如下图:

这样再启动tomcat就会加载到class文件了。

(2)、strus文件无法引入其他模块的struts_user.xml文件

答:struts可以使用include命令包含其他的配置文件file属性为文件的地址

<include file="struts_config/struts_user.xml"></include>

这样是可以正确加载文件的,注意struts_config前面是没有”/的。

(3)、模块之间相互依赖的问题

项目过大,模块过多的话可能多个模块之间会存在相互依赖的关系,如下图:

这样使用maven编译不能通过,要解决循环依赖有两种解决办法,一种就是重构代码,从根本上解决依赖的问题。还有一种折中的办法,使​用​build-helper-maven-plugin解​决​相​互​依​赖​的​问​题​我​的​解​决​办​法​就​是​先​把​相​互​依 ​赖​的​模​块​整​合​在​一​起​,相​当​于​把​这​些​模​块​合​并​成​一​个​单​独​的​模​块​统​一​编​译​。

依赖关系转换为多对一的关系,如下图:

 

要​想​把​A、​B、​C三​个​模​块​整​合​在​一​起​编​译​,需​要​借​助​build-helper-maven-plugin插​件 ​,这​个​插​件​在​Maven构​建​周​期​提​供​一​些​辅​助​功​能​,下​面​列​出​插​件​的​提​供​的​功​能​列​表​: build-helper:add-source:添​加​更​多​的​构​建​源​码​目​录​ build-helper:add-test-source:添​加​更​多​的​测​试​源​码​目​录​ build-helper:add-resource:添​加​更​多​的​资​源​目​录​ build-helper:add-test-resource:添​加​更​多​的​测​试​资​源​目​录​ build-helper:attach-artifact:在​安​装​和​部​署​周​期​附​加​artifacts build-helper:maven-version:添​加​一​个​指​定​当​前​Maven版​本​的​属​性​ build-helper:parse-version:添​加​一​个​指​定​组​件​版​本​的​属​性​ build-helper:released-version:决​定​当​前​项​目​的​最​终​版​本​ build-helper:remove-project-artifact:从​本​地​资​源​库​中​移​除​项​目​的​artifacts build-helper:reserve-network-port:Reserve a list of random and unused network ports. 在​这​里​我​们​要​用​到​build-helper:add-source这​个​功​能​,将​模​块​A、​B、​C的​源​码​路​径​加 ​进​来​。​ 我​们​再​添​加​一​个​辅​助​模​块​D,在​辅​助​模​块​D中​使​用​build-helper-maven-plugin插​件​,然 ​后​让​模​块​A、​B、​C都​依​赖​于​辅​助​模​块​D,模​块​D的​POM模​型​如​下​:

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <relativePath>../pom.xml</relativePath>
        <artifactId>sshFrame</artifactId>
        <groupId>org.lslvxy.sshFrame</groupId>
        <version>${project.version}</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>sshFrame-pack</artifactId>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <module.common.src>../sshFrame-common/src/main/java</module.common.src>
        <module.user.src>../sshFrame-user/src/main/java</module.user.src>
        <module.role.src>../sshFrame-role/src/main/java</module.role.src>
    </properties>
    <build>
        <resources>
            <resource>
                <directory>../sshFrame-common/src/main/resources</directory>
            </resource>
            <resource>
                <directory>../sshFrame-user/src/main/resources</directory>
            </resource>
            <resource>
                <directory>../sshFrame-role/src/main/resources</directory>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>1.8</version>
                <executions>
                    <execution>
                        <id>add-source</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>${module.common.src}</source>
                                <source>${module.user.src}</source>
                                <source>${module.role.src}</source>
                            </sources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

这样就生成了一个模块pack,将其他模块的源代码和resource编译到pack模块中,然后其他模块依赖这一个pack模块,启动tomcat时加载pack模块和web模块即可正常启动项目。

5、总结

至此,一个简单的maven多模块项目就搭建成功了,也可以正常的运行和访问。

不过需要完善和丰富内容还需要一部分工作。源代码:

这个源码中包含了jquery easyui做的界面,也才刚刚开始做了一部分。

文采不好,写的很乱,如果有什么问题的话可以给我留言或者qq我。

--本篇完--

 

© 著作权归作者所有

OSC首席小可爱

OSC首席小可爱

粉丝 3
博文 51
码字总数 66269
作品 0
无锡
后端工程师
私信 提问
git文章列表

关于gitlab默认clone协议 Git实现从本地添加项目到远程仓库 翻翻git之---一个简单的标签控件 LabelView (随手发了两张小宝宝的玩耍照) Git 项目推荐 | Java 版微信普通号机器人 翻翻git之---...

d_watson
2016/04/20
27
0
maven 多模块开发,如何划分?请给指导性意见!!!

项目框架准备用 maven+SpringMVC+mybatis 搭建。 我看已经看过 有的人按照 dao service web util 这样划分, 还有的用 domain 里面是 数据模型(实体类)和 service以及 service iml。 将实体...

Hrong123
2015/02/02
5.2K
6
maven创建多模块项目

现在我想把SSH框架用maven来创建多模块项目,比如,dao,service,action层,现在问题来了,配置文件我应该怎么处理,在dao层需要用到hibernate,action层需要用到struts.xml,三层都需要用到s...

Mr________Miss
2016/08/07
392
5
Maven多模块项目介绍及搭建

对于大型WEB项目的开发一个很重要的部分就是代码的复用和维护管理。但是如果在搭建的时候采用多模块搭建,可以为之后的维护管理及复用提供便利。 接下来是在IntelliJ IDEA中的一个多模块项目...

战五渣
2016/06/13
4K
11
项目管理Maven篇(1)-基础详解

本文主要讲解maven入门基础部分,关于更深层次的知识请阅读我的另一篇文章:项目管理Maven篇(2)- Sonatype Nexus 介绍 Maven是一个强大的项目管理工具,其构建特性被普遍用于项目管理,Maven...

阿郎_
2017/04/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MongoDB系列-在复制集(replication)以及分片(Shard)中创建索引

关注我,可以获取最新知识、经典面试题以及微服务技术分享   在使用MongoDB时,在创建索引会涉及到在复制集(replication)以及分片(Shard)中创建,为了最大限度地减少构建索引的影响,在副本...

ccww_
23分钟前
17
0
SAP HANA数据库multi container模式JDBC链接connection refused

报错如下信息 com.sap.db.jdbc.exceptions.JDBCDriverException: SAP DBTech JDBC: Cannot connect to jdbc:sap://xxx.xxx.xxx.xxx:30015 [Cannot connect to host xxx.xxx.xxx.xxx:30015 [C......

flash胜龙
49分钟前
35
0
c++ 虚基类

c++ 虚基类 p556

天王盖地虎626
55分钟前
87
0
k8s删除Terminating状态的命名空间

背景: 我们都知道在k8s中namespace有两种常见的状态,即Active和Terminating状态,其中后者一般会比较少见,只有当对应的命名空间下还存在运行的资源,但是该命名空间被删除时才会出现所谓的...

Andy-xu
今天
81
0
seata源码阅读笔记

seata源码阅读笔记 本文没有seata的使用方法,怎么使用seata可以参考官方示例,详细的很。 本文基于v0.8.0版本,本文没贴代码。 seata中的三个重要部分: TC:事务协调器,维护全局事务和分支...

东都大狼狗
今天
46
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部