2、實際使用maven進行編譯打包
1)對common模塊進行編譯打包
pom中配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
執行clean-compile-install
2)對parent項目編譯
實踐中發現必須先將父項目進行編譯後,其他模塊才能正常編譯打包
parent項目pom設置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
執行-clean-complile-package
3)對baseService模塊進行編譯打包
pom設置:
<dependencies>
<!--依賴common模塊-->
<dependency>
<groupId>com.tzwy.mcsp</groupId>
<artifactId>common</artifactId>
<version>${project.parent.version}</version>
</dependency>
<!--freemarker-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!--shiro-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>${shiro.version}</version>
</dependency>
<!--驗證碼-->
<dependency>
<groupId>com.github.axet</groupId>
<artifactId>kaptcha</artifactId>
<version>${kaptcha.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
執行:clean-complile-package
4)對esmService模塊進行編譯打包
pom設置:
?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>mcsp</artifactId>
<groupId>com.tzwy.mcsp</groupId>
<version>1.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>esmService</artifactId>
<dependencies>
<!--依賴baseService模塊-->
<dependency>
<groupId>com.tzwy.mcsp</groupId>
<artifactId>baseService</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--<configuration>-->
<!--<classifier>exec</classifier>-->
<!--</configuration>-->
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
執行:clean-complile-package
5)運行項目:
右鍵點擊debugRun,完成運行;
可以看到,build中配置了resources;
理解resources
構建Maven項目的時候,如果沒有進行特殊的配置,Maven會按照標準的目錄結構查找和處理各種類型文件。
src/main/java和src/test/java
這兩個目錄中的所有*.java文件會分別在comile和test-comiple階段被編譯,編譯結果分別放到了target/classes和targe/test-classes目錄中,但是這兩個目錄中的其他文件都會被忽略掉。
src/main/resouces和src/test/resources
這兩個目錄中的文件也會分別被複制到target/classes和target/test-classes目錄中。
target/classes
打包插件默認會把這個目錄中的所有內容打入到jar包或者war包中。
Maven項目的標準目錄結構
- src
- main
- java 源文件
- resources 資源文件
- filters 資源過濾文件
- config 配置文件
- scripts 腳本文件
- webapp web應用文件
- test
- java 測試源文件
- resources 測試資源文件
- filters 測試資源過濾文件
- it 集成測試
- assembly assembly descriptors
- site Site
- main
- target
- generated-sources
- classes
- generated-test-sources
- test-classes
- xxx.jar
- pom.xml
- LICENSE.txt
- NOTICE.txt
- README.txt
資源文件的配置
資源文件是Java代碼中要使用的文件。代碼在執行的時候會到指定位置去查找這些文件。前面已經說了Maven默認的處理方式,但是有時候我們需要進行自定義的配置。
一般情況下,我們用到的資源文件(各種xml,properites,xsd文件等)都放在src/main/resources下面,利用maven打包時,maven能把這些資源文件打包到相應的jar或者war裏。
有時候,比如mybatis的mapper.xml文件,我們習慣把它和Mapper.java放一起,都在src/main/java下面,這樣利用maven打包時,就需要修改pom.xml文件,來把mapper.xml文件一起打包進jar或者war裏了,否則,這些文件不會被打包的。(maven認爲src/main/java只是java的源代碼路徑)。網絡上有很多方法,我大概試了下,幾種方法都可以,可以任選一種即可。
一是在<build>元素下添加<resources>進行配置。
另一種是在<build>的<plugins>子元素中配置maven-resources-plugin等處理資源文件的插件。
1)配置resouces節點
<build>
.......
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
</excludes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
......
</build>
下面是另一個項目中具體案例,瞭解一下各個節點的意思:
<resource>
<!-- 要打包的文件所在的目錄 -->
<directory>src/main/webapp/</directory>
<!-- includes 和 excludes 都可以獨立配置,也可以同時配置 -->
<!-- 指定要打包的文件 -->
<!-- <includes> <include>**/*.*</include> </includes> -->
<!-- 或者也可以剔除不需要打包的文件 -->
<excludes>
<exclude>**/*.xml</exclude>
</excludes>
<!-- 指定打包到目的文件夾 -->
<targetPath>META-INF/resources/</targetPath>
</resource>
2)配置資源處理插件
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<id>copy-xmls</id>
<phase>process-sources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/classes</outputDirectory>
<resources>
<resource>
<directory>${basedir}/src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
另一個插件也能完成相同的功能
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>add-resource</id>
<phase>generate-resources</phase>
<goals>
<goal>add-resource</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
打包時文件相關的配置
打包時target/classes目錄中的資源文件會和class字節碼一起被打進jar包或war包中。有時候默認的情況不能完全滿足需求,如target/classes目錄中的一些文件不希望打入jar包中,就需要額外配置maven-jar-plugin插件。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<excludes>
<exclude>*.properties</exclude>
</excludes>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>xxxxxx.ConsoleLauncher</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
參考資料:https://www.cnblogs.com/pixy/p/4798089.html
記錄坑:
1、項目啓動後使用font-awesome.min.css時,圖標無法正常顯示;
原因:一開始在pom文件中maven插件配置成了
<filtering>true</filtering>
修改爲false後成功顯示圖標;
Filtering功能:
Filtering 是 Maven Resources Plugin 的一個功能,它會使用系統屬性或者項目屬性的值替換資源文件(*.properties,*.xml)當中 ${…} 符號的值。比如你係統屬性有一項 “user.name=foobar”,那麼資源文件當中的 ${user.name} 符號會在 Maven 編譯時自動被替換爲 “foobar”。
舉個例子:
默認的項目資源文件位於 “src/main/resources” 目錄,在該目錄下創建一個文件 “test.properties”,裏面寫上一行:
Hello ${user.name}
然後修改項目文件(pom.xml)啓用 filtering 功能,如:
<project> ... <build> ... <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> ... </resources> ... </build> ... </project> |
然後編譯項目:
$mvn clean compile -Duser.name=foobar |
查看輸出文件 target/classes/test.properties 的內容,可見原先的 “Hello {user.name}” 已經變成 “Hello foobar”。
我們也可以把 filtering 用到的變量寫在項目屬性段裏,比如:
<project> ... <properties> <user.name>foobar</user.name> <user.email>[email protected]</user.email> </properties> ... </project> |
如果屬性項比較多的話,最佳實踐是把他們抽離出來獨立一個屬性文件,比如在你項目目錄(即 pom.xml 文件所在的目錄)新建一個屬性文件 project.properties:
user.name=foobar user.email=[email protected] |
然後在 build/filters/filter 裏指明使用這個屬性文件作爲 filtering 屬性值的來源:
<project> ... <build> ... <filters> <filter>project.properties</filter> </filters> ... </build> ... </project> |
參考資料:http://www.360doc.com/content/15/0123/10/20466010_443036304.shtml