欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

熟悉maven:使java開(kāi)發(fā)變得更高效

 更新時(shí)間:2021年06月07日 16:01:26   作者:風(fēng)在哪  
在日常的開(kāi)發(fā)過(guò)程中,maven是很常見(jiàn)的項(xiàng)目構(gòu)建工具。maven可以極大的提高我們的開(kāi)發(fā)效率,幫助我們簡(jiǎn)化開(kāi)發(fā)過(guò)程中一些解決依賴(lài)和項(xiàng)目部署的相關(guān)問(wèn)題,所以學(xué)習(xí)掌握maven的相關(guān)知識(shí)是非常有必要的

本文從入門(mén)安裝開(kāi)始,逐步深入講解maven的相關(guān)知識(shí)

1、安裝maven

首先我們需要準(zhǔn)備好安裝包,這里推薦在官網(wǎng)下載:maven官網(wǎng)下載地址

我這里下載的是3.8.1版本的maven,不同版本的maven配置過(guò)程基本是一樣的。

1.1 Windows安裝

首先將maven安裝包解壓,根據(jù)自己的習(xí)慣選擇解壓目錄,后續(xù)配置需要使用到解壓的目錄。我這里解壓到了D:\software\Maven,之后的配置也是從這里開(kāi)始的。

首先要配置Windows的環(huán)境變量,如果是最新版的Windows 10,那么右鍵單擊屬性后會(huì)出現(xiàn)如下頁(yè)面,點(diǎn)擊高級(jí)系統(tǒng)設(shè)置=>環(huán)境變量即可:

在這里插入圖片描述

在這里插入圖片描述

接下來(lái)就是配置系統(tǒng)變量,首先配置MAVEN_HOME,在系統(tǒng)變量窗口點(diǎn)擊新建,然后輸入變量名和變量值,變量名為MAVEN_HOME,變量值就是maven的安裝路徑,可以通過(guò)瀏覽目錄找到自己的maven安裝位置。

接下來(lái)配置系統(tǒng)變量中的path變量,首先選中path變量,然后點(diǎn)擊編輯,彈出編輯path變量的窗口,點(diǎn)擊新建,在最后一行輸入如下參數(shù):%MAVEN_HOME%\bin

image-20210530105017619

此時(shí)maven的環(huán)境變量已經(jīng)配置完成了,可以打開(kāi)cmd窗口,運(yùn)行mvn -v查看配置是否成功。

image-20210530105252750

1.2 Linux安裝

將下載好的文件上傳至云服務(wù)器,我這里直接上傳到了/usr/local/目錄下,然后直接將其解壓

tar -zxvf apache-maven-3.8.1-bin.tar.gz

接下來(lái)就是配置環(huán)境變量,在/etc/profile文件中添加環(huán)境變量,內(nèi)容如下:

export MAVEN_HOME=/usr/local/apache-maven-3.8.1export PATH=$PATH:$MAVEN_HOME/bin

然后再運(yùn)行source /etc/profile使其生效即可。

然后可以運(yùn)行mvn -v命令查看是否配置成功:

image-20210530105556350

1.3 簡(jiǎn)單配置

當(dāng)安裝完maven以后,我們還需要配置maven的鏡像和我們本地倉(cāng)庫(kù)的地址,maven的全局配置文件是安裝目錄下的conf/settings.xml文件,下面的配置都是在該文件中進(jìn)行的。

1.3.1 配置本地倉(cāng)庫(kù)路徑

本地倉(cāng)庫(kù)是我們新建maven項(xiàng)目并添加依賴(lài)后,那些依賴(lài)的jar包下載到的位置。

首先看看配置文件,本地倉(cāng)庫(kù)路徑不配置的話(huà)默認(rèn)為當(dāng)前用戶(hù)目錄下的./m2文件夾下的repository目錄,我們最好自己配置下,管理maven倉(cāng)庫(kù)的位置。

image-20210530110158818

配置的話(huà)選定自己的倉(cāng)庫(kù)目錄,然后添加在配置文件中即可,例如我這里是這樣配置的:

<localRepository>D:\software\Maven\MavenRepository</localRepository>

Linux的話(huà)需要注意路徑的方式:

<localRepository>/usr/local/apache-maven-3.8.1/MavenRepository</localRepository>

1.3.2 配置鏡像

如果我們不配置國(guó)內(nèi)鏡像的話(huà),那么maven下載依賴(lài)可能會(huì)非常非常慢,所以我們這里要配置鏡像,這里我配置的是阿里云的鏡像:

<mirrors>
	 <mirror>  
	   <id>alimaven</id>
	   <name>aliyun maven</name>
       <url>https://maven.aliyun.com/repository/public</url>
       <mirrorOf>central</mirrorOf> 
	</mirror>
  </mirrors>

當(dāng)然也可以配置些其他的鏡像,例如華為的鏡像。

阿里云maven、華為云鏡像

1.4 idea配置

我們通常都是使用idea進(jìn)行項(xiàng)目的開(kāi)發(fā)工作,所以這里接著介紹下idea如何配置我們自己安裝的maven,而不是使用idea自帶的maven。

image-20210530111328316

然后找到maven的配置,將maven的安裝路徑和配置文件以及本地倉(cāng)庫(kù)的配置均修改為我們自己安裝的maven即可:

image-20210530111454349

此外還要配置每個(gè)新建項(xiàng)目的maven配置,點(diǎn)擊New Projects Settings -> Settings for New Projects:

image-20210530111729368

也是進(jìn)行相同的配置:

image-20210530111858003

配置完成以后,我們以后就可以使用自己安裝的maven在idea中開(kāi)發(fā)項(xiàng)目了。

2、Maven簡(jiǎn)單上手

雖然我們可以使用idea簡(jiǎn)化項(xiàng)目的開(kāi)發(fā),但是我們還是要簡(jiǎn)單了解一下不借助idea如何新建maven項(xiàng)目的。

首先來(lái)看看maven的項(xiàng)目結(jié)構(gòu)

src
 |--main
	|--java 源代碼目錄
	|--resources 資源目錄
 |--test
	|--java 測(cè)試代碼目錄
	|--resources 測(cè)試資源目錄
