當我們在使用 Maven 的 maven-war-plugin 建置 war 專案時常會發現,
如果有使用一些 javascript/css 最小化 (minify) 的 plugin,
例如 minify-maven-plugin,
minify-maven-plugin 會先執行把 js/css 檔做最小化,
然後 maven-war-plugin 會在 package phase 時從專案把未被最小化的 source code 放到
輸出資料夾中 (包括 war 檔),此時未被最小化的 source code
會把己被 minify-maven-plugin 最小化的檔案給覆蓋掉,
造成最後輸出資料夾、war 檔裡的檔案沒有成功被最小化。
以下分享一個解決的方法,
可以使用 minify-maven-plugin 的 <webappTargetDir> 設定
把最小化過的檔案放在另一個資料夾下,
例如: ${basedir}/target/minify (等同 ${project.build.directory}/minify)
資料夾中 ("minify" 資料夾名可自行決定),
<webappTargetDir>${project.build.directory}/minify</webappTargetDir>
然後再使用 maven-war-plugin 的 <webResource> 設定將
${basedir}/target/minify 資料夾中的
最小化檔案放回至專案輸出資料夾中
(也包括 war 檔裡)
<webResource>
<directory>${project.build.directory}/minify</directory>
</webResource>
如以下範例:
<plugin>
<groupId>com.samaxes.maven</groupId>
<artifactId>minify-maven-plugin</artifactId>
<version>1.7.6</version>
<executions>
<execution>
<id>default-minify</id>
<configuration>
<skipMerge>true</skipMerge>
<nosuffix>true</nosuffix>
<webappSourceDir>${basedir}/WebContent</webappSourceDir>
<webappTargetDir>${project.build.directory}/minify</webappTargetDir>
<cssSourceDir>./</cssSourceDir>
<cssSourceIncludes>
<cssSourceInclude>**/*.css</cssSourceInclude>
</cssSourceIncludes>
<cssSourceExcludes>
<cssSourceExclude>**/*.min.css</cssSourceExclude>
</cssSourceExcludes>
<jsSourceDir>./</jsSourceDir>
<jsSourceIncludes>
<jsSourceInclude>**/*.js</jsSourceInclude>
</jsSourceIncludes>
<jsSourceExcludes>
<jsSourceExclude>**/*.min.js</jsSourceExclude>
<jsSourceExclude>**/node_modules/**/*.js</jsSourceExclude>
<jsSourceExclude>**/webpack.config.js</jsSourceExclude>
</jsSourceExcludes>
<jsEngine>CLOSURE</jsEngine>
</configuration>
<phase>prepare-package</phase>
<goals>
<goal>minify</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<rules>
<requireJavaVersion>
<version>11</version>
</requireJavaVersion>
</rules>
<source>11</source>
<target>11</target>
<release>11</release>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<webResources>
<webResource>
<directory>${project.build.directory}/minify</directory>
</webResource>
</webResources>
<archive>
<addMavenDescriptor>false</addMavenDescriptor>
</archive>
</configuration>
</plugin>
參考:
-
How to get maven to build a war with minified files using
yuicompressor-maven-plugin
-
yuicompressor maven plugin and maven-war-plugin
- Maven内置属性、POM属性 - Ruthless - 博客园
- Adding and Filtering External Web Resources
- Minification of JS and CSS Assets with Maven