Eclipse下maven使用的常見(jiàn)問(wèn)題及scope詳解
前言
在Eclipse下使用Maven,著實(shí)有些不足之處,以至于經(jīng)常有人問(wèn)到Maven相關(guān)的問(wèn)題,故此在這里做個(gè)總結(jié),以便大家查閱。有的涉及原理的東西,也一一講解,這樣能舉一反三。
怎么創(chuàng)建Maven項(xiàng)目
eclipse支持maven項(xiàng)目的創(chuàng)建,如果你希望不要等待那么久,直接跳過(guò)架構(gòu)選擇即可,但是你需要清晰地知道Maven的項(xiàng)目結(jié)構(gòu),他應(yīng)該是這個(gè)樣子:??Eclipse中的Maven項(xiàng)目對(duì)

文件夾的結(jié)構(gòu)解析是自動(dòng)的,對(duì)應(yīng)的關(guān)系如上圖。?如果你創(chuàng)建的項(xiàng)目的結(jié)構(gòu)不是如此,可以手動(dòng)添加對(duì)應(yīng)文件夾,Eclipse可以自動(dòng)識(shí)別。注意所有文件夾的創(chuàng)建都應(yīng)該在src下。當(dāng)然,SpringBoot的web內(nèi)容是直接仿到resouces下面的,那是SpringBoot內(nèi)置的對(duì)靜態(tài)資源的處理。
如何設(shè)置JDK版本
很多人發(fā)現(xiàn)創(chuàng)建完的Eclipse的Maven項(xiàng)目,在Project?Facts中看到的Java的版本居然是1.5這個(gè)上古時(shí)代的版本,實(shí)際上我們只需要在Maven中添加這么一段代碼就可以了:
<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>
項(xiàng)目菜單中的Update Project是什么原理
Eclipse實(shí)際上對(duì)Maven的支持并不算完備,其中一個(gè)特點(diǎn)就是Eclipse仍按照自己的方式來(lái)管理Maven項(xiàng)目,當(dāng)我們修改了POM配置后,Maven并不能自動(dòng)讀取理解。而且Eclipse會(huì)嘗試通過(guò)POM配置自動(dòng)匹配一些Eclipse內(nèi)置配置,比如嘗試為web項(xiàng)目自動(dòng)添加webService的支持等。?修改pom后,單擊項(xiàng)目右鍵選擇Maven->Update?Project的功能就是讀取POM配置并使用Eclipse的方式來(lái)更新項(xiàng)目的配置。比如,上面的修改Java版本的代碼改動(dòng)后,你就應(yīng)該執(zhí)行這個(gè)操作:??簡(jiǎn)單說(shuō)來(lái),所有pom文件的更新,如果沒(méi)有及時(shí)反饋到Eclipse的項(xiàng)目屬性中,你都可以執(zhí)行這個(gè)菜單,快捷鍵為alt+?F5。

從哪里搜索依賴,如何選擇版本
原來(lái)的maven.aliyun.com是可以搜索包的,但是現(xiàn)在只能作為庫(kù)使用了。搜索庫(kù),最佳去處,自然是https://mvnrepository.com/,搜索后直接復(fù)制pom就可以了。
關(guān)于版本選擇問(wèn)題,一方面要考慮版本之間的沖突,這是第一原則。其次,如果有多個(gè)版本可選(比如日志框架),那么選擇下載次數(shù)最多的基本不會(huì)錯(cuò),如下圖:

什么時(shí)候需要設(shè)置scope
scope是對(duì)dependency的管理措施,scope的可用值有下面幾個(gè):
1、?compile?這是默認(rèn)的scope,表示在運(yùn)行,打包,測(cè)試幾個(gè)聲明周期中,對(duì)應(yīng)的jar包都是存在可用的,最典型的是如果你設(shè)置了某個(gè)dependency的scope不為compile,則你會(huì)發(fā)現(xiàn)打包后war文件中沒(méi)有對(duì)應(yīng)的jar包。
system?這個(gè)scope可以用來(lái)引用maven庫(kù)無(wú)法下載的包,比如你公司自己的jar包,如果沒(méi)有maven私服,這是一個(gè)快捷的解決辦法,典型的例子是谷歌的驗(yàn)證碼插件:
<dependency>
<groupId>com.google.code</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
大家可以嘗試后發(fā)現(xiàn)提示無(wú)法直接下載,解決的辦法是https://mvnrepository.com/中搜索到對(duì)應(yīng)版本后找到j(luò)ar包下載,然后放到項(xiàng)目的某個(gè)文件夾中,用下面的代碼實(shí)現(xiàn)引用:
<dependency>
<groupId>com.google.code</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/kaptcha-2.3.2.jar</systemPath>
</dependency>
3、provided?provided表示將來(lái)的運(yùn)行環(huán)境會(huì)提供該jar包,它在編輯代碼時(shí)段,maven打包階段都可用,但不會(huì)打包到結(jié)果中,比如tomcat自帶的包,比如servlet-api,可以這樣寫:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
這樣就不用使用eclipse的方式也就是添加對(duì)tomcat運(yùn)行時(shí)的build?path了。
4.
test表示引用的jar包僅在測(cè)試類中有效,比如下面的兩張圖說(shuō)明了這個(gè)問(wèn)題:Eclipse認(rèn)識(shí)不同的作用域。

當(dāng)然test?scope的jar包也不會(huì)被打包到結(jié)果包中,比如war中。
5、runtime?這個(gè)作用域用來(lái)表示該jar包僅在運(yùn)行時(shí)可用,及在編譯打包期間不需要,與compiler相比,僅跳過(guò)編譯步驟。
Maven的源設(shè)置及本地倉(cāng)庫(kù)設(shè)置
本地倉(cāng)庫(kù),默認(rèn)存放緩存位置是在C盤,C盤是多么重要的地盤,maven依賴不小哇,動(dòng)不動(dòng)就是幾個(gè)G,所以還是將其轉(zhuǎn)移吧,代碼參考下面的講述。?使用aliyun的maven源仍然是最快的,設(shè)置的辦法有兩種,一個(gè)是修改eclipse的maven設(shè)置中的settings.xml:
<?xml?version="1.0"?encoding="UTF-8"?><settingsxmlns="http://maven.apache.org/SETTINGS/1.0.0"
??????????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
??????????xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0?http://maven.apache.org/xsd/settings-1.0.0.xsd">
??<localRepository>D:\mavenrepo</localRepository>
??<mirrors>??
?????<mirror>??
??????<id>alimaven</id>??
??????<mirrorOf>central</mirrorOf>??
??????<name>aliyun maven</name>??
??????<url>http://maven.aliyun.com/nexus/content/groups/public/</url>??
????</mirror>??
??</mirrors>??</settings>
一個(gè)是在pom中添加源設(shè)置(pom的根節(jié)點(diǎn)下):
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>

需要和原創(chuàng)作者溝通交流技術(shù),或者說(shuō)有問(wèn)題需要幫助解答的話,可以留言回復(fù),大家也可以關(guān)注我下 ?以后給大家?guī)?lái)更多的精彩內(nèi)容