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

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

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

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

 

 SSH框架之一详解maven搭建多模块项目_第1张图片

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

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文件夹下(没有则新建)。如下图所示:

SSH框架之一详解maven搭建多模块项目_第2张图片

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

<packaging>pom</packaging>

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

2、maven项目添加model

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

SSH框架之一详解maven搭建多模块项目_第3张图片

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

SSH框架之一详解maven搭建多模块项目_第4张图片

重点关注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插件,需要先进行配置。配置图如下:

SSH框架之一详解maven搭建多模块项目_第5张图片

SSH框架之一详解maven搭建多模块项目_第6张图片

SSH框架之一详解maven搭建多模块项目_第7张图片

SSH框架之一详解maven搭建多模块项目_第8张图片

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

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

4、问题以及解决方案

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

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

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

SSH框架之一详解maven搭建多模块项目_第9张图片

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

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

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

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

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

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

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

SSH框架之一详解maven搭建多模块项目_第10张图片

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

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

SSH框架之一详解maven搭建多模块项目_第11张图片

 

要​想​把​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我。

--本篇完--

 

你可能感兴趣的:(maven)