MacOS, Java和IDEAJava 杂谈

Maven管理jar包的开发

2019-04-22  本文已影响4人  SpaceCat

工作中,有时候会将一些依赖打包成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常用命令

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

参考资料

上一篇 下一篇

猜你喜欢

热点阅读