Maven管理jar包的開發(fā)

工作中,有時(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 repo

Maven Central Repository搜索的網(wǎng)址:https://search.maven.org/
如下是這個(gè)網(wǎng)址的截圖:
maven repo search

從該網(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遣铝,如下佑刷。

create module

點(diǎn)下一步,輸入groupid和artifactid酿炸,如下圖项乒。
groupid artifactid

這一步需要注意,groupid的命名規(guī)范梁沧,參照reverse site檀何。一般是(com/org/net).(company name / auther name).(project name),對于artifactid,可以直接用groupid最后的那一段频鉴。當(dāng)然栓辜,也可以不這么做,這里只是推薦實(shí)踐垛孔。
最后藕甩,輸入Module的名字,選擇Module的路徑周荐,點(diǎn)擊完成即可狭莱。如下圖。
module path

最后概作,創(chuàng)建完成的Maven Module的結(jié)構(gòu)如下腋妙。由于我們本來創(chuàng)建的就是一個(gè)新項(xiàng)目,所以讯榕,這個(gè)項(xiàng)目中什么都沒有骤素,項(xiàng)目的目錄結(jié)構(gòu)如下。
module structure

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):

module test structure

上面代碼中,有幾個(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目錄下灶泵,看到編譯的輸出物。如下圖对途。


compile out structure

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包仲锄。如下劲妙。


maven pack

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目錄的輸出全部被清掉了镣奋。如下。


maven clean

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怀愧,一起剝皮案震驚了整個(gè)濱河市侨颈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芯义,老刑警劉巖哈垢,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扛拨,居然都是意外死亡耘分,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門绑警,熙熙樓的掌柜王于貴愁眉苦臉地迎上來求泰,“玉大人,你說我怎么就攤上這事计盒】势担” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵北启,是天一觀的道長卜朗。 經(jīng)常有香客問我拔第,道長,這世上最難降的妖魔是什么聊替? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任楼肪,我火速辦了婚禮,結(jié)果婚禮上惹悄,老公的妹妹穿的比我還像新娘春叫。我一直安慰自己,他們只是感情好泣港,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布暂殖。 她就那樣靜靜地躺著,像睡著了一般当纱。 火紅的嫁衣襯著肌膚如雪呛每。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天坡氯,我揣著相機(jī)與錄音晨横,去河邊找鬼。 笑死箫柳,一個(gè)胖子當(dāng)著我的面吹牛手形,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悯恍,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼库糠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了涮毫?” 一聲冷哼從身側(cè)響起瞬欧,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎罢防,沒想到半個(gè)月后艘虎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咒吐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年野建,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渤滞。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贬墩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妄呕,到底是詐尸還是另有隱情陶舞,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布绪励,位于F島的核電站肿孵,受9級特大地震影響唠粥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜停做,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一晤愧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛉腌,春花似錦官份、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至河咽,卻和暖如春钠右,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忘蟹。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工飒房, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人媚值。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓狠毯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親杂腰。 傳聞我的和親對象是個(gè)殘疾皇子垃你,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容