target
	|--classes 編譯后的class文件目錄
	|--test-classes 編譯后的測(cè)試class文件目錄
pom.xml Maven工程配置文件

其中src、target、pom是同級(jí)目錄,接下來(lái)我們嘗試手動(dòng)創(chuàng)建這些目錄:

image-20210530112826749image-20210530113109454

我們首先來(lái)看看pom.xml的基本配置

<?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">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.wygandwdn</groupId>
    <artifactId>learn_maven</artifactId>
    <version>1.0-SNAPSHOT</version>
</project>

然后接著在src/java目錄下新建一個(gè)Hello.java

import java.util.*;
class Hello {
    public static void main(String[] args) {
        System.out.println("Hello Maven");
    }
}

然后在項(xiàng)目的根目錄下運(yùn)行mvn compile試試,也就是src文件對(duì)應(yīng)的目錄

出現(xiàn)BUILD SUCCESS就是構(gòu)建成功了,接下來(lái)看看都構(gòu)建出來(lái)了哪些文件

image-20210530113506953

可以看出,maven自動(dòng)為我們將Hello.java構(gòu)建成了Hello.class并放到了target/classes目錄下。

是不是很簡(jiǎn)單,當(dāng)我們使用idea之后,這些工作都不需要我們來(lái)做,都是自動(dòng)化完成的。

3、Maven生命周期

如果我們打開(kāi)idea,查看maven的話(huà),會(huì)發(fā)現(xiàn)maven的幾個(gè)生命周期:

image-20210530114042426

這些生命周期實(shí)際上分為三部分,分別是:

clean:為執(zhí)行以下工作做必要的清理,就是刪除out文件夾。default:真正進(jìn)行項(xiàng)目編譯打包等工作的階段site: 生成項(xiàng)目報(bào)告,站點(diǎn),發(fā)布站點(diǎn)

這三個(gè)生命周期又有各自詳細(xì)的生命周期。

clean生命周期又分為如下幾個(gè)階段:

pre-clean:執(zhí)行一些需要在clean之前完成的工作clean:移除所有上一次構(gòu)建生成的文件post-clean:執(zhí)行一些需要在clean之后立刻完成的工作

default又分為如下幾個(gè)階段(和idea中顯示的正好對(duì)應(yīng),這是簡(jiǎn)化版的生命周期):

validate:驗(yàn)證項(xiàng)目是否正確,所有必要的信息是否可用

compile:編譯項(xiàng)目的源代碼

test:使用合適的單元測(cè)試框架測(cè)試編譯的源代碼,測(cè)試代碼不應(yīng)該被打包或者部署

package:將編譯后的代碼打包成可發(fā)布的格式,例如jar包verify:運(yùn)行任意的檢查來(lái)驗(yàn)證項(xiàng)目包是否有效且達(dá)到質(zhì)量標(biāo)準(zhǔn)

install:安裝項(xiàng)目包到本地倉(cāng)庫(kù),這樣項(xiàng)目包可以用做其他本地項(xiàng)目的依賴(lài)

deploy:將最終的項(xiàng)目包復(fù)制到遠(yuǎn)程倉(cāng)庫(kù)與其他開(kāi)發(fā)者和項(xiàng)目共享

site生命周期又分為如下幾個(gè)階段:

pre-site:執(zhí)行一些需要在生成站點(diǎn)文檔之前完成的工作site:生成項(xiàng)目的站點(diǎn)文檔post-site: 執(zhí)行一些需要在生成站點(diǎn)文檔之后完成的工作,并且為部署做準(zhǔn)備site-deploy:將生成的站點(diǎn)文檔部署到特定的服務(wù)器上

各個(gè)生命周期相互獨(dú)立,互不影響,一個(gè)生命周期的階段前后依賴(lài)。

當(dāng)我們運(yùn)行maven命令時(shí),例如運(yùn)行mvn compile,只有該階段之前以及包括該階段在內(nèi)的所有階段才會(huì)被執(zhí)行,在compile之后的test、package等是不會(huì)被執(zhí)行的。

常用的maven命令:

命令 說(shuō)明
mvn -v 顯示版本信息
mvn clean 清理項(xiàng)目產(chǎn)生的臨時(shí)文件,一般是模塊下的target目錄
mvn compile 編譯源代碼,一般編譯模塊下的src/main/java目錄
mvn package 項(xiàng)目打包工具,會(huì)在target目錄下生成jar包或者war包
mvn test 測(cè)試命令,或執(zhí)行src/test/java/下junit的測(cè)試用例
mvn install 將打包的jar/war文件復(fù)制到本地倉(cāng)庫(kù),供其他模塊使用
mvn deploy 將打包的文件發(fā)布到遠(yuǎn)程服務(wù)器,供其他人員下載依賴(lài)
mvn site 生成項(xiàng)目相關(guān)信息的網(wǎng)站
mvn dependency:tree 打印出項(xiàng)目的整個(gè)依賴(lài)樹(shù)
mvn archetype:generate 創(chuàng)建maven的普通Java項(xiàng)目

4、POM文件詳解

4.1、基礎(chǔ)介紹

首先我們來(lái)看看一個(gè)簡(jiǎn)單的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">    
 <modelVersion>4.0.0</modelVersion>    
 <groupId>cn.wygandwdn</groupId>    
 <artifactId>learn_maven</artifactId>    
 <version>1.0-SNAPSHOT</version>    
 <packaging>pom</packaging></project>
</project>

這是maven項(xiàng)目構(gòu)建后產(chǎn)生的最基礎(chǔ)的pom文件,接下來(lái)講講這幾個(gè)標(biāo)簽的含義

modelVersion:描述pom文件遵循哪個(gè)版本的項(xiàng)目描述符,描述了當(dāng)前pom模型的版本,對(duì)于maven2和maven3來(lái)說(shuō),它只能是4.0.0;它是強(qiáng)制性的

接下來(lái)的groupId、artifactId、version是唯一定位一個(gè)項(xiàng)目的,相當(dāng)于項(xiàng)目的坐標(biāo)

