Maven管理jar包的开发
工作中,有时候会将一些依赖打包成jar文件,供其他工程引用。这里就介绍下如何用Maven来管理java包的编译、测试和开发。
1、Maven基础
1.1 Maven Repository
默认地,Maven会从本地仓库获取项目的依赖。如果本地仓库没有,就会去远程中心仓库获取。
远程中心仓库地址:https://repo.maven.apache.org/maven2
如下是这个网址的截图:
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,如下。
点下一步,输入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 {
}
}
如下是,到目前的代码结构:
上面代码中,有几个类是标红的,很明显这个是缺少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