Maven管理jar包的开发

工作中,有时候会将一些依赖打包成jar文件,供其他工程引用。这里就介绍下如何用Maven来管理java包的编译、测试和开发。

1、Maven基础

1.1 Maven Repository

默认地,Maven会从本地仓库获取项目的依赖。如果本地仓库没有,就会去远程中心仓库获取。
远程中心仓库地址:https://repo.maven.apache.org/maven2
如下是这个网址的截图:

maven central repo

Maven Central Repository搜索的网址:https://search.maven.org/
如下是这个网址的截图:
maven repo search

从该网址可以搜索所需的依赖,然后,找到maven配置文件中,dependency标签的写法。如下是一个例子:

<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目录,编译、测试代码,生成测试报告,生成jar/war文件。
  • mvn dependency:resolve只下载依赖,不做任何其他事情。
  • mvn dependency:get -Dartifact=groupId:artifactId:version下载指定的依赖。如果需要指定从某个特定的库下载,也可以加参数-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将本地的一个jar包发布到本地的maven仓库。这样,在pom.xml文件中,就可以通过如下的标签引用这个jar包依赖。
    <dependency>
      <groupId>com.aaa.util</groupId>
      <artifactId>util</artifactId>
      <version>1.2.17</version>
    </dependency>
    

2、用maven管理一个jar包的开发、打包和测试

2.1 创建模块

这里用idea作为例子,在一个打开的工程中,选中工程。然后,New -> Module...,在弹出的新建模块窗口中选择Maven,如下。

create module

点下一步,输入groupid和artifactid,如下图。
groupid artifactid

这一步需要注意,groupid的命名规范,参照reverse site。一般是(com/org/net).(company name / auther name).(project name),对于artifactid,可以直接用groupid最后的那一段。当然,也可以不这么做,这里只是推荐实践。
最后,输入Module的名字,选择Module的路径,点击完成即可。如下图。
module path

最后,创建完成的Maven Module的结构如下。由于我们本来创建的就是一个新项目,所以,这个项目中什么都没有,项目的目录结构如下。
module structure

2.2 编写样例代码和单元

首先,在src/java/main目录下,创建包并编写实例代码,如下。

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开头,后面再用不同子包来区分不同的代码模块。
接下来,创建单元测试。在工作区中,将光标放到上面的Compute类名位置,按下IDEA中的快捷键Shift + Command + T。IDEA会快速在Maven的测试目录(src/test)下生成一个测试类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 {
    }

}

如下是,到目前的代码结构:

module test structure

上面代码中,有几个类是标红的,很明显这个是缺少junit依赖。
我们首先在上面的https://search.maven.org/搜索到junit依赖(支持g:junit a:junit,根据指定的groupid和artifactid搜索)。复制其Maven依赖标签:

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

这时候,会发现上面的<version>4.12</version>中的4.12是红色的。因为本地库没有,没认出这个依赖。
接下来,通过IDEA执行下reimport,然后,红色的版本号就变成正常了。前面test类中的未识别的类也变正常了,说明单元测试的依赖已经被正常导入了。添加简单的单元测试逻辑如下:

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编译

执行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测试

命令行下执行mvn test运行测试案例:

$ 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 打包

通过执行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在打包之前会先运行测试,打包运行完成之后,可以看到在target目录下生成了jar包。如下。


maven pack

2.3.4 Maven清理

通过执行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] ------------------------------------------------------------------------
$ 

执行完成之后,target目录的输出全部被清掉了。如下。


maven clean

参考资料

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容