基於多個maven module搭建的Spring boot web項目

一、爲何是多個 maven module?java

這個問題能夠拆成兩部分,爲何是多個和爲何是maven module。mysql

多個是由於實際開發過程當中,絕大多數的企業級項目都是存在多個功能模塊的;web

用maven module是由於一開始想用多個maven project,結果幾經折騰,沒有運行成功。後來是看了別人的demo,用的是多個maven module,按照此法,成功了。或許我要把運行成功的maven module裏的代碼拷回到當初搭建的maven project中試試。spring

二、項目結構是怎麼樣的?sql

maven module不能獨立於maven project存在,所以須要有一個parent project來承載下面全部的module。看到這個結構,有人不由要吐槽了,這個跟單工程有啥分別,反而不利於協同開發了。apache

莫慌,在IDE(我用的是myeclipse)裏,最終呈現的視圖以下:api

這樣看起來就比較親切了,每一個module能夠分開來單獨開發。瀏覽器

再補充一點,若是是web開發,應該會須要一個web項目,如上圖的machine-web,做爲站點的入口,依賴其餘的module。tomcat

三、Spring boot運行環境要求有哪些?服務器

maven 3.x(Gradle 2.3+) + JDK 1.7 + Tomcat 7.x

Spring boot默認用的是JDK1.6,可是我的推薦maven 3.x + JDK 1.8 + Tomcat 8.x。

四、Spring boot要怎麼配置?

這一步是很是關鍵,也是我踩坑最多的地方。

起初想到的只要按照spring boot 官網的tutorial步驟來作,應該就沒問題的。

然並卵。

最直接的緣由是我想基於spring boot,將項目以war包的形式發佈,而spring boot推崇的是fat jar(富jar,不依賴任何Servlet運行容器,獨立運行部署),雖然spring boot也想到了開發中有打war包的需求,可是仍是要費一些周折的。下面重點介紹如何打出一個war包(Hello World的示例工程就不講了):

以我給的項目結構截圖爲例,先不考慮與mybatis,hibernate等第三方組件的結合,這就意味着,若是想基於spring boot開發web站點,我給出的是最小的maven依賴集合。

建立一個maven項目,命名爲:machine-parent,這個是全部module的父工程,只有一個pom.xml,打包方式設置成pom,即:

完整的pom.xml以下:

<?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">

<modelVersion>4.0.0</modelVersion>

<groupId>com.tsou.machine</groupId>

<artifactId>machine-parent</artifactId>

<version>1.0.0-SNAPSHOT</version>

<packaging>pom</packaging>

<name>machine-parent</name>

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>1.4.2.RELEASE</version>

</parent>



<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

</properties>



<!--申明依賴關係 -->

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

<!-- 移除內嵌的tomcat運行容器 -->

<exclusions>

<exclusion>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-tomcat</artifactId>

</exclusion>

</exclusions>

</dependency>



<!-- @Configuration註解建議引入 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-configuration-processor</artifactId>

<optional>true</optional>

</dependency>



<!-- 將內嵌的tomcat容器標記爲provided(來自官網) -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-tomcat</artifactId>

<scope>provided</scope>

</dependency>

<!-- 若是使用Servlet3.0如下版本,須要此jar -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-legacy</artifactId>

<version>1.0.2.RELEASE</version>

</dependency>



<dependency>

<groupId>org.apache.tomcat.embed</groupId>

<artifactId>tomcat-embed-jasper</artifactId>

<scope>provided</scope>

</dependency>



<!-- servlet 依賴. -->

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>javax.servlet-api</artifactId>

<scope>provided</scope>

</dependency>



</dependencies>



<build>

<defaultGoal>package</defaultGoal>

<resources>

<!-- 導入的資源文件,該目錄下的文件會copy到classpath根目錄下 -->

<resource>

<directory>src/main/resources</directory>

</resource>

<resource>

<directory>src/main/java</directory>

<includes>

<include>*.properties</include>

<include>*.xml</include>

<include>*.dtd</include>

<include>*.yml</include>

</includes>

<filtering>false</filtering>

</resource>

</resources>



<plugins>

<plugin>

<artifactId>maven-compiler-plugin</artifactId>

<configuration>

<source>1.8</source>

<target>1.8</target>

</configuration>

</plugin>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-war-plugin</artifactId>

</plugin>

<plugin>

<artifactId>maven-resources-plugin</artifactId>

<configuration>

<encoding>UTF-8</encoding>

</configuration>

</plugin>

</plugins>

</build>

</project>

接下來就是在parent項目下面建立若干個maven module。

五、科普如下怎麼建立maven module唄?!

右鍵一個maven project-->New-->others(若是菜單有maven module就跳過這步)-->maven module。

後續的操做相似於maven project的建立,這裏放幾張截圖:

 

六、而後呢???

接下來的重點轉移到machine-web上來。細心的童鞋看到machine-parent有一行註釋:

若是使用Servlet3.0如下版本,須要此jar

在web項目中,web.xml當屬一個很是重要的配置文件之一,能夠經過在頭部指定用哪一個版本的Servlet,我發現公司大多數用的是V2.5,順帶給出2.5和3.0版的XML頭部聲明:

web.xml v2.5

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">



</web-app>

web.xml v3.0

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">

</web-app>

官方推薦3.0版,這樣就不須要額外的配置了。

web.xml配置好後,在machine-web的pom.xml文件裏添加其餘業務module的依賴。

七、接下來呢?怎麼運行?

別急,同窗。配置還沒完呢!!