groupId:團(tuán)體組織的標(biāo)識(shí)符,它以創(chuàng)建這個(gè)項(xiàng)目的組織名稱(chēng)的逆向域名開(kāi)頭,例如我們域名為wygandwdn.cn,這里就是cd.wygandwdn,同時(shí)也對(duì)應(yīng)著Java的包結(jié)構(gòu)artifactId:?jiǎn)为?dú)項(xiàng)目的標(biāo)識(shí)符,一個(gè)組織可能會(huì)有多個(gè)項(xiàng)目,那么這個(gè)artifactId就是描述一個(gè)組織名下的不同項(xiàng)目,不要在artifactId中包含點(diǎn)號(hào)(.)version:項(xiàng)目的版本packing:項(xiàng)目的打包類(lèi)型,默認(rèn)為jar,描述了項(xiàng)目打包后的輸出。類(lèi)型為jar的項(xiàng)目產(chǎn)生一個(gè)jar文件,類(lèi)型war的項(xiàng)目產(chǎn)生一個(gè)web應(yīng)用;類(lèi)型為pom的話(huà),說(shuō)明該項(xiàng)目為一個(gè)聚合項(xiàng)目,包含多個(gè)子項(xiàng)目

Maven的version中通常出現(xiàn)如下幾個(gè)特殊的字符串

SNAPSHOT、LATESTRELEASE,例如我們使用idea創(chuàng)建的默認(rèn)maven項(xiàng)目的版本通常為:1.0-SNAPSHOT。各個(gè)版本的含義和邏輯為:

SNAPSHOT:表示項(xiàng)目開(kāi)發(fā)過(guò)程中的快照版本,不穩(wěn)定的版本LATEST:某個(gè)特定構(gòu)件的最新版本,這個(gè)發(fā)布可能是一個(gè)發(fā)布版,也可能是一個(gè)snapshot版本,具體看哪個(gè)時(shí)間最后RELEASE:指最后一個(gè)發(fā)布版,穩(wěn)定版

4.2、dependencies&dependency

我們之前說(shuō)過(guò),maven最終的功能就是管理依賴(lài),那么這些依賴(lài)就是通過(guò)dependencies&dependency標(biāo)簽來(lái)定義的。

例如:

<?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">    
	<modelVersion>4.0.0</modelVersion>    
	<groupId>cn.wygandwdn</groupId>    
	<artifactId>learn_maven</artifactId>    
	<version>1.0-SNAPSHOT</version>    
	<packaging>pom</packaging>        
	<dependencies>        
	<!-- 每個(gè)dependency都對(duì)應(yīng)這一個(gè)jar包 -->        
		<dependency>            
		<!--一般情況下,maven是通過(guò)groupId、artifactId、version這三個(gè)元素值(俗稱(chēng)坐標(biāo))來(lái)檢            索該構(gòu)件, 然后引入你的工程。如果別人想引用你現(xiàn)在開(kāi)發(fā)的這個(gè)項(xiàng)目(前提是已開(kāi)發(fā)完畢并發(fā)布到了遠(yuǎn)程倉(cāng)庫(kù)),-->            
		<!--就需要在他的pom文件中新建一個(gè)dependency節(jié)點(diǎn),將本項(xiàng)目的groupId、artifactId、            version寫(xiě)入, maven就會(huì)把你上傳的jar包下載到他的本地 -->            
			<groupId>junit</groupId>            
			<artifactId>junit</artifactId>            
			<version>4.12</version>            
			<!-- 默認(rèn)值為jar,它通常代表依賴(lài)關(guān)系的文件名的擴(kuò)展 -->            
			<type>jar</type>            
			<!-- 依賴(lài)范圍 -->            
			<scope>complie</scope>            
			<!-- 設(shè)置 依賴(lài)是否可選,默認(rèn)為false,即子項(xiàng)目默認(rèn)都繼承。如果為true,則子項(xiàng)目必需顯示的引入 -->            
			<optional>false</optional>            
			<!-- 依賴(lài)排除-->            
			<exclusions>                
			<exclusion>                    
			<groupId>org.slf4j</groupId>                    
			<artifactId>slf4j-api</artifactId>                
			</exclusion>            
			</exclusions>        
			</dependency>    
		</dependencies>
</project>
上面的groupId、artifactId、version是定位jar包的坐標(biāo),通過(guò)這個(gè)唯一的標(biāo)識(shí),maven會(huì)自動(dòng)去倉(cāng)庫(kù)引入依賴(lài)。

type:代表項(xiàng)目依賴(lài)的類(lèi)型,例如jar、war、pom等。

scope:代表的是這些依賴(lài)的作用范圍,分別如下:

compile(默認(rèn)編譯范圍):該范圍是默認(rèn)依賴(lài)范圍,此依賴(lài)范圍對(duì)于編譯、測(cè)試、運(yùn)行三種classpath都有效,也就是說(shuō)該范圍下的jar包在編譯、測(cè)試、運(yùn)行和打包時(shí)都可以使用。

test(測(cè)試依賴(lài)范圍):test范圍的依賴(lài)只對(duì)測(cè)試classpath有效,在編譯主代碼和項(xiàng)目運(yùn)行時(shí),都將無(wú)法使用該依賴(lài),最典型的例子就是junit。junit是測(cè)試時(shí)才需要的依賴(lài),所以它的依賴(lài)范圍需要指定為test。如果不加范圍也不會(huì)報(bào)錯(cuò),但是該依賴(lài)會(huì)被加入到編譯和運(yùn)行的classpath中,會(huì)浪費(fèi)一定的空間

<dependency>    
    <groupId>junit</groupId>    
    <artifactId>junit</artifactId>    
    <version>4.7</version>    
    <scope>test</scope>
</dependency>

provided(已提供依賴(lài)):

使用該依賴(lài)范圍時(shí),只對(duì)編譯和測(cè)試的classpath有效,對(duì)運(yùn)行時(shí)classpath無(wú)效,最典型的例子就是servlet-api,編譯和測(cè)試項(xiàng)目時(shí)都需要該依賴(lài),但是在運(yùn)行時(shí),web容器已經(jīng)提供該依賴(lài),所以運(yùn)行時(shí)就不需要此以愛(ài),如果不顯示指定該依賴(lài)范圍,并且容器依賴(lài)的版本和maven不一致的話(huà),可能會(huì)造成沖突。

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

