Maven多模块搭建Web项目

前言

最近用maven将Web项目分成多个模块,各种异常,磕磕碰碰也终于弄好了。

正文

我工程的整个目录结构如下,这maven项目很有意思,我移动其他地方,只要将fastcoding-parent移过去就行了,这个fastcoding-parent下面包括了各个模块的pom和src下的java文件,到时候改动一下jdk,tomcat就可以了
这里写图片描述

如果建立上面的目录?
我们先建立一个fastcoding_parent项目。File-New-Other,搜索Maven,出现如下图的三个选项,选着Maven Project
这里写图片描述
这里需要这个fastcoding-parent模块是pom,我们就选择create a simple project
这里写图片描述
建立好parent以后,选中这个parent项目,右键new-other,搜索maven,选着Maven Module,这次我们不勾选Create a simple project
而是直接next,在出现的页面有很多的选项
这里写图片描述
一般用红框第一个,如果是fastcoding-website,我用maven-archetype-webapp,其实不用这个也行,只是最后将maven转成web有点麻烦。都可以试试

这样建立了第一个Maven Module,其他三个模块同理
建立以后,发现工程在fastcoding-parent外面出现了每个模块的工程,在fastcoding-parent里面也有这些模块的层次结构,我修改外面工程,在fastcoding-parent里面对应的模块也会自动同步。
具体看上面第一张图。我们写代码是在外面对应的模块写的。

我们写好各个模块的依赖关系,同时注意项目的在workspace的编译,这样可以避免很多问题。
这些觉得看看其他教程就能完成了。依赖关系形成了,在Maven Depencies中,我们都可以看到,看不到,就编译项目。
注意整个在项目在tomcat跑起来,请看下面的内容

遇到的困难与总结

1、在搭建这个maven项目的时候,eclipse进度条各种卡死。又经常在spring配置文件显示错误,进度条一直停留,如下图
这里写图片描述
这个问题,我也不知道怎么解决的,我所做的挣扎就是,重新编译工程,剪切,赋值,保存,反正莫名其妙就好了,后面又莫名其妙出现了。是不是我用网通的原因?(当然网上有很多解决办法,但对当时出现的问题没什么帮助),上面所说的进度条卡死,如build卡死等,我只能取消,实在不行就关闭eclipse,如果还是解决不了,我在建一个workspace,因为各种问题换了2次的workspace

2、搭建maven多模块项目,还有最多的是编译的原因,在我的工程下面,没有成功编译,而我又没有发现,所以导致一直不能成功,其中一个publish项目到tomcat出现的问题如下

Publishing failed
File not found: E:\workbench_2015_8\parent_blog\blog_service\target\classes\META-INF\maven\org.study.blog\blog_service\pom.properties.
E:\workbench_2015_8\parent_blog\blog_service\target\classes\META-INF\maven\org.study.blog\blog_service\pom.properties (系统找不到指定的路径。)
File not : E:\workbench_2015_8\parent_blog\blog_persistent\target\classes\META-INF\maven\org.study.blog\blog_persistent\pom.properties.
E:\workbench_2015_8\parent_blog\blog_persistent\target\classes\META-INF\maven\org.study.blog\blog_persistent\pom.properties (系统找不到指定的路径。)
File not found: E:\workbench_2015_8\parent_blog\blog_Exception\target\classes\META-INF\maven\org.study.blog\blog_Exception\pom.properties.
E:\workbench_2015_8\parent_blog\blog_Exception\target\classes\META-INF\maven\org.study.blog\blog_Exception\pom.properties (系统找不到指定的路径。)

没有META-INF。我发现MAVEN创建的工程webapp下面没有META-INF这个文件夹,而传统WEB工程,或者简单的将maven项目转成Web项目,将WebContent的META-INF与WEB-INF拷贝过去,所以一直以为是webapp下面没有META-INF的原因,后来才发现是编译的问题
对于这个编译问题我用以下的方法
这里我将Build Automatically取消掉,然后点击clean
这里写图片描述
进入clean,有如下内容
这里写图片描述

3、我A模块依赖B模块,发现在Maven Dependencies下面没有如下红框的文件夹
这里写图片描述
其实这个也是编译的问题,重新编译一下工程就会出现,在Project下面勾选Build Automatically,然后点保存,一般都会自动Maven Dependencies增删一些依赖jar,有时候不管用,就取消Build Automatically,点clean。

4、我这里用一个fastcoding-website的模块增加tomcat,src下面没有任何的东西,这个模块依赖其他模块(直接依赖模块fastcoding-controller,这样就会间接依赖controller模块下的其他jar,和controller所依赖的其他模块),我之前的疑惑是fastcoding下面的配置文件spring-persistent.xml在fastcoding-persistent模块下面,里面有如下的内容

<context:component-scan base-package="org" use-default-filters="false">
        <context:include-filter type="regex" expression="org.service.*"/>
        <context:include-filter type="regex" expression="org.persistent.impl.*"/>
        <context:include-filter type="regex" expression="org.action.controller*"/>
</context:component-scan>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="interceptorPointCuts" expression="execution(* org.service.impl.*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" />
</aop:config>

这里这些包路径的配置,对fastcoding-service和fastcoding-controller有用吗? 只要将配置文件放到src/main/resources,src/test/resources下面,这些模块并形成依赖,就能读到配置的包

值得注意的是fastcoding-website这个模块下面的web.xml,配置一些路径问题

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:config/spring-persistent.xml</param-value>
    </context-param>

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener> 

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <description>加载/WEB-INF/spring-mvc/目录下的所有XML作为Spring MVC的配置文件</description>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:config/*.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
</servlet>

这里要获取所依赖的模块里面的配置文件,需要在classpath后面加一个星号
如果不加,是获取不到配置文件的

5、fastcoding-website,直接,或者间接依赖其他模块,在Maven Dependencies下面会显示如下的的包
这里写图片描述
但是这样做还是不够的,我需要右键项目属性配置一下,将这些模块的jar放到tomcat的WEB-INF - lib中
这里写图片描述

部署项目的时候,在tomcat的webapp项目的WEB-INF-lib中可以找到如下jar
这里写图片描述

很有意思,tomcat的WEB-INF / classes下面没有任何的class文件,之前一直认为依赖的模块的class都放到这里面,一看没有,以为又哪里错了。其实不需要,tomcat所在的fastcoding-website模块的src下面本来就没有任何java源文件,只要lib有其他模块的jar就行了

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值