Maven中pom.xml標籤
技術標籤:其他
外掛標籤:plugin
外掛:maven-compiler-plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</ encoding>
</configuration>
</plugin>
maven是個專案管理工具,maven-compiler-plugin的配置,就是用來告訴它我們的程式碼要使用什麼樣的jdk版本編譯,如果不指定版本他就會使用預設的jdk版本來進行處理,maven的預設編譯使用的jdk版本很低,這樣就容易出現版本不匹配,以至於可能導致編譯不通過的問題
下面展示關於maven-compiler-plugin的完整配置
<plugin>
<!-- 指定maven編譯的jdk版本,如果不指定,maven3預設用jdk 1.5 maven2預設用jdk1.3 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
< version>3.1</version>
<configuration>
<!-- 一般而言,target與source是保持一致的,但是,有時候為了讓程式能在其他版本的jdk中執行(對於低版本目標jdk,原始碼中不能使用低版本jdk中不支援的語法),會存在target不同於source的情況 -->
<source>1.8</source> <!-- 原始碼使用的JDK版本 -->
<target>1.8</target> <!-- 需要生成的目標class檔案的編譯版本 -->
<encoding>UTF-8</encoding><!-- 字符集編碼 -->
<skipTests>true</skipTests><!-- 跳過測試 -->
<verbose>true</verbose>
<showWarnings>true</showWarnings>
<fork>true</fork><!-- 要使compilerVersion標籤生效,還需要將fork設為true,用於明確表示編譯版本配置的可用 -->
<executable><!-- path-to-javac --></executable><!-- 使用指定的javac命令,例如:<executable>${JAVA_1_4_HOME}/bin/javac</executable> -->
<compilerVersion>1.3</compilerVersion><!-- 指定外掛將使用的編譯器的版本 -->
<meminitial>128m</meminitial><!-- 編譯器使用的初始記憶體 -->
<maxmem>512m</maxmem><!-- 編譯器使用的最大記憶體 -->
<compilerArgument>-verbose -bootclasspath ${java.home}\lib\rt.jar</compilerArgument><!-- 這個選項用來傳遞編譯器自身不包含但是卻支援的引數選項 -->
</configuration>
</plugin>
引自:https://blog.csdn.net/liupeifeng3514/article/details/80236077
在指定JDK版本的時候,其實也有很多種方式:
方式一:
<properties>
<!-- maven-compiler-plugin 將會使用指定的 JDK 版本將 java 檔案編譯為 class 檔案(針對編譯執行環境) -->
<maven.compiler.target>1.8</maven.compiler.target>
<!-- maven-compiler-plugin 將會使用指定的 JDK 版本對原始碼進行編譯(針對編譯執行環境) -->
<maven.compiler.source>1.8</maven.compiler.source>
<properties>
方式二:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<!-- 同【方式一】的 maven.compiler.target -->
<source>1.8</source>
<!-- 同【方式一】的 maven.compiler.source -->
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
方式三:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
方式三的有幾個前提條件:
- 專案為一個 SpringBoot 工程
- 專案的 POM 繼承了 spring-boot-starter-parent(其實spring-boot父標籤已經幫你我們寫好了,可以點進去看)
引自:https://blog.csdn.net/yangchao1125/article/details/100585116
外掛:maven-source-plugin
<plugin>
<artifactId>maven-source-plugin</artifactId>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
在很多情況下,需要對於Maven工程的原始碼進行原始檔的打包,可以利用maven-source-plugin外掛來完成。利用Maven的Source外掛,對Maven工程的原始碼進行打各種包。使用者可以根據需要將任何外掛目標繫結到任何生命週期的階段,如:將maven-source-plugin的jar-no-fork目標繫結到default生命週期的package階段,這樣,以後在執行mvn package命令打包專案時,在package階段之後會執行原始碼打包。
execution下可配置phase屬性, 意思是在什麼階段打包原始檔。如install在執行mvn install時打包原始碼
補充:
執行 mvn install,maven會自動將source install到repository 。
執行 mvn deploy,maven會自動將source deploy到remote-repository 。
執行 mvn source:jar,單獨打包原始碼。
注意:在多專案構建中,將source-plugin置於頂層或parent的pom中並不會發揮作用,必須置於具體專案的pom中。
引自:https://www.cnblogs.com/yantz/p/4463374.html
標籤:packaging
例如pom.xml的一段配置:
<groupId>com.alibaba.scrm</groupId>
<artifactId>scrm-server-share</artifactId>
<packaging>jar</packaging>
<version>1.0.0-SNAPSHOT</version>
pom:該方式主要是管理maven專案的,裡面不放原始碼,用於繼承或聚合的maven模組中
war:會將專案打成war包,對於web專案來說,通常會設定為war (如果需要把專案包放到tomcat來啟動,就要使用這種)
jar:打成jar包,對於普通java專案來說,通常會設定為jar(比如springboot內建了tomcat,通過java命令就可以啟動)
標籤 dependency
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.9.100.ALL</version>
</dependency>
描述:我們要使用的jar包的gav資訊放到這裡,這樣maven就可以自動下載相關jar包了。
標籤 dependency-scope
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
在dependency標籤下有一個scope標籤,該標籤的作用是可以設定依賴在專案的使用階段,通常來說,專案包含:編譯、執行、測試、打包這些不同的階段。
- compile:是預設值,適用於所有階段,編譯、執行、測試、打包都會包含到專案中。
- test:只在測試時使用,用於編譯和執行測試程式碼,不會隨專案釋出,
例如junit,如果不修改junit依賴中的scope,我們只能在test目錄下使用junit相關類。 - runtime:只在執行時使用,例如mysql的JDBC驅動依賴,我們在編寫程式碼的時候使用java.sql包下的類即可,在執行的時候才會用到該依賴,適用執行和測試階段。
- provided:編譯、執行階段使用,打包時不會包含該依賴,例如servlet.jar,這個包在
tomcat容器中已經提供了,因此打包時servlet.jar 無需包含在專案中。 - system:類似provided,需要顯式提供包含依賴的jar的路徑(使用systemPath標籤),Maven不會在倉庫中查詢它。使用較少
標籤 dependency-systemPath
<dependency>
<groupId>org.apache</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/log4j-1.2.17.jar</systemPath>
</dependency>
引入非本地倉庫中的jar包,有時候我們需要使用一些jar包,但是這些jar在maven倉庫中並不存在,此時可以使使用下面方式引用,以log4j為例:
注意:如果這樣引入非本地參考的jar包,在使用maven打包時是不會將該jar打包入專案中的,所以還需要新增下面內容:
<build>
<resources>
<resource>
<directory>${project.basedir}/lib</directory>
<targetPath>BOOT-INF/lib/</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<targetPath>BOOT-INF/classes/</targetPath>
</resource>
</resources>
</build>
標籤 properties
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jdk.version>1.8</jdk.version>
</properties>
......
<source>${jdk.version}</source>
有時候對於同一個技術需要編寫很多個依賴引入相關的jar包,每個依賴中都要填寫版本號,倘若更換版本號的話,修改的地方比較多,所以可以使用properties統一管理版本號,logback-version可以自由命名,通過${}方式進行引用:
標籤 build
Label Description
sourceDirectory Java檔案目錄
testSourceDirectory 測試Java檔案目錄
resources 資原始檔目錄
testResources 測試資原始檔
outputDirectory 原始檔輸入出目錄
testOutputDirectory 測試檔案輸出目錄
finalName 指出最終打包的包名
defaultGoal 指定預設的引數,當執行maven命令時沒有指定引數是使用預設引數,如compile、install
filters 使用配置檔案中的值替換專案中的佔位符
本文引自:http://www.monkey1024.com/javaweb/2168