runtime(運(yùn)行時(shí)依賴(lài)范圍):

使用該依賴(lài)范圍時(shí),只對(duì)測(cè)試和運(yùn)行的classpath有效,對(duì)編譯時(shí)的classpath無(wú)效,典型的例子就是jdbc驅(qū)動(dòng)的實(shí)現(xiàn),項(xiàng)目主代碼編譯的時(shí)候只需要jdk提供的jdbc接口,只有在測(cè)試和運(yùn)行時(shí)才需要實(shí)現(xiàn)上述接口的具體jdbc驅(qū)動(dòng)。

<dependency>    
    <groupId>mysql</groupId>    
    <artifactId>mysql-connector-java</artifactId>    
    <version>5.1.25</version>    
    <scope>runtime</scope>
</dependency>

exclusions:該標(biāo)簽主要用于依賴(lài)的排除,該標(biāo)簽包含s,說(shuō)明可以排除多個(gè)依賴(lài),具體排除的依賴(lài)通過(guò)

exclusion標(biāo)簽定義,exclusion中通過(guò)groupId和artifactId定位要排除的依賴(lài)。

4.3、dependencyManagement

dependencyManagement通常會(huì)在父工程中定義,目的就是為了統(tǒng)一各個(gè)子模塊的依賴(lài)版本,也就是管理子項(xiàng)目中依賴(lài)的jar包的版本。

該標(biāo)簽只是聲明依賴(lài),并不是實(shí)際的引入

子項(xiàng)目需要顯式的聲明需要用的依賴(lài),如果不再子項(xiàng)目中聲明依賴(lài),那么子項(xiàng)目是不會(huì)從父項(xiàng)目中繼承依賴(lài)的

只有在子項(xiàng)目中寫(xiě)了該依賴(lài)項(xiàng),并且沒(méi)有指定具體版本,才會(huì)從父項(xiàng)目中繼承該項(xiàng),并且version和scope都讀取自父pom;另外如果子項(xiàng)目中指定了版本號(hào),那么會(huì)使用子項(xiàng)目中指定的jar版本

在我們創(chuàng)建聚合工程時(shí),使用該標(biāo)簽非常有用

4.4、properties

properties定義了一些在pom中使用的占位符,相當(dāng)于一些公共的屬性,一般用于指定各個(gè)依賴(lài)的版本號(hào)。

例如:

<?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">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.wygandwdn</groupId>
    <artifactId>learn_maven</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    
	<properties>
        <mysql.version>8.0.22</mysql.version>
    </properties>
    
    <dependencies>
    		<dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
    </dependencies>
    
</project>

當(dāng)我們定義mysql連接依賴(lài)時(shí),將其對(duì)應(yīng)的版本通過(guò)properties來(lái)定義,那么以后修改mysql連接依賴(lài)時(shí),只需要修改標(biāo)簽中的依賴(lài)即可,不需要再去對(duì)應(yīng)的依賴(lài)處修改。

properties標(biāo)簽內(nèi)一般根據(jù)依賴(lài)的名稱(chēng)來(lái)自定義標(biāo)簽,通過(guò)"."進(jìn)行分割,然后在dependency中引入即可。

當(dāng)我們引入眾多的依賴(lài)時(shí),使用properties非常有用,通過(guò)properties定義版本,那么修改時(shí),只統(tǒng)一修改這里的版本即可。其子項(xiàng)目也可以使用properties里定義的標(biāo)簽。

4.5、構(gòu)建配置

來(lái)看看build標(biāo)簽下的內(nèi)容

<build>
    <!-- 產(chǎn)生的構(gòu)件的文件名,默認(rèn)值是${artifactId}-${version}-->
    <finalName>myPorjectName</finalName>
    <!-- 構(gòu)建產(chǎn)生的所有文件存放的目錄,默認(rèn)為${basedir}/target,即項(xiàng)目根目錄下的target -->
    <directory>${basedir}/target</directory>
    <!--項(xiàng)目相關(guān)的所有資源路徑列表,例如和項(xiàng)目相關(guān)的配置文件、屬性文件,這些資源被包含在最終的打包文件里-->
    <!--項(xiàng)目源碼目錄,當(dāng)構(gòu)建項(xiàng)目的時(shí)候,構(gòu)建系統(tǒng)會(huì)編譯目錄里的源碼。該路徑是相對(duì)于pom.xml的相對(duì)路徑-->
    <sourceDirectory>${basedir}\src\main\java</sourceDirectory>
    <!--項(xiàng)目單元測(cè)試使用的源碼目錄,當(dāng)測(cè)試項(xiàng)目的時(shí)候,構(gòu)建系統(tǒng)會(huì)編譯目錄里的源碼。該路徑是相對(duì)于pom.xml的相對(duì)路徑-->
    <testSourceDirectory>${basedir}\src\test\java</testSourceDirectory>
    <!--被編譯過(guò)的應(yīng)用程序class文件存放的目錄-->
    <outputDirectory>${basedir}\target\classes</outputDirectory>
    <!--被編譯過(guò)的測(cè)試class文件存放的目錄-->
    <testOutputDirectory>${basedir}\target\test-classes</testOutputDirectory>
    <!-- 以上配置都有默認(rèn)值,就是約定好了目錄就這么建 -->
    <resources>
        <!--處理src中填寫(xiě)的配置文件,防止打包的時(shí)候它們被過(guò)濾掉-->
        <!--本初配置的含義就是不對(duì)src/main/java下的../*.xml資源進(jìn)行篩選,對(duì)src/main/java下的../*.properties進(jìn)行過(guò)濾-->
        <resource>
            <directory>src/main/java</directory>
            <!--指定要包含的文件作為指定目錄下的資源-->
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <!--指定要忽略的資源,如果includes和excludes包含同樣的文件,那么excludes中的定義生效-->
            <excludes>
              <exclude>**/*.properties</exclude>
            </excludes>
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
    <!--單元測(cè)試相關(guān)的所有資源路徑,配置方法與resources類(lèi)似 -->
    <testResources>
        <testResource>
            <targetPath />
            <filtering />
            <directory />
            <includes />
            <excludes />
        </testResource>
    </testResources>
    <!--使用的插件列表-->
    <plugins>
        <plugin>
        <!--具體在插件使用中了解-->
        </plugin>
    </plugins>
    <!--主要定義插件的共同元素、擴(kuò)展元素集合,類(lèi)似于dependencyManagement-->
    <!--所有繼承于此項(xiàng)目的子項(xiàng)目都能使用。該插件配置項(xiàng)直到被引用時(shí)才會(huì)被解析或綁定到生命周期-->
    <!--給定插件的任何本地配置都會(huì)覆蓋這里的配置-->
    <pluginManagement>
    	<plugins>...</plugins>
    </pluginManagement>
