IntelliJ Idea14 建立Maven多模塊項目,多繼承,熱部署配置總結(二)

接着上文【IntelliJ Idea14 建立Maven多模塊項目,多繼承,熱部署配置總結(一)】,總結下項目熱部署和pom文件結構的一些要點:java

一,依賴包的熱部署

上文中項目若是改了依賴包core模塊中的service服務代碼,重啓web服務是看不到改動效果的,這是由於依賴的core已經打成jar包給web模塊使用了,重啓並不會從新打jar包,因此只能從新package打包才能看到效果。 【解決方案】:把依賴的core模塊,編譯到web模塊裏面去,在web下生成core的class文件,這樣重啓編譯就會實時更新界面了。 【未處理以前】: 在這裏插入圖片描述 配置模塊的output layout下的class,選中對應的依賴右鍵,點擊put into output root 在這裏插入圖片描述 【處理以後,從新打包,啓動】: 在這裏插入圖片描述 有了class文件以後,重啓就能看到service的改動了。web

此外Project Stucture裏面還有一些其餘要注意的點: 1,【Modules】當項目的JDK是1.8的時候,配置每一個module的Language Level爲對應的JDK的level;spring

2,【Facets】 檢查Facets右邊的【Deplyment Descriptors】,必須是指向web.xml 檢查Facets右邊的【Web Resource Directories】,必須是選中webapp的目錄,相似普通非maven的項目須要指向WebRoot或者WebContent目錄json

3,【Artifacts】就是上面的熱部署配置。api


二,pom配置要點

2.1 pom的繼承

1,項目模塊能夠一層一層的繼承下去,好比多層級的module方式:tomcat

module-test
--- module-test-common
--- module-test-platform
--- --- module-test-platform-A
--- --- module-test-platform-B

由上可知:app

  1. module-test-platform-A和module-test-platform-B的parent是module-test-platform
  2. module-test-platform和module-test-common的parent是module-test

上面配置要實現的話,也很簡單,只須要將module-test-platform的pom.xml裏面配置成<packaging>pom</packaging>,而後module-test-platform-A和module-test-platform-B的parent都以來module-test-platform的GAV(maven三要素:groupId/artifactId/version)就好了。webapp

<packaging>不寫的話默認是jar,意思就是打成jar包; 寫pom的意思就是作父模塊,給子模塊繼承或者引用; 寫war的意思就是打成war包給tomcat啓動;jsp

在Maven 中除了用繼承parent來作版本控制之外, 還能夠經過 scope=import 來作版本控制.maven

Maven 2.0.9 添加了一個新特性: scope = import 也就是從外部導入依賴管理的依賴配置. 使用過 DependencyManagement都知道, 多模塊構建項目的時候, 爲了解決各模塊依賴版本一致, 統一在父pom.xml文件中統必定義各個依賴jar文件的版本, 而後子模塊經過引用的方式添加須要的依賴jar, 但隨着項目工程愈來愈大, 添加的依賴文件也越來也多, 父pom.xml的 DependencyManagement 也會愈來愈長, 不便於管理. 另外, 由於pom.xml 是單繼承的, 若是已經有一個父pom.xml了, 想要再引用外部的pom.xml, 就只能複製到父pom.xml中了. 所以採用在 DependencyManagement 中使用scope = import的方式能夠分類引入更多的管理配置, 也擺脫了單繼承的限制.


使用import scope解決maven繼承(單)問題

想必你們在作SpringBoot應用的時候,都會有以下代碼:

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>1.3.3.RELEASE</version>
</parent>

繼承一個父模塊,而後再引入相應的依賴

假如說,我不想繼承,或者我想繼承多個,怎麼作?

咱們知道Maven的繼承和Java的繼承同樣,是沒法實現多重繼承的,若是10個、20個甚至更多模塊繼承自同一個模塊,那麼按照咱們以前的作法,這個父模塊的dependencyManagement會包含大量的依賴。若是你想把這些依賴分類以更清晰的管理,那就不可能了,import scope依賴能解決這個問題。你能夠把dependencyManagement放到單獨的專門用來管理依賴的pom中,而後在須要使用依賴的模塊中經過import scope依賴,就能夠引入dependencyManagement。例如能夠寫這樣一個用於依賴管理的pom:

<project>
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.test.sample</groupId>
	<artifactId>base-parent1</artifactId>
	<packaging>pom</packaging>
	<version>1.0.0-SNAPSHOT</version>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>junit</groupId>
				<artifactid>junit</artifactId>
				<version>4.8.2</version>
			</dependency>
			<dependency>
				<groupId>log4j</groupId>
				<artifactid>log4j</artifactId>
				<version>1.2.16</version>
			</dependency>
		</dependencies>
	</dependencyManagement>
</project>

而後我就能夠經過非繼承的方式來引入這段依賴管理配置

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>com.test.sample</groupId>
			<artifactid>base-parent1</artifactId>
			<version>1.0.0-SNAPSHOT</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>
 
<dependency>
	<groupId>junit</groupId>
	<artifactid>junit</artifactId>
