Maven管理jar包的开发

作者: SpaceCat | 来源:发表于2019-04-22 23:43 被阅读4次

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

参考资料

相关文章

  • S3接口API

    Jar包 在web应用开发中,我们使用Maven做项目管理,基于SpringBoot/SpringCloud做开发...

  • maven

    maven 管理jar包的工具,可以管理依赖也可以把自己的软件打成jar包提供他人。编译、测试、打包。maven的...

  • Maven学习笔记

    Maven概述 Maven定义Maven是一个项目管理和整合,统一管理jar包的工具;Maven为开发者提供了一套...

  • 使用springboot创建一个web版的helloworld

    maven配置环境 maven作为一个整合和拉取开发jar包的管理工具,解放了我们需要通过下载一个个jar包并导入...

  • Maven基础

    Maven介绍 可以管理项目jar包的构建,解决jar包之间的冲突;可以对项目进行管理,比如项目打包等,maven...

  • Maven管理jar包的开发

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

  • spring boot添加非maven库里的jar包

    日常开发用到的是oracle的jar包,但在maven中央库里没有;需要手动引包,但这样不利用项目以后的开发管理;...

  • 2018-10-28 mave

    Maven 管理Java 项目开发的全部生命周期 Jar包依赖被很好解决 Maven 通过其插件机制实现一切 测试...

  • Maven配置

    maven环境配置 maven是一个项目管理插件,一般开发中会使用很多jar包,使用maven不用你手动去下载ja...

  • 依赖冲突解决办法

    依赖冲突解决办法 maven 的价值 Java开发中,jar的管理由maven来管。maven做的事情: jar统...

网友评论

    本文标题:Maven管理jar包的开发

    本文链接:https://www.haomeiwen.com/subject/zcwpgqtx.html