工作中,有時(shí)候會將一些依賴打包成jar文件楣嘁,供其他工程引用鹉勒。這里就介紹下如何用Maven來管理java包的編譯帆锋、測試和開發(fā)。
1禽额、Maven基礎(chǔ)
1.1 Maven Repository
默認(rèn)地锯厢,Maven會從本地倉庫獲取項(xiàng)目的依賴皮官。如果本地倉庫沒有,就會去遠(yuǎn)程中心倉庫獲取实辑。
遠(yuǎn)程中心倉庫地址:https://repo.maven.apache.org/maven2
如下是這個(gè)網(wǎng)址的截圖:
Maven Central Repository搜索的網(wǎng)址:https://search.maven.org/
如下是這個(gè)網(wǎng)址的截圖:
從該網(wǎng)址可以搜索所需的依賴捺氢,然后,找到maven配置文件中剪撬,dependency標(biāo)簽的寫法摄乒。如下是一個(gè)例子:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j</artifactId>
<version>2.11.2</version>
<type>pom</type>
</dependency>
1.2 Maven常用命令
-
mvn clean
清空生成的文件。 -
mvn compile
編譯婿奔。 -
mvn test
編譯并測試。 -
mvn package
生成target目錄问慎,編譯萍摊、測試代碼,生成測試報(bào)告如叼,生成jar/war文件冰木。 -
mvn dependency:resolve
只下載依賴,不做任何其他事情笼恰。 -
mvn dependency:get -Dartifact=groupId:artifactId:version
下載指定的依賴踊沸。如果需要指定從某個(gè)特定的庫下載,也可以加參數(shù)-DrepoUrl=...
社证。 -
mvn install:install-file -Dfile=/Users/lib/aaa-1.2.17.jar -DgroupId=com.aaa.util -DartifactId=util -Dversion=1.2.17 -Dpackaging=jar
將本地的一個(gè)jar包發(fā)布到本地的maven倉庫逼龟。這樣,在pom.xml文件中追葡,就可以通過如下的標(biāo)簽引用這個(gè)jar包依賴腺律。<dependency> <groupId>com.aaa.util</groupId> <artifactId>util</artifactId> <version>1.2.17</version> </dependency>
2、用maven管理一個(gè)jar包的開發(fā)宜肉、打包和測試
2.1 創(chuàng)建模塊
這里用idea作為例子匀钧,在一個(gè)打開的工程中,選中工程谬返。然后之斯,New -> Module...
,在彈出的新建模塊窗口中選擇Maven遣铝,如下佑刷。
點(diǎn)下一步,輸入groupid和artifactid酿炸,如下圖项乒。
這一步需要注意,groupid的命名規(guī)范梁沧,參照
reverse site
檀何。一般是(com/org/net).(company name / auther name).(project name)
,對于artifactid,可以直接用groupid最后的那一段频鉴。當(dāng)然栓辜,也可以不這么做,這里只是推薦實(shí)踐垛孔。最后藕甩,輸入Module的名字,選擇Module的路徑周荐,點(diǎn)擊完成即可狭莱。如下圖。
最后概作,創(chuàng)建完成的Maven Module的結(jié)構(gòu)如下腋妙。由于我們本來創(chuàng)建的就是一個(gè)新項(xiàng)目,所以讯榕,這個(gè)項(xiàng)目中什么都沒有骤素,項(xiàng)目的目錄結(jié)構(gòu)如下。
2.2 編寫樣例代碼和單元
首先愚屁,在src/java/main
目錄下济竹,創(chuàng)建包并編寫實(shí)例代碼,如下霎槐。
package com.lfqy.demo.util;
/**
* Created by chengxia on 2019/4/22.
*/
public class Compute {
public static int add(int a, int b){
return a + b;
}
public static int minus(int a, int b){
return a - b;
}
}
PS: 這里的包名推薦以groupid開頭送浊,后面再用不同子包來區(qū)分不同的代碼模塊。
接下來丘跌,創(chuàng)建單元測試罕袋。在工作區(qū)中,將光標(biāo)放到上面的Compute類名位置碍岔,按下IDEA中的快捷鍵Shift + Command + T
浴讯。IDEA會快速在Maven的測試目錄(src/test
)下生成一個(gè)測試類ComputeTest
,包的路徑和被測試類一致蔼啦。代碼如下:
package com.lfqy.demo.util;
import static org.junit.Assert.*;
/**
* Created by chengxia on 2019/4/22.
*/
public class ComputeTest {
@org.junit.Test
public void add() throws Exception {
}
@org.junit.Test
public void minus() throws Exception {
}
}
如下是榆纽,到目前的代碼結(jié)構(gòu):
上面代碼中,有幾個(gè)類是標(biāo)紅的捏肢,很明顯這個(gè)是缺少junit依賴奈籽。
我們首先在上面的
https://search.maven.org/
搜索到j(luò)unit依賴(支持g:junit a:junit
,根據(jù)指定的groupid和artifactid搜索)鸵赫。復(fù)制其Maven依賴標(biāo)簽:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
將其添加到工程的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>com.lfqy.demo</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
這時(shí)候辩棒,會發(fā)現(xiàn)上面的<version>4.12</version>
中的4.12是紅色的狼忱。因?yàn)楸镜貛鞗]有膨疏,沒認(rèn)出這個(gè)依賴。
接下來钻弄,通過IDEA執(zhí)行下reimport
佃却,然后,紅色的版本號就變成正常了窘俺。前面test類中的未識別的類也變正常了饲帅,說明單元測試的依賴已經(jīng)被正常導(dǎo)入了。添加簡單的單元測試邏輯如下:
package com.lfqy.demo.util;
import static org.junit.Assert.*;
/**
* Created by chengxia on 2019/4/22.
*/
public class ComputeTest {
@org.junit.Test
public void add() throws Exception {
int result = Compute.add(3,5);
assertEquals(8,result);
}
@org.junit.Test
public void minus() throws Exception {
int result = Compute.minus(3,5);
assertEquals(-2,result);
}
}
2.3 用Maven操作
2.3.1 Maven編譯
執(zhí)行mvn compile
$ mvn compile
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< com.lfqy.demo:demo >-------------------------
[INFO] Building demo 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ demo ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ demo ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /Users/chengxia/IdeaProjects/TestProj/demo/target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.621 s
[INFO] Finished at: 2019-04-22T19:36:04+08:00
[INFO] ------------------------------------------------------------------------
$
完成之后瘤泪,可以在工程的target目錄下灶泵,看到編譯的輸出物。如下圖对途。
2.3.2 Maven測試
命令行下執(zhí)行mvn test
運(yùn)行測試案例:
$ mvn test
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< com.lfqy.demo:demo >-------------------------
[INFO] Building demo 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ demo ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ demo ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ demo ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/chengxia/IdeaProjects/TestProj/demo/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ demo ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /Users/chengxia/IdeaProjects/TestProj/demo/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ demo ---
[INFO] Surefire report directory: /Users/chengxia/IdeaProjects/TestProj/demo/target/surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.lfqy.demo.util.ComputeTest
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.091 sec
Results :
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.435 s
[INFO] Finished at: 2019-04-22T19:51:01+08:00
[INFO] ------------------------------------------------------------------------
$
2.3.3 打包
通過執(zhí)行mvn package
可以完成打包赦邻。
$ mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< com.lfqy.demo:demo >-------------------------
[INFO] Building demo 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ demo ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ demo ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ demo ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/chengxia/IdeaProjects/TestProj/demo/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ demo ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ demo ---
[INFO] Surefire report directory: /Users/chengxia/IdeaProjects/TestProj/demo/target/surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.lfqy.demo.util.ComputeTest
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.083 sec
Results :
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ demo ---
[INFO] Building jar: /Users/chengxia/IdeaProjects/TestProj/demo/target/demo-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.902 s
[INFO] Finished at: 2019-04-22T19:52:44+08:00
[INFO] ------------------------------------------------------------------------
$
從上面可以看出,maven在打包之前會先運(yùn)行測試掀宋,打包運(yùn)行完成之后深纲,可以看到在target目錄下生成了jar包仲锄。如下劲妙。
2.3.4 Maven清理
通過執(zhí)行mvn clean
可完成清理。
$ mvn clean
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< com.lfqy.demo:demo >-------------------------
[INFO] Building demo 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ demo ---
[INFO] Deleting /Users/chengxia/IdeaProjects/TestProj/demo/target
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.403 s
[INFO] Finished at: 2019-04-22T19:56:31+08:00
[INFO] ------------------------------------------------------------------------
$
執(zhí)行完成之后儒喊,target目錄的輸出全部被清掉了镣奋。如下。