認(rèn)識MAVEN
Java的包管理工具有Maven、Gradle等,其中Maven是一款服務(wù)于Java平臺(tái)的自動(dòng)化構(gòu)建工具,把整個(gè)過程抽象成一個(gè)項(xiàng)目對象模型(Project Object Model,POM),它不僅可以用作包管理,還有許多的插件,可以支持整個(gè)項(xiàng)目的開發(fā)、打包、測試及部署等一系列行為。Gradle是一個(gè)基于Apache Ant和Apache Maven概念的項(xiàng)目自動(dòng)化構(gòu)建工具。
安裝&配置MAVEN
windows安裝MAVEN
MAVEN官方下載地址如下:
MAVEN下載地址
下載后設(shè)置環(huán)境變量,使用
mvn --version
驗(yàn)證,有輸出即可。
MAVEN的配置
maven的安裝目錄下,有一個(gè)Conf目錄,其中settings.xml是配置文件
本地倉庫 localRepository
設(shè)置一些依賴的Jar包保存在哪里,默認(rèn)是${user.home}/.m2/repository,我一般就放在MAVEN目錄下面
<localRepository>D:\apache-maven-3.8.8\maven_respository</localRepository>
鏡像 mirrors
常用的鏡像地址有以下幾個(gè):
- Maven Central Repository: https://repo.maven.apache.org/maven2/
- JBoss Repository: https://repository.jboss.org/nexus/content/groups/public/
- Spring Repository: https://repo.spring.io/libs-release/
- Apache Repository: https://repository.apache.org/content/repositories/releases/
打開可以看到一些包的目錄
當(dāng)然,無法科學(xué)上網(wǎng)的時(shí)候下載包會(huì)比較慢,這里以阿里云為例進(jìn)行配置。
<mirrors>
<!-- 阿里云倉庫 -->
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共倉庫</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>true</blocked>
</mirror>
</mirrors>
可以通過文件搜索查找可以下載的包及版本
代理倉庫 respositories
可以使用代理倉庫
<repository>
<id>central</id>
<url>https://maven.aliyun.com/repository/central</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
代理 proxies
一般設(shè)置公司的vpn,來下載一些不公開的自研包
IDEA配置MAVEN(一個(gè)module)
使用IDEA創(chuàng)建MAVEN項(xiàng)目,可以選擇Empty Project,然后自己手動(dòng)配置,也可以直接選擇MAVEN
GroupId一般是公司域名反寫,ArtifactId是你項(xiàng)目打包后的名字,Verion就是版本,之后的pom.xml再詳細(xì)解釋。
創(chuàng)建好后點(diǎn)擊右上角有藍(lán)色的Project Structure查看項(xiàng)目結(jié)構(gòu)
完整的項(xiàng)目結(jié)構(gòu)應(yīng)該是
- src:源代碼
- main:主目錄
- java java代碼
- resources 資源
- test 測試目錄
- java 測試代碼
- resources 測試資源
- main:主目錄
- pom.xml
標(biāo)準(zhǔn)目錄結(jié)構(gòu)參考 maven標(biāo)準(zhǔn)目錄結(jié)構(gòu)
標(biāo)記目錄可以在上面的項(xiàng)目結(jié)構(gòu),也可以在左側(cè)目錄欄右鍵 Mark Directory as。
MAVEN配置
File->settings->Build, Execution,Deployment
修改Maven目錄、配置文件、本地倉庫位置,記得打勾。
MAVEN生命周期
點(diǎn)擊右側(cè)的Maven可以看到生命周期
解釋如下:
- clean:刪除先前版本生成的所有文件
- validate- 驗(yàn)證項(xiàng)目是否正確,以及所有必要的信息是否可用
- compile- 編譯項(xiàng)目的源代碼
- test- 使用合適的單元測試框架測試編譯的源代碼。這些測試不應(yīng)要求打包或部署代碼
- package- 獲取編譯后的代碼并將其打包為其可分發(fā)的格式,例如 JAR。
- verify- 對集成測試結(jié)果進(jìn)行任何檢查,以確保滿足質(zhì)量標(biāo)準(zhǔn)
- install- 將包安裝到本地存儲(chǔ)庫中,以用作本地其他項(xiàng)目中的依賴項(xiàng)
- site:生成項(xiàng)目的站點(diǎn)文檔
- deploy- 在構(gòu)建環(huán)境中完成,將最終包復(fù)制到遠(yuǎn)程存儲(chǔ)庫,以便與其他開發(fā)人員和項(xiàng)目共享。
更多生命周期查看Maven生命周期
install下載包
main的java中創(chuàng)建Hero類
Hero.java
public class Hero {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getProfession() {
return profession;
}
public void setProfession(String profession) {
this.profession = profession;
}
private String profession;
}
pom.xml中添加dependency
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
點(diǎn)擊install,可以看到下載
test的java中創(chuàng)建HeroTest.java
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.junit.Test;
public class HeroTest {
@Test
public void testJsonToHero() {
String jsonStr = "{\"name\":\"狂鐵\",\"profession\":\"戰(zhàn)士\"}";
JSONObject jsonObject = JSON.parseObject(jsonStr);
Hero hero = new Hero();
hero.setName(jsonObject.getString("name"));
hero.setProfession(jsonObject.getString("profession"));
System.out.println(hero.getName() + " " + hero.getProfession());
}
}
運(yùn)行
左側(cè)的External Libraries會(huì)展示包和包中的代碼,右側(cè)的Dependencies會(huì)展示依賴和依賴的依賴。
由于install在package生命周期后面,所以也會(huì)生成target目錄,里面有打好的jar包。
在本地倉庫可以根據(jù)坐標(biāo)找到對應(yīng)的包。
模塊的pom.xml
坐標(biāo)gav
- groupId:公司或組織域名反寫
- artifactId:項(xiàng)目模塊Id
- version:版本號,例如1.0-SNAPSHOT、1.0-RELEASE等。
舉例
<groupId>com.ladykiller</groupId>
<artifactId>first_maven</artifactId>
<version>1.0-SNAPSHOT</version>
RELEASE一般在功能完成一個(gè)階段,進(jìn)行發(fā)布時(shí)會(huì)使用。
詳見:命名指南
打包方式 package
- jar: 默認(rèn)的Java工程
- war:Web工程
- pom:管理其他工程的工程
屬性值 properties
內(nèi)置屬性
1.env.X
獲取系統(tǒng)環(huán)境變量值,例如
${env.PATH}
2.project.x
獲取項(xiàng)目相關(guān)的變量,例如
${project.version}
3.settings.x
獲取配置文件相關(guān)的變量,例如
${settings.localRepository}
4.java.x
獲取配置文件相關(guān)的變量,例如
${java.home}
自定義屬性
常用來定義一些版本等,后序可以使用,方便修改,類似編程時(shí)的全局變量。
例如:
<properties>
<flink.version>1.8</flink.version>
</properties>
使用時(shí)使用${標(biāo)簽值即可}
<version>${flink.version}</version>
依賴dependencies
本節(jié)參考 依賴機(jī)制
dependency
scope 依賴范圍
- compile - 默認(rèn)范圍。編譯依賴項(xiàng)在所有類路徑中都可用。此外,這些依賴項(xiàng)將傳播到依賴項(xiàng)目。
- provided - 這很像編譯,但表示希望 JDK 或容器在運(yùn)行時(shí)提供它。它僅在編譯和測試類路徑上可用,即在main目錄和test目錄下可用,不會(huì)打包,并且不是可傳遞的。
- runtime - 此范圍指示編譯不需要依賴項(xiàng),但執(zhí)行需要依賴項(xiàng)。它位于運(yùn)行時(shí)和測試類路徑中,但不在編譯類路徑中。
- test - 此范圍指示依賴項(xiàng)不是正常使用應(yīng)用程序所必需的,并且僅適用于測試編譯和執(zhí)行階段,在test目錄下可用。它不是可傳遞的。
- system - 此作用域類似于,只是您必須提供顯式包含它的 JAR。工件始終可用,不會(huì)在repository中查找。
以test為例
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
依賴傳遞(IDEA 配置多個(gè)module)
創(chuàng)建一個(gè)空項(xiàng)目
之后添加模塊module01 module02
有三個(gè)pom.xml,項(xiàng)目的和兩個(gè)module的
在module02的pom.xml中添加對module01的依賴,右側(cè)刷新后可以看到
同理,創(chuàng)建module03, 并在module02中添加對module03的依賴
依賴傳遞中的沖突
直接依賴:pom.xml中寫的依賴
間接依賴:依賴所需的資源,或者說依賴的依賴
聲明優(yōu)先:間接依賴,先聲明的優(yōu)先
特殊優(yōu)先:直接依賴,后聲明的優(yōu)先
路徑優(yōu)先:出現(xiàn)相同資源,層級越深,優(yōu)先級越低
依賴如下圖所示
結(jié)果如下圖所示
exclusions 依賴排除
項(xiàng)目中依賴其他模塊,但是項(xiàng)目本身不需要模塊的某些依賴時(shí),可以排除
optional 依賴可選
表示是否需要依賴的依賴,默認(rèn)為false。
插件 plugins
插件太多了,以一個(gè)插件為例
添加并執(zhí)行install生命周期
項(xiàng)目的pom.xml
模塊存在依賴,且特別多時(shí),需要把很多模塊整合在一起,看做整體進(jìn)行生命周期管理,這個(gè)時(shí)候就用到了管理模塊,即root模塊。
modules 模塊聚合
添加上面橘紅色的pom.yaml文件為新的模塊,進(jìn)行項(xiàng)目的管理,添加成功后會(huì)變成藍(lán)色,點(diǎn)擊生命周期時(shí)可以看到多個(gè)模塊會(huì)一起變化,例如,點(diǎn)擊了clean,三個(gè)模塊的target就都沒有了。
dependencyManagement && parent 依賴管理與繼承
通過dependencyManagement由root模塊進(jìn)行統(tǒng)一的依賴管理,通過parent進(jìn)行依賴的繼承。
profiles 多環(huán)境管理
實(shí)際生產(chǎn)過程中可能會(huì)有開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境等,在MAVEN中可以通過profiles進(jìn)行多環(huán)境配置與管理
使用profiles進(jìn)行環(huán)境管理,使用activation指定默認(rèn)的環(huán)境
給生產(chǎn)環(huán)境打包時(shí),可以使用-P參數(shù)指定使用的環(huán)境id
mvn install -P prod
常見問題
IDEA配置MAVEN后異常,右下角需要查看event log
點(diǎn)擊Help->Show log in Explore,打開后如果是類似下面的內(nèi)容,說明你的IDEA和MAVEN版本不匹配,查看MAVEN的發(fā)行時(shí)間和你的IDEA的版本,修改后即可。
org.jetbrains.idea.maven - com.google.inject.CreationException: Unable to create injector, see the following errors:
1) No implementation for org.apache.maven.model.path.PathTranslator was bound.
while locating org.apache.maven.model.path.PathTranslator
for field at org.apache.maven.model.interpolation.AbstractStringBasedModelInterpolator.pathTranslator(Unknown Source)
at org.codehaus.plexus.DefaultPlexusContainer$1.configure(DefaultPlexusContainer.java:350)
2) No implementation for org.apache.maven.model.path.UrlNormalizer was bound.
while locating org.apache.maven.model.path.UrlNormalizer
for field at org.apache.maven.model.interpolation.AbstractStringBasedModelInterpolator.urlNormalizer(Unknown Source)
at org.codehaus.plexus.DefaultPlexusContainer$1.configure(DefaultPlexusContainer.java:350)
3) No implementation for org.apache.maven.model.interpolation.ModelVersionProcessor was bound.
while locating org.apache.maven.model.interpolation.ModelVersionProcessor
for field at org.apache.maven.model.interpolation.AbstractStringBasedModelInterpolator.versionProcessor(Unknown Source)
at org.codehaus.plexus.DefaultPlexusContainer$1.configure(DefaultPlexusContainer.java:350)
scope中provided的依賴本地需要怎么辦?
有的時(shí)候我們導(dǎo)入了其他人的項(xiàng)目,有些依賴沒有,但是在pom.xml中是provided
可以改pom.xml,編譯時(shí)下載包,之后再改過來,比較麻煩,不夠優(yōu)雅。
我們可以通過修改configuration,打勾包含provided scope即可
知道import什么包,如何寫pom.xml的dependency
查詢gav,知道后查看倉庫中有哪些版本文章來源:http://www.zghlxwxcb.cn/news/detail-489696.html
附pom.xml內(nèi)容
second_maven.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>com.ladykiller</groupId>
<artifactId>second_maven</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>module01</module>
<module>module03</module>
<module>module02</module>
</modules>
<profiles>
<profile>
<id>dev</id>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.ladykiller</groupId>
<artifactId>module01</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.ladykiller</groupId>
<artifactId>module02</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.ladykiller</groupId>
<artifactId>module03</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.9</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.6</version>
<optional>true</optional>
</dependency>
</dependencies>
</dependencyManagement>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.ladykiller</groupId>
<artifactId>module01</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.ladykiller</groupId>
<artifactId>module02</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.ladykiller</groupId>
<artifactId>module03</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<optional>true</optional>
</dependency>
</dependencies>
</dependencyManagement>
</profile>
</profiles>
</project>
module01.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>com.ladykiller</groupId>
<artifactId>module01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>com.ladykiller</groupId>
<artifactId>second_maven</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>install</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
module02.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>com.ladykiller</groupId>
<artifactId>module02</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>com.ladykiller</groupId>
<artifactId>second_maven</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>com.ladykiller</groupId>
<artifactId>module01</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.ladykiller</groupId>
<artifactId>module03</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
</project>
module03.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>com.ladykiller</groupId>
<artifactId>module03</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>com.ladykiller</groupId>
<artifactId>second_maven</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
</dependencies>
</project>
參考
Apache-Maven入門指南
Apache-POM文檔
Apache-Maven插件
阿里云MAVEN鏡像文章來源地址http://www.zghlxwxcb.cn/news/detail-489696.html
到了這里,關(guān)于JAVA-MAVEN初學(xué)者教程(配置、pom.xml、依賴管理等)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!