Spring Boot + Vue前后端分離項(xiàng)目,Maven自動(dòng)打包整合
作者:xcbeyond
瘋狂源自夢(mèng)想,技術(shù)成就輝煌!微信公眾號(hào):《程序猿技術(shù)大咖》號(hào)主,專(zhuān)注后端開(kāi)發(fā)多年,擁有豐富的研發(fā)經(jīng)驗(yàn),樂(lè)于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項(xiàng)目的研發(fā)工作,涉及架構(gòu)設(shè)計(jì)、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對(duì)于Java、微服務(wù)、數(shù)據(jù)庫(kù)、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗(yàn)。
前言
現(xiàn)在各類(lèi)項(xiàng)目為了降低項(xiàng)目、服務(wù)模塊間的高度耦合性,提出了“前后端分離”,而前后端分離的項(xiàng)目該如何打包呢?
一般的做法是前端項(xiàng)目打包完,將打包文件手動(dòng)復(fù)制到后端項(xiàng)目工程的src\main\resources\static目錄下,再進(jìn)行后端工程項(xiàng)目打包,這樣手動(dòng)來(lái)回復(fù)制、多次打包總是讓人覺(jué)得麻煩。(即使采用Jenkins打包部署,也會(huì)存在上面2次打包過(guò)程)
為了解決上述問(wèn)題,我特意查詢了Maven build的相關(guān)配置及插件,發(fā)現(xiàn)解決上述問(wèn)題,通過(guò)Maven自動(dòng)打包整合其實(shí)不難,在此與大家進(jìn)行分享。
前后端項(xiàng)目結(jié)構(gòu)要求
以Spring Boot + Vue的向后端項(xiàng)目為例說(shuō)明。
通過(guò)Maven構(gòu)建項(xiàng)目,針對(duì)子父項(xiàng)目結(jié)構(gòu)創(chuàng)建前端、后端工程,結(jié)構(gòu)如下:
spring-boot-vue-parent
|---spring-boot # spring boot后端工程
|---src
|---main
|---java
|---...
|---resources
|---static # 存放前端資源的目錄
|---pom.xml # spring-boot后端工程的pom.xml文件
|---vue-ui # Vue前端工程
|---...
|---dist # 打包編譯時(shí),自動(dòng)創(chuàng)建的目錄,無(wú)需手動(dòng)創(chuàng)建該目錄
|---pom.xml # Vue前端工程的pom.xml文件,此文件可不要
pom.xml 父工程的pom.xml文件
上述只羅列了關(guān)鍵的目錄結(jié)構(gòu)。
配置pom.xml文件
1、父工程的pom.xml文件
滿足Maven 子父項(xiàng)目結(jié)構(gòu)配置要求,配置spring-boot-maven-plugin插件。
<?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.xcbeyond.demo</groupId>
<artifactId>demo</artifactId>
<packaging>pom</packaging>
<version>1.0.0</version>
<modules>
<!-- spring boot后端工程,作為子工程 -->
<module>spring-boot</module>
<!-- Vue前端工程,作為子工程 -->
<module>vue-ui</module>
</modules>
<dependencies>
# 配置項(xiàng)目依賴包
……
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.0.7.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal><!--可以把依賴的包都打包到生成的Jar包中-->
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
2、Vue前端工程的pom.xml文件
對(duì)應(yīng)Vue項(xiàng)目而言,pom.xml對(duì)它而言是不存在的,也是毫無(wú)意義的,此文件可以不要。在此體現(xiàn)出來(lái),只是為了配置子父工程而已,凸顯出Vue工程屬于父工程的子工程而已,便于IDE導(dǎo)入呈現(xiàn)展示而已。
<?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>
<artifactId>demo</artifactId>
<groupId>com.xcbeyond.demo</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xcbeyond.demo.vue.ui</groupId>
<artifactId>vue-ui</artifactId>
</project>
3、后端工程的pom.xml文件
該pom.xml文件是需要重點(diǎn)關(guān)注配置的,如下:
<?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>
<artifactId>demo</artifactId>
<groupId>com.xcbeyond.demo</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xcbeyond.demo.spring.boot</groupId>
<artifactId>spring-boot</artifactId>
<dependencies>
# 配置項(xiàng)目依賴包
……
</dependencies>
<build>
<plugins>
<!-- 插件maven-clean-plugin,用于在編譯前,清除之前編譯的文件、文件夾等,避免殘留之前的內(nèi)容 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<filesets>
<fileset>
<!-- 前端資源目錄,即:存放前端包目錄-->
<directory>src/main/resources/static</directory>
</fileset>
<fileset>
<!-- Vue項(xiàng)目打包自動(dòng)生成的dist目錄 -->
<directory>${project.parent.basedir}/vue-ui/dist</directory>
</fileset>
</filesets>
</configuration>
</plugin>
<!--frontend-maven-plugin為項(xiàng)目本地下載/安裝Node和NPM,運(yùn)行npm install命令-->
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>1.6</version>
<configuration>
<workingDirectory>${project.parent.basedir}/vue-ui</workingDirectory>
</configuration>
<executions>
<execution>
<id>install node and npm</id>
<goals>
<goal>install-node-and-npm</goal>
</goals>
<configuration>
<nodeVersion>v8.12.0</nodeVersion>
<npmVersion>6.4.1</npmVersion>
</configuration>
</execution>
<!-- Install all project dependencies -->
<execution>
<id>npm install</id>
<goals>
<goal>npm</goal>
</goals>
<phase>generate-resources</phase>
<configuration>
<arguments>install</arguments>
</configuration>
</execution>
<!-- Build and minify static files -->
<execution>
<id>npm run build</id>
<goals>
<goal>npm</goal>
</goals>
<configuration>
<arguments>run build</arguments>
</configuration>
</execution>
</executions>
</plugin>
<!--資源插件,主要為了從前端項(xiàng)目里復(fù)制打包好的文件到springboot項(xiàng)目-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>copy static</id>
<phase>generate-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<!-- 復(fù)制前端打包文件到這里 -->
<outputDirectory>src/main/resources/static</outputDirectory>
<overwrite>true</overwrite>
<resources>
<resource>
<!-- 從前端打包的目錄dist進(jìn)行指定文件、文件夾內(nèi)容的復(fù)制-->
<directory>${project.parent.basedir}/vue-ui/dist</directory>
<includes>
<!-- 具體根據(jù)實(shí)際前端代碼、及目錄結(jié)構(gòu)進(jìn)行配置-->
<include>css/</include>
<include>fonts/</include>
<include>img/</include>
<include>js/</include>
<include>favicon.ico</include>
<include>index.html</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
打包部署
上述的pom.xml配置,已經(jīng)整合了前后端項(xiàng)目的Maven自動(dòng)打包,打包時(shí),只需關(guān)注后端項(xiàng)目(spring-boot子工程)打包即可,就會(huì)將前端、后端一起打包到后端成功中。
在子工程后端工程中,執(zhí)行打包命令mvn clean package -Dmaven.test.skip=true, 或采用IDE中相應(yīng)的Maven直接打包。
至此,只需一次打包,即可完成前后端項(xiàng)目的Maven自動(dòng)打包了,再也不用擔(dān)心多次打包、漏打包的情況。