</build>

resourcs:主要處理資源過(guò)濾的問(wèn)題,這里詳細(xì)解釋下resource標(biāo)簽下的各個(gè)屬性:

directory:資源過(guò)濾對(duì)應(yīng)的目錄

includes:資源過(guò)濾對(duì)哪些資源生效

excludes:資源過(guò)濾對(duì)哪些資源不生效

filtering:true或者false(具體情況可以自己在實(shí)際項(xiàng)目中測(cè)驗(yàn)一下,這里直接給出測(cè)驗(yàn)后的結(jié)論) true就是對(duì)includes下定義的資源過(guò)濾,對(duì)excludes下定義的資源不過(guò)濾false就是對(duì)includes下定義的資源不過(guò)濾,對(duì)excludes下定義的資源過(guò)濾

當(dāng)我們想引入支付包的jar包或者oracle的連接驅(qū)動(dòng)時(shí),可以自己配置jar包的路徑,然后引入項(xiàng)目,具體的配置如下

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <!--是否被子項(xiàng)目繼承,默認(rèn)為true-->
    <inherited>true</inherited>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <encoding>UTF-8</encoding>
        <compilerArguments>
            <!-- 本地jar,支付寶jar包放到 src/main/webapp/WEB-INF/lib 文件夾下,
            如果沒(méi)有配置,本地沒(méi)問(wèn)題,但是線(xiàn)上會(huì)找不到sdk類(lèi)
            為什么要引入,因?yàn)橹Ц秾歫ar包再中央倉(cāng)庫(kù)沒(méi)有,再比如oracle連接驅(qū)動(dòng)的jar
            -->
            <extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs>
        </compilerArguments>
    </configuration>
</plugin>

從這里我們可以看出,不管是引入依賴(lài),還是引入插件,都是通過(guò)groupId、artifactId進(jìn)行唯一的標(biāo)識(shí),來(lái)確定我們引入的具體的依賴(lài)或者插件。

4.6、倉(cāng)庫(kù)配置

<repositories>
    <repository>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <releases>
        	<enabled>true</enabled>
        </releases>
        <snapshots>
        	<enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

pom.xml里面的倉(cāng)庫(kù)與setting.xml里的倉(cāng)庫(kù)功能是一樣的。主要的區(qū)別在于,pom里的倉(cāng)庫(kù)是個(gè)性化的。比如一 家大公司里的setting文件是公用的,所有項(xiàng)目都用一個(gè)setting文件,但各個(gè)子項(xiàng)目卻會(huì)引用不同的第三方庫(kù),所 以就需要在pom.xml里設(shè)置自己需要的倉(cāng)庫(kù)地址。

4.7、項(xiàng)目配置信息(了解即可)

<!--項(xiàng)目的名稱(chēng), Maven產(chǎn)生的文檔用 -->
<name>banseon-maven </name>
<!--項(xiàng)目主頁(yè)的URL, Maven產(chǎn)生的文檔用 -->
<url>http://www.clf.com/ </url>
<!--項(xiàng)目的詳細(xì)描述, Maven 產(chǎn)生的文檔用。 當(dāng)這個(gè)元素能夠用HTML格式描述時(shí) -->
<!--(例如,CDATA中的文本會(huì)被解析器忽略,就可以包含HTML標(biāo)簽),不鼓勵(lì)使用純文本描述。 -->
<!-- 如果你需要修改產(chǎn)生的web站點(diǎn)的索引頁(yè)面,你應(yīng)該修改你自己的索引頁(yè)文件,而不是調(diào)整這里的文檔。 -->
<description>A maven project to study maven. </description>
<!--項(xiàng)目創(chuàng)建年份,4位數(shù)字。當(dāng)產(chǎn)生版權(quán)信息時(shí)需要使用這個(gè)值。 -->
<inceptionYear />
<!--項(xiàng)目相關(guān)郵件列表信息 -->
<mailingLists>
    <!--該元素描述了項(xiàng)目相關(guān)的所有郵件列表。自動(dòng)產(chǎn)生的網(wǎng)站引用這些信息。 -->
    <mailingList>
        <!--郵件的名稱(chēng) -->
        <name> Demo </name>
        <!--發(fā)送郵件的地址或鏈接,如果是郵件地址,創(chuàng)建文檔時(shí),mailto: 鏈接會(huì)被自動(dòng)創(chuàng)建 -->
        <post> clf@126.com</post>
        <!--訂閱郵件的地址或鏈接,如果是郵件地址,創(chuàng)建文檔時(shí),mailto: 鏈接會(huì)被自動(dòng)創(chuàng)建 -->
        <subscribe> clf@126.com</subscribe>
        <!--取消訂閱郵件的地址或鏈接,如果是郵件地址,創(chuàng)建文檔時(shí),mailto: 鏈接會(huì)被自動(dòng)創(chuàng)建 -->
        <unsubscribe> clf@126.com</unsubscribe>
        <!--你可以瀏覽郵件信息的URL -->
        <archive> http:/hi.clf.com/</archive>
    </mailingList>
</mailingLists>
 
