一、爲何是多個 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作了一遍,結果順利成功了!
也許是第一次研究的時候,並無理清頭緒,正所謂「一通百通」,其餘相似的方法也能舉一反三了。
本篇已獲源做者獨家轉載,轉貼請注意保留原著