架構系列四:Maven實現動靜分離打war包及zip包
目標:實現Maven動靜分離打包,靜態資源打成zip包,動態資源打成war包,方便獨立部署
工程結構
打包前先看下工程結構
我的靜態資源都是放在webapp目錄下面,有css,fonts,html,images,js,根目錄下的login.js,login.html,打包時需要將這些靜態資原始檔打成單獨的zip包,動態資源打成單獨的war包
打war包
pom.xml檔案內容如下
<build>
<finalName>dp</finalName>
<plugins>
<plugin>
<groupId >org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<useCache>false</useCache>
<!--排除靜態資源 ,靜態資源單獨打包-->
<packagingExcludes>
css/**,fonts/**,html/**,images/**,js/**,login.html,login.js
</packagingExcludes>
</configuration>
</plugin>
<plugins>
<build>
這裡使用maven-war-plugin打war包,打包時,在packagingExcludes標籤中排除所有的靜態資原始檔,打出來的war包只有resource檔案檔案,jsp檔案,class檔案等,結構如下
打靜態zip包
這裡使用maven-assembly-plugin外掛打zip包,打包之前,需要在src/main/assembly/路徑下增加static-zip.xml檔案,該檔案主要用來指定zip包中要包含有哪些靜態資原始檔,及靜態資原始檔的輸出目錄,static-zip.xml檔案內容如下:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0
http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>dp-static</id>
<formats>
<!-- 輸出的檔案格式 -->
<format>zip</format>
</formats>
<!-- 不包含根目錄,如果為true,會在我們生成的zip檔案結構中多出一層dp目錄 -->
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<!-- 把圖樣式檔案輸出到css目錄下 -->
<fileSet>
<directory>${project.basedir}/target/dp/css/</directory>
<outputDirectory>css</outputDirectory>
</fileSet>
<!-- 把字型檔案輸出到fonts目錄下 -->
<fileSet>
<directory>${project.basedir}/target/dp/fonts</directory>
<outputDirectory>fonts</outputDirectory>
</fileSet>
<!-- 把靜態頁面輸出到html目錄下 -->
<fileSet>
<directory>${project.basedir}/target/dp/html</directory>
<outputDirectory>html</outputDirectory>
</fileSet>
<!-- 把圖片輸出到images目錄下 -->
<fileSet>
<directory>${project.basedir}/target/dp/images</directory>
<outputDirectory>images</outputDirectory>
</fileSet>
<!-- 把js檔案輸出到js目錄下 -->
<fileSet>
<directory>${project.basedir}/target/dp/js</directory>
<outputDirectory>js</outputDirectory>
</fileSet>
<!-- 把login.js,login.html檔案輸出到根目錄下 -->
<fileSet>
<directory>${project.basedir}/target/dp/</directory>
<includes>
<include>login.js</include>
<include>login.html</include>
</includes>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
</assembly>
重點說下,為什麼這裡指定的是target目錄下呢,編譯完成後,在target目錄下會生成dp目錄(也就是你的工程名),在dp目錄下有編譯過後的所有檔案,包括靜態資原始檔因此zip包時,因此從target/dp目錄下取靜態資原始檔,target/dp目錄如下
再來看下pom.xml檔案的配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<finalName>dp-static</finalName>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/static-zip.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
說明:
1.phase標籤:值為package,在打包時執行,打包前會先編譯並在target目錄下生成dp目錄,確保在打包時,能從target目錄下獲取到所有的靜態資原始檔
2.finalName標籤:自定義zip包名稱,打出來的zip檔名為dp-static
3.descriptor標籤:指定了上面新增的static-zip.xml檔案,打包時,會自動執行這個檔案生成zip檔案
執行maven install命令後,在target目錄下,生成了dp.war包,也生成了dp-static.zip包,如下
最後附上完整的pom檔案的打包程式碼,如下
<build>
<finalName>dp</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<useCache>false</useCache>
<!--排除靜態資源 ,靜態資源單獨打包-->
<packagingExcludes>
css/**,fonts/**,html/**,images/**,js/**,login.html,login.js
</packagingExcludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<finalName>dp-static</finalName>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/static-zip.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
<plugins>
<build>