<!--項(xiàng)目開(kāi)發(fā)者列表 -->
<developers>
    <!--某個(gè)項(xiàng)目開(kāi)發(fā)者的信息 -->
    <developer>
        <!--SCM里項(xiàng)目開(kāi)發(fā)者的唯一標(biāo)識(shí)符 -->
        <id> HELLO WORLD </id>
        <!--項(xiàng)目開(kāi)發(fā)者的全名 -->
        <name> banseon </name>
        <!--項(xiàng)目開(kāi)發(fā)者的email -->
        <email> banseon@126.com</email>
        <!--項(xiàng)目開(kāi)發(fā)者的主頁(yè)的URL -->
        <url />
        <!--項(xiàng)目開(kāi)發(fā)者在項(xiàng)目中扮演的角色,角色元素描述了各種角色 -->
        <roles>
            <role> Project Manager</role>
            <role>Architect </role>
        </roles>
        <!--項(xiàng)目開(kāi)發(fā)者所屬組織 -->
        <organization> demo</organization>
        <!--項(xiàng)目開(kāi)發(fā)者所屬組織的URL -->
        <organizationUrl>http://hi.clf.com/ </organizationUrl>
        <!--項(xiàng)目開(kāi)發(fā)者屬性,如即時(shí)消息如何處理等 -->
        <properties>
            <dept> No </dept>
        </properties>
    <!--項(xiàng)目開(kāi)發(fā)者所在時(shí)區(qū), -11到12范圍內(nèi)的整數(shù)。 -->
        <timezone> -5</timezone>
    </developer>
</developers>
 
<!--項(xiàng)目的其他貢獻(xiàn)者列表 -->
<contributors>
    <!--項(xiàng)目的其他貢獻(xiàn)者。參見(jiàn)developers/developer元素 -->
    <contributor>
        <name />
        <email />
        <url />
        <organization />
        <organizationUrl />
        <roles />
        <timezone />
        <properties />
    </contributor>
</contributors>
<!--該元素描述了項(xiàng)目所有License列表。應(yīng)該只列出該項(xiàng)目的license列表,不要列出依賴(lài)項(xiàng)目的license列表。
-->
<!--如果列出多個(gè)license,用戶(hù)可以選擇它們中的一個(gè)而不是接受所有l(wèi)icense。 -->
<licenses>
    <!--描述了項(xiàng)目的license,用于生成項(xiàng)目的web站點(diǎn)的license頁(yè)面,其他一些報(bào)表和validation也會(huì)用到
    該元素。 -->
    <license>
        <!--license用于法律上的名稱(chēng) -->
        <name> Apache 2 </name>
        <!--官方的license正文頁(yè)面的URL -->
        <url>http://www.clf.com/LICENSE-2.0.txt </url>
        <!--項(xiàng)目分發(fā)的主要方式: repo,可以從Maven庫(kù)下載 manual, 用戶(hù)必須手動(dòng)下載和安裝依賴(lài) -->
        <distribution> repo</distribution>
        <!--關(guān)于license的補(bǔ)充信息 -->
        <comments> Abusiness-friendly OSS license </comments>
    </license>
</licenses>
<!--描述項(xiàng)目所屬組織的各種屬性。Maven產(chǎn)生的文檔用 -->
<organization>
    <!--組織的全名 -->
    <name> demo </name>
    <!--組織主頁(yè)的URL -->
    <url> http://www.clf.com/</url>
</organization>

還有其他很多,想要了解的可以去官網(wǎng)看看更加詳細(xì)的版本。

5、Maven依賴(lài)

Maven給我們帶來(lái)的最大的便利就是自動(dòng)幫我們下載并且管理依賴(lài),我們不必再向之前那樣自己在網(wǎng)上尋找各種依賴(lài),導(dǎo)入工程中;這大大簡(jiǎn)化了我們的開(kāi)發(fā)工作,提高了效率。

接下來(lái)我們來(lái)看看maven如何解決依賴(lài)問(wèn)題。

當(dāng)我們?cè)趍aven的pom配置文件中引入依賴(lài)后,也就是在中配置后,maven會(huì)自動(dòng)幫我們下載我們所需要的依賴(lài)。

那么這個(gè)依賴(lài)是如何下載的呢?

image-20210530200448098

通過(guò)上圖我們可以發(fā)現(xiàn),當(dāng)maven項(xiàng)目導(dǎo)入依賴(lài)之后,首先從本地倉(cāng)庫(kù)查找依賴(lài),找不到則取遠(yuǎn)程倉(cāng)庫(kù)查找,這里去遠(yuǎn)程倉(cāng)庫(kù)就用到了我們之前配置的鏡像。

如果在公司內(nèi)部,電腦無(wú)法聯(lián)網(wǎng),那么可能查完本地會(huì)去私服查找依賴(lài),這個(gè)私服既在局域網(wǎng)內(nèi)部,又可以連接外網(wǎng),而且在局域網(wǎng)內(nèi)部下載相當(dāng)快。私服的配置一般通過(guò)nexus來(lái)完成的。

在開(kāi)發(fā)過(guò)程中,我們的項(xiàng)目可以依賴(lài)第三方的jar包,那么第三方的jar包也可以依賴(lài)其他人的jar包,那么如果依賴(lài)重復(fù)了,maven如何解決依賴(lài)的傳遞性呢,它有如下幾種原則:

最短路徑優(yōu)先:如果A依賴(lài)B,B依賴(lài)C,而且A和B同時(shí)依賴(lài)于D,并且兩個(gè)版本不一致,那么根據(jù)最短路徑優(yōu)先原則來(lái)看,我們的項(xiàng)目依賴(lài)的是A依賴(lài)的D

image-20210530201254726

路徑相同先聲明原則:如果我們的工程同時(shí)依賴(lài)于A和B,而且A和B都依賴(lài)D,且版本不一致,那么誰(shuí)先聲明項(xiàng)目就依賴(lài)哪個(gè)版本的D

image-20210530201533361

當(dāng)我們不想要某個(gè)jar包依賴(lài)的jar包時(shí),我們可以通過(guò)exclusions來(lái)排除jar包的依賴(lài)。

6、聚合和繼承