通常,我會把共用的配置文件(properties,xml,yml等)放在web項目的src/main/resources目錄下。spring boot須要一個叫作application.properties的配置文件,並且它只認這個,這充分體現了javaconfig的一個理念:約定因爲配置。

這個文件裏頭的配置項卻是挺多的,我列舉幾個經常使用的:

spring.profiles.active=dev //後文詳談

server.port=8100 //啓動內嵌tomcat,設置其端口號

server.contextPath=/machine //項目在tomcat中的contextPath



spring.mvc.view.prefix=/view/ //spring mvc返回視圖的前綴

spring.mvc.view.suffix=.jsp //spring mvc返回視圖的後綴



logging.path=/var/logs //日誌文件目錄

logging.file=myapp.log //日誌文件名



//如下是jdbc,jpa(hibernate),mybatis的常見配置,就不一一說明了

spring.datasource.name=basehome

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/basehome

spring.datasource.username=root

spring.datasource.password=123456

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.minIdle=1

spring.datasource.maxActive=20

spring.datasource.initialSize=1

spring.datasource.timeBetweenEvictionRunsMillis=3000

spring.datasource.minEvictableIdleTimeMillis=300000

spring.datasource.validationQuery=SELECT 'TEST' FROM DUAL

spring.datasource.testWhileIdle=true

spring.datasource.testOnBorrow=false

spring.datasource.testOnReturn=false



spring.jpa.hibernate.ddl-auto=none

spring.jpa.generate-ddl=true

spring.jpa.properties.hibernate.show_sql=true

spring.jpa.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect



mybatis.mapperLocations=classpath*:mapper/*.xml

 

接下來的一步是spring boot的特殊之處——main method entrance(main方法入口).

這也就是能解釋爲何一個jar就能啓動一個站點了,一切的入口都是這個main方法。

那麼要將此main方法寫在哪裏呢?官方給出了 best practice,以下圖所示:

也就是放在一級包目錄下,切忌放在(default package)下面,即沒有包名的那種狀況。

可是,我想來想去,在多個maven module的狀況下,好像這個入口只能放在web所在的module下面,放在其餘的業務模塊下並不太合適,因而就有了以下的結構:

MachineApplication裏面的內容很簡單:

import org.springframework.boot.Banner;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.boot.builder.SpringApplicationBuilder;

import org.springframework.boot.context.properties.EnableConfigurationProperties;

import org.springframework.boot.web.support.SpringBootServletInitializer;



import com.tsou.machine.common.config.DevelopmentConfigs;



//掃描註解,不配置默認掃描啓動類的classpath

@SpringBootApplication(scanBasePackages={"com.tsou.machine"})

//注入屬性配置,下文詳解

@EnableConfigurationProperties(value={DevelopmentConfigs.class})

public class MachineApplication extends SpringBootServletInitializer {



@Override

protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {

return configureApplication(builder);

}

public static void main(String[] args) {

configureApplication(new SpringApplicationBuilder()).run(args);

}



private static SpringApplicationBuilder configureApplication(SpringApplicationBuilder builder) {

return builder.sources(MachineApplication.class).bannerMode(Banner.Mode.OFF);

}

}

固然,以上是爲了打war包纔會這樣寫,實際上,若是隻須要jar包,這裏面的內容就更簡單了:

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.boot.context.properties.EnableConfigurationProperties;

import com.tsou.machine.common.config.DevelopmentConfigs;

//掃描註解,不配置默認掃描啓動類的classpath

@SpringBootApplication(scanBasePackages={"com.tsou.machine"})

//注入屬性配置,下文詳解

@EnableConfigurationProperties(value={DevelopmentConfigs.class})

public class MachineApplication {

public static void main(String[] args) {

   SpringApplication.run(MachineApplication.class, args);

}

}

到此,你能夠放心大膽的run as一下這個main方法了,若是沒有報錯,那麼恭喜你,你有80%的成功率了!

八、臥槽!~還有完沒完吶?!~

快了……

一旦運行起來,總得有東西顯示你已經搭建成功了吧!咱們能夠在任意一個module裏面寫一個controller,用來測試。好比,在machine-common裏面有以下代碼:

好了,咱們終於能夠運行一把了,爆發你的洪荒之力吧!

九、求德瑪得!!~怎麼部署??

若是有開發經驗的童鞋,能夠直接跳過。

部署流程簡單說一下,和普通的web工程部署沒有區別,以部署到tomcat爲例:

 

 

 

接下來,你會在console看到一大堆的log...

blablablabla.....

幾條關鍵的log注意一下:

 

 

 

打開瀏覽器,若是能訪問到上述寫好的controller,說明就搭建成功啦!

接下來的事情就簡單了,若是想生成一個war包部署到服務器上的tomcat,只須要使用maven的package命令便可。

至此,項目的搭建算是告一段落了,

 

寫在最後:

不能否認,maven是個好東西,可是經過研究spring boot的過程,我發現了一件使人吐血的問題——下載jar包。

簡直是不要太慢!!!

我通常都是通宵掛機,下載jar包。有的時候,次日早上發現仍是卡在那裏,內心千萬頭草泥馬奔騰而過呀!因此,請童鞋們務必拿出大家對技術的十分耐心和熱情來對待!

 

推廣一下如下訂閱號:「技術匯」,每日爲你呈上熱騰騰的技術乾貨。

 

2016.12.07更新

次日試了一下,使用以上的思路,用多個maven project作了一遍,結果順利成功了!

也許是第一次研究的時候,並無理清頭緒,正所謂「一通百通」,其餘相似的方法也能舉一反三了。

 

 

本篇已獲源做者獨家轉載,轉貼請注意保留原著

相關文章
相關標籤/搜索