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就行了

未完待續

發佈了88 篇原創文章 · 獲贊 29 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章