在項(xiàng)目開(kāi)發(fā)過(guò)程中,我們通常使用maven構(gòu)建一個(gè)整體的項(xiàng)目,然后在其中構(gòu)建不同的子模塊進(jìn)行開(kāi)發(fā)工作,那么這些父子工程就對(duì)應(yīng)了聚合和繼承。

對(duì)于聚合和繼承,有兩個(gè)關(guān)鍵的標(biāo)簽,分別是parent和modules:

parent:定義模塊的父工程,其中根據(jù)groudId和artifactId來(lái)定位父工程modules:描述父工程包含的子工程的名稱(chēng)

可以被繼承的元素如下:

可以被繼承的POM元素如下:

groupId:項(xiàng)目組ID,項(xiàng)目坐標(biāo)的核心元素

version:項(xiàng)目版本,項(xiàng)目坐標(biāo)的核心因素

properties:自定義的Maven屬性 一般用于同一制定各個(gè)依賴(lài)的版本號(hào)

dependencies:項(xiàng)目的依賴(lài)配置 公共的依賴(lài)

dependencyManagement:項(xiàng)目的依賴(lài)管理配置

repositories:項(xiàng)目的倉(cāng)庫(kù)配置

build:包括項(xiàng)目的源碼目錄配置、輸出目錄配置、插件配置、插件管理配置等

此外還有一些項(xiàng)目的描述信息也可以被繼承:

description:項(xiàng)目的描述信息

organization:項(xiàng)目的組織信息

inceptionYear:項(xiàng)目的創(chuàng)始年份

url:項(xiàng)目的URL地址

developers:項(xiàng)目的開(kāi)發(fā)者信息

contributors:項(xiàng)目的貢獻(xiàn)者信息

distributionManagement:項(xiàng)目的部署配置

issueManagement:項(xiàng)目的缺陷跟蹤系統(tǒng)信息

ciManagement:項(xiàng)目的持續(xù)集成系統(tǒng)信息

scm:項(xiàng)目的版本控制系統(tǒng)

malilingLists:項(xiàng)目的郵件列表信息

reporting:包括項(xiàng)目的報(bào)告輸出目錄配置、報(bào)告插件配置等

6.1、使用idea創(chuàng)建聚合工程

首先選擇新建maven項(xiàng)目:

image-20210530202207152

不選擇任何模板,直接next,然后給定項(xiàng)目的名稱(chēng),點(diǎn)擊finish即可完成項(xiàng)目的創(chuàng)建

image-20210530202654377

項(xiàng)目創(chuàng)建完成后可以刪除對(duì)應(yīng)的src目錄,因?yàn)槲覀円獎(jiǎng)?chuàng)建子模塊,不會(huì)在這個(gè)父工程中寫(xiě)代碼

image-20210530202402071

然后右鍵項(xiàng)目名,選擇新建module

image-20210530202507680

選擇父模塊,并且填寫(xiě)相關(guān)的信息

image-20210530202616644

當(dāng)新建完成以后,我們看看兩個(gè)工程的pom文件

image-20210530202751618image-20210530202806761

可以看到對(duì)應(yīng)的父子信息了。

6.2、使用idea創(chuàng)建分布式聚合工程

當(dāng)我們創(chuàng)建分布式項(xiàng)目時(shí),往往都是創(chuàng)建一個(gè)maven項(xiàng)目,然后在其下面創(chuàng)建不同的子模塊。這些子模塊有可能是spring boot項(xiàng)目,如果使用idea的Spring Initializr創(chuàng)建的話(huà),那么默認(rèn)父項(xiàng)目為:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

這個(gè)默認(rèn)的父項(xiàng)目為我們定義了各種各樣的依賴(lài)版本,我們?cè)陂_(kāi)發(fā)過(guò)程中可以很輕松的解決版本相關(guān)的問(wèn)題。

但是這樣的話(huà),我們統(tǒng)一創(chuàng)建的maven項(xiàng)目就沒(méi)有意義了,那么我們?nèi)绾谓鉀Q這個(gè)問(wèn)題呢?

如果我們查看這個(gè)父工程的話(huà),可以發(fā)現(xiàn)它的父工程為:

image-20210530205714405

我們?cè)倏纯磗pring-boot-dependencies

其實(shí)這個(gè)spring-boot-dependencies已經(jīng)為我們定義好了各種版本依賴(lài),那么真正解決版本問(wèn)題的實(shí)際上就是spring-boot-dependencies,所以如果我們?cè)诟竚aven項(xiàng)目中依賴(lài)了spring-boot-dependencies,那么也可以進(jìn)行版本的配置管理,不用擔(dān)心復(fù)雜的版本問(wèn)題,所以我們可以使用如下方式新建分布式項(xiàng)目。

首先創(chuàng)建一個(gè)maven項(xiàng)目,并將src目錄刪除在pom目錄中引入spring-boot-dependencies依賴(lài)創(chuàng)建maven子項(xiàng)目,然后在子項(xiàng)目中自行引入相關(guān)的依賴(lài)即可。

這里我們使用spring-boot-dependencies進(jìn)行了版本的管理。