</dependency>
<dependency>
	<groupId>log4j</groupId>
	<artifactid>log4j</artifactId>
</dependency>

注意:import scope只能用在dependencyManagement裏面

這樣,父模塊的pom就會很是乾淨,由專門的packaging爲pom來管理依賴,也契合的面向對象設計中的單一職責原則。此外,咱們還可以建立多個這樣的依賴管理pom,以更細化的方式管理依賴。這種作法與面向對象設計中使用組合而非繼承也有點類似的味道。

那麼,如何用這個方法來解決SpringBoot的那個繼承問題呢?

配置以下:

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-dependencies</artifactId>
			<version>1.3.3.RELEASE</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>
 
<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
</dependencies>

這樣配置的話,本身的項目裏面就不須要繼承SpringBoot的module了,而能夠繼承本身項目的module了。

參考:https://blog.csdn.net/mn960mn/article/details/50894022


2.2 dependencies與dependencyManagement的區別

在咱們項目頂層的POM文件中,咱們會看到dependencyManagement元素。經過它元素來管理jar包的版本,讓子項目中引用一個依賴而不用顯示的列出版本號。Maven會沿着父子層次向上走,直到找到一個擁有dependencyManagement元素的項目,而後它就會使用在這個dependencyManagement元素中指定的版本號。

這樣作的好處:統一管理項目的版本號,確保應用的各個項目的依賴和版本一致,才能保證測試的和發佈的是相同的成果,所以,在頂層pom中定義共同的依賴關係。同時能夠避免在每一個使用的子項目中都聲明一個版本號,這樣想升級或者切換到另外一個版本時,只須要在父類容器裏更新,不須要任何一個子項目的修改;若是某個子項目須要另一個版本號時,只須要在dependencies中聲明一個版本號便可。子類就會使用子類聲明的版本號,不繼承於父類版本號。

區別:

dependencies即便在子項目中不寫該依賴項,那麼子項目仍然會從父項目中繼承該依賴項(所有繼承)

dependencyManagement裏只是聲明依賴,並不實現引入,所以子項目須要顯示的聲明須要用的依賴。若是不在子項目中聲明依賴,是不會從父項目中繼承下來的;只有在子項目中寫了該依賴項,而且沒有指定具體版本,纔會從父項目中繼承該項,而且version和scope都讀取自父pom;另外若是子項目中指定了版本號,那麼會使用子項目中指定的jar版本。


2.3 Maven依賴Scope選項詳解

在一個maven項目中,若是存在編譯須要而發佈不須要的jar包,能夠用scope標籤,值設爲provided。

以下:

<dependency>
  <groupId>javax.servlet.jsp</groupId>
  <artifactId>jsp-api</artifactId>
  <version>2.3</version>
  <scope>provided</scope>      
</dependency>

Scope的其餘參數以下:

compile:默認的scope,表示 dependency 均可以在生命週期中使用。 並且,這些dependencies 會傳遞到依賴的項目中。適用於全部階段,會隨着項目一塊兒發佈

provided:跟compile類似,可是代表了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。這個scope 只能做用在編譯和測試時,同時沒有傳遞性,即:child module沒法引用。

runtime:表示dependency不做用在編譯時,但會做用在運行和測試時,如JDBC驅動,適用運行和測試階段,與provided相反。

test:表示dependency做用在測試時,不做用在運行時。 只在測試時使用,用於編譯和運行測試代碼。不會隨項目發佈。

system:跟provided 類似,可是在系統中要之外部JAR包的形式提供,maven不會在repository查找它。


2.4 Maven的classifier做用

classifier能夠是任意的字符串,用於拼接在GAV以後來肯定指定的文件。 可用於區分不一樣jdk版本所生成的jar包

<dependency>  
    <groupId>net.sf.json-lib</groupId>   
    <artifactId>json-lib</artifactId>   
    <version>2.2.2</version>  
    <classifier>jdk15</classifier>    
</dependency>

<dependency>  
    <groupId>net.sf.json-lib</groupId>   
    <artifactId>json-lib</artifactId>   
    <version>2.2.2</version>  
    <classifier>jdk13</classifier>    
</dependency>

實際上對應的jar包是json-lib-2.2.2-jdk15.jarjson-lib-2.2.2-jdk13.jar

區分項目的不一樣組成部分,例如:源代碼、javadoc、類文件等。

<dependency>  
    <groupId>net.sf.json-lib</groupId>   
    <artifactId>json-lib</artifactId>   
    <version>2.2.2</version>  
    <classifier>jdk15-javadoc</classifier>    
</dependency>

對應的是json-lib-2.2.2-jdk15-javadoc.jar

須要注意classifier的位置

<dependency>  
    <groupId>net.sf.json-lib</groupId>   
    <artifactId>json-lib</artifactId>   
    <classifier>jdk15-javadoc</classifier>  
    <version>2.2.2</version>   
</dependency>

對應的是json-lib-jdk15-javadoc-2.2.2.jar。可能會出現找不到jar包的狀況。

相關文章
相關標籤/搜索