那么對(duì)應(yīng)的父工程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">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.wygandwdn</groupId>
    <artifactId>micro_official</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>micro_official_news</module>
    </modules>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <mysql-connector-java.version>8.0.22</mysql-connector-java.version>
        <mybatis-spring-boot-starter.version>2.1.4</mybatis-spring-boot-starter.version>
        <lombok.version>1.18.20</lombok.version>
        <spring.boot.dependencies.version>2.4.5</spring.boot.dependencies.version>
        <fastjson.version>1.2.47</fastjson.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.dependencies.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis-spring-boot-starter.version}</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql-connector-java.version}</version>
                <scope>runtime</scope>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
                <scope>provided</scope>
            </dependency>
            <!--解析json字符-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${fastjson.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

子工程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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>cn.wygandwdn</groupId>
        <artifactId>micro_official</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
	<!--由于我們繼承父工程,所以無(wú)需再寫(xiě)groupId和version,只寫(xiě)artifactId即可-->
    <artifactId>micro_official_news</artifactId>
    
    <name>micro_official_news</name>
    <description>news</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

7、Maven插件

Maven實(shí)際上是依賴(lài)插件執(zhí)行的框架,每個(gè)任務(wù)實(shí)際上是由插件完成的,Maven插件通常被用來(lái)

打jar包

創(chuàng)建war包

編譯代碼文件

代碼單元測(cè)試

創(chuàng)建工程文檔、工程報(bào)告等

插件通常提供了一個(gè)目標(biāo)的集合,并且可以使用下面的語(yǔ)法執(zhí)行

mvn [plugin-name]:[goal-name]

例如,一個(gè) Java 工程可以使用 maven-compiler-plugin 的 compile-goal 編譯,使用以下命令

mvn compiler:compile

7.1 Spring Boot插件

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

Spring Boot的Maven插件(Spring Boot Maven plugin)能夠以Maven的方式為應(yīng)用提供Spring Boot的支持,即為Spring Boot應(yīng)用提供了執(zhí)行Maven操作的可能。

Spring Boot Maven plugin能夠?qū)pring Boot應(yīng)用打包為可執(zhí)行的jar或war文件,然后以通常的方式運(yùn)行Spring Boot應(yīng)用。

Spring Boot Maven plugin的5個(gè)Goals

spring-boot:repackage:默認(rèn)goal。在mvn package之后,再次打包可執(zhí)行的jar/war,同時(shí)保留mvn package生成的jar/war為.origin

spring-boot:run:運(yùn)行Spring Boot應(yīng)用

spring-boot:start:在mvn integration-test階段,進(jìn)行Spring Boot應(yīng)用生命周期的管理

spring-boot:stop:在mvn integration-test階段,進(jìn)行Spring Boot應(yīng)用生命周期的管理

spring-boot:build-info:生成Actuator使用的構(gòu)建信息文件build-info.properties

8、總結(jié)

maven還有很多知識(shí),了解了這些基本的maven知識(shí)以后,其他相關(guān)的知識(shí)也可以很快掌握。

相關(guān)文章

  • Vue結(jié)合Springboot實(shí)現(xiàn)用戶(hù)列表單頁(yè)面(前后端分離)

    Vue結(jié)合Springboot實(shí)現(xiàn)用戶(hù)列表單頁(yè)面(前后端分離)

    本文主要介紹了Vue結(jié)合Springboot實(shí)現(xiàn)用戶(hù)列表單頁(yè)面,可以實(shí)現(xiàn)簡(jiǎn)單的查詢(xún),刪除,修改,和添加用戶(hù)信息功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java番外雜談之每天掃的二維碼你了解它內(nèi)含的信息嗎

    Java番外雜談之每天掃的二維碼你了解它內(nèi)含的信息嗎

    二維碼已經(jīng)成為我們?nèi)粘I钪斜夭豢缮俚慕M成部分了,登錄需要掃一掃二維碼、買(mǎi)東西付錢(qián)需要掃一掃二維碼、開(kāi)會(huì)簽到也需要掃一掃二維碼,那么如此使用的二維碼技術(shù),背后的原理是怎樣的呢?本文將結(jié)合二維碼的發(fā)展歷程以及典型應(yīng)用場(chǎng)景,分析二維碼背后的技術(shù)原理
    2022-02-02
  • Java NIO ByteBuffer讀取文件方式

    Java NIO ByteBuffer讀取文件方式

    這篇文章主要介紹了Java NIO ByteBuffer讀取文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 老生常談反射之Class類(lèi)的使用(必看篇)

    老生常談反射之Class類(lèi)的使用(必看篇)

    下面小編就為大家?guī)б黄仙U劮瓷渲瓹lass類(lèi)的使用(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • JVM中如何做到STW使程序暫停

    JVM中如何做到STW使程序暫停

    STW,即Stop The World,這篇文章來(lái)為大家詳細(xì)介紹了JVM中是如何做到STW使程序暫停的原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-01-01
  • 深入理解Java動(dòng)態(tài)代理與靜態(tài)代理

    深入理解Java動(dòng)態(tài)代理與靜態(tài)代理

    這篇文章主要介紹了深入理解Java動(dòng)態(tài)代理與靜態(tài)代理,靜態(tài)代理,代理類(lèi)和被代理的類(lèi)實(shí)現(xiàn)了同樣的接口,代理類(lèi)同時(shí)持有被代理類(lèi)的引用,動(dòng)態(tài)代理的根據(jù)實(shí)現(xiàn)方式的不同可以分為JDK動(dòng)態(tài)代理和CGlib動(dòng)態(tài)代理
    2022-06-06
  • Java快速生成PDF文檔的實(shí)例代碼

    Java快速生成PDF文檔的實(shí)例代碼

    在如今數(shù)字化時(shí)代,越來(lái)越多的人使用PDF文檔進(jìn)行信息傳遞和共享,而使用Java生成PDF文檔也成為了一個(gè)非常重要的技能,所以本文我們將為您介紹如何使用Java快速生成PDF文檔,需要的朋友可以參考下
    2023-09-09
  • Jenkins Maven pom jar打包未拉取最新包解決辦法

    Jenkins Maven pom jar打包未拉取最新包解決辦法

    包版本號(hào)未變更新后,jenkins打包不會(huì)拉取最新包,本文主要介紹了Jenkins Maven pom jar打包未拉取最新包解決辦法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Java語(yǔ)言多線(xiàn)程終止中的守護(hù)線(xiàn)程實(shí)例

    Java語(yǔ)言多線(xiàn)程終止中的守護(hù)線(xiàn)程實(shí)例

    這篇文章主要介紹了Java語(yǔ)言多線(xiàn)程終止中的守護(hù)線(xiàn)程實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12
  • Java Spring處理循環(huán)依賴(lài)詳解

    Java Spring處理循環(huán)依賴(lài)詳解

    這篇文章主要介紹了Java中的Spring如何處理循環(huán)依賴(lài),依賴(lài)指的是Bean與Bean之間的依賴(lài)關(guān)系,關(guān)于更多Spring?處理循環(huán)依賴(lài)的詳情,需要的朋友可以參考下面文章具體內(nèi)容
    2023-04-04

最新評(píng)論