记一次 Maven 打包后,第三方无法使用的排查记录

news2025/1/16 16:17:39

你好,我是悟空。

本文主要内容如下:

目录

前言

最近遇到一个需求:

写一个工具类的 JAR 包,然后提供给第三方使用。

期间遇到了一些问题:

  • 第三方引入 JAR 包后,无法 import。
  • 第三方引入 JAR 包后,缺少 JAR 包中的其他依赖。

本篇做个记录,希望能帮助到其他小伙伴。

本篇既然涉及到 Maven,这里先总结下 Maven 的常用命令。对 Maven 命令比较熟悉的同学可以跳过这小节。

Maven 常见命令

当我们创建好一个 Maven 工程时,IDEA 开发工具的右侧就会自动出现 Maven 命令。

Maven 操作

我们用鼠标双击下就可以运行了,也可以通过命令行来执行

下面介绍这几种命令的区别。

clean(常用)

删除项目路径下的 target 文件,但是不会删除本地的maven仓库已经生成的 JAR 文件。

validate

验证工程正确性,所需信息完整否。

compile

编译。会在你的项目路径下生成一个target目录,在该目录中包含一个classes文件夹,里面全是生成的class文件。

test

执行单元测试。

package(常用)

将工程文件打包为指定的格式,例如 JAR,WAR 等(看你项目的 pom文件,里面packaging 标签就是来指定打包类型的)。

这个命令会在你的项目路径下一个target目录,并且拥有compile命令的功能进行编译,同时会在target目录下生成项目的 jar/war文件。

如果a项目依赖于b项目,打包b项目时,只会打包到b项目下target下,编译a项目时就会报错,因为找不到所依赖的b项目,说明a项目在本地仓库是没有找到它所依赖的b项目,这时就用到 install 命令。

verify

核实,主要是对 package 检查是否有效、符合标准。

install(常用)

将包安装至本地仓库,以让其它项目依赖。

该命令包含了 package 命令功能,不但会在项目路径下生成 class 文件和 jar 包,同时会在你的本地maven仓库生成 jar 文件,供其他项目使用(如果没有设置过maven本地仓库,一般在用户 /.m2 目录下。如果 a 项目依赖于 b 项目,那么 install b 项目时,会在本地仓库同时生成 pom 文件和 jar文件,解决了上面打包 package出错的问题)。

build

建造。功能类似compile,区别是对整个项目进行编译。

与 compile区别及特点:是对整个工程进行彻底的重新编译,而不管是否已经编译过。

Build过程往往会生成发布包,这个具体要看对 IDE 的配置了,Build在实际中应用很少,因为开发时候基本上不用,发布生产时候一般都用ANT等工具来发布。Build 因为要全部编译,还要执行打包等额外工 作,因此时间较长。

site

生成项目的站点文档。

deploy(常用)

部署。将 jar 包部署到远程仓库,通常是私有仓库。而且包含了 install 命令的功能。

打包后,无法 import?

下面介绍一下我用常规打包方式遇到的问题。

我通过 IDEA 工具创建了一个 SpringBoot 项目,然后 pom.xml 文件中会自动引入一个打包插件,如下图所示:

然后我执行 maven package 命令,会在项目的 target 目录生成一个 JAR 包。如下图所示:

然后我做了以下事情:

  • 把这个 JAR 包拷贝出来,发给了第三方。

  • 让第三方拷贝到他们自己的本地项目中。这里是在项目的根目录创建了一个 libs 目录,然后将 jar 包放到 libs 目录中。

  • 让第三方在 pom 依赖中引入这个依赖包。

scope 指定为 system,表示引入指定路径(systemPath配置)下的 JAR 包。

看起来这么做没问题了,但是当我们 import 这个 JAR 包下的类时,就会报错。如下图所示:

很奇怪,这里为什么会报错呢??

先看下这个 JAR 包是否引入了。如下所示,可以看到确实是正确引入了,没有报错。

通过 research,发现这个打包插件打出来的 JAR 包,是供执行的,也就是可以通过 java -jar 命令来运行这个 JAR 包,并不能给第三方来引用使用。

解决方案:换一个打包插件 maven-compiler-plugin

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>

再次打包发给第三方,发现 import 不报错了。

但是又报另外一个错,我们接着往下看。

缺少其他 Jar 包依赖?

报错信息如下:

java.lang.NoClassDefFoundError: org/apache/commons/codec/binary/Base64

通过这个信息,可以想到是不是我提供的 JAR 包中引入了这个 commons-codec 依赖,而 JAR 包文件中又不包含这个依赖。

看下这个 JAR 文件的大小,只有 14 KB, 而 commons-codec 的包大小为 339 KB,说明这个 JAR 包确实不包含 common-codec 依赖。

解决方案:

  • 将其他依赖包打入到这个 JAR 包里面(推荐)。
  • 第三方自己引入其他依赖包。(麻烦了第三方)

那如何将依赖的包打进这个 JAR 包里面呢?

这里还要引入一个打包插件:maven-assembly-plugin。如下所示。(省略了部分标签)

<!--添加依赖 maven-assembly-plugin -->
<dependency>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.0.0</version>
</dependency>

<!--添加插件 maven-assembly-plugin -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.4.1</version>
    <configuration>
        <!--打包时,包含所有依赖的jar包-->
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

然后还要用插件打包的方式:

然后 target目录下会多出一个包:

decryption-0.0.1-SNAPSHOT-jar-with-dependencies

这个包的文件很大,有 15.4 M。

发给第三方再次引入后,不再报错了。

我们来看下这个包里面有什么东西,在 META-INF/maven 目录下可以看到 commons-codec 依赖包,说明确实将这个依赖包打进去了。

而之前打的包,是没有这个目录的。
在这里插入图片描述

至此,排查结束。

https://blog.csdn.net/Shangxingya/article/details/114810454

https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/117302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你可以不看世界杯,但你一定要知道这些

2022卡塔尔世界杯&#xff0c;阿根廷夺冠&#xff0c;举世沸腾。 ​夺冠之路&#xff0c;遍布荆棘 时隔36年&#xff0c;阿根廷再次夺得大力神杯&#xff0c;回望夺冠之路&#xff0c;坎坷遍布&#xff0c;荆棘丛生。 2006年夏天&#xff0c;梅西第一次参加世界杯。时任阿根廷…

Mybatis源码(一)获取数据源

前言 Mybatis做为一种半ORM框架&#xff08;半&#xff1a;需要手动写sql&#xff09;。ORM&#xff08;Object Relational Mapping&#xff09;的技术本质是&#xff1a;ORM框架将对象的值 映射到 对应数据库类型&#xff1a; 如 String -> varchar。 且mybatis分为两种实…

数字孪生核电站促进界面监测的应用实践

未来核电站将向着数字化、智能化发展,“少人值守、智能监测”会广泛应用于核电站运行管理。利用数字孪生技术,可以对实体核电站和孪生核电站的数据进行交换分析,促进核电站的运行管理和监测,更好地确保反应堆运行安全。 数字孪生核电站促进界面监测的应用实践 北京智汇云舟科技…

h5中使用微信分享

1.需要 绑定域名&#xff1a; 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”&#xff08;即访问前端项目对应的域名)。 2.在项目中引入sdk: 在需要调用 JS 接口的页面引入如下 JS 文件&#xff0c;&#xff08;支持https&#xff09;&#xff…

搭vue项目(初级版)

这个项目只有 会员管理和直播管理两个模块。创建两个模块是为了验证一下路由跳转。 下载项目&#xff1a; 可以到我的资源中下载压缩包 或者 git clone 前端项目搭建: 前端搭建的项目&#xff0c;仅供学习使用 1.安装vue-cli,全局只需要安装一次&#xff0c;如果安装过一次&am…

MyBatisPlus ---- 入门案例

MyBatisPlus ---- 入门案例1. 开发环境2. 创建数据库及表a>创建表b>添加数据3. 创建SpringBoot工程a>初始化工程b>引入依赖c>idea中安装lombok插件4. 编写代码a>配置application.ymlb>启动类c>添加实体d>添加mappere>测试f>添加日志1. 开发环…

了解 Oracle 中单引号与双引号的用法,一篇文章教会你!

无论测试或者开发&#xff0c;对数据库的增删改查都是家常便饭。但有些小知识是经常被忽略&#xff0c;却又不能不去了解的&#xff0c;例如单引号和双引号的用法和区别&#xff0c;看完这一篇&#xff0c;你肯定会有收获。 首先我们要区别一个概念&#xff0c;即单引号(‘)和双…

docker应用部署示例

Docker 应用部署 一、部署MySQL 搜索mysql镜像 docker search mysql拉取mysql镜像 docker pull mysql:5.6创建容器&#xff0c;设置端口映射、目录映射 # 在/root目录下创建mysql目录用于存储mysql数据信息 mkdir ~/mysql cd ~/mysqldocker run -id \ -p 3307:3306 \ --na…

如何通过文档管理控制合同管理

如何通过文档管理控制合同管理 如果您的公司处理的合同比以往任何时候都多&#xff0c;那么您并不孤单。这种指数级增长的原因包括日益增长的监管要求、供应链问题以及全球化带来的业务关系的复杂性。此外&#xff0c;员工更频繁地换工作&#xff0c;因此&#xff0c;需要管理更…

Unity实用小工具—以对象形式操作Sqlite

一、介绍 1.1、版本说明&#xff1a;使用的Unity版本为个人版2020.3.39&#xff0c;数据库为Sqlite&#xff08;一个轻量级跨平台数据库&#xff09;&#xff0c;Sqlite的查看管理工具可以在网上下载https://dbeaver.io/download/&#xff0c;可以直接保存下来使用。 1.2、数…

微服务(四)——统一网关

目录1. 概念2. 实现网关1. 实现流程2. 小结3. 断言工厂4. 过滤器工厂1. GatewayFilter2. GlobalFilter3. 过滤器的执行顺序5. 解决跨域问题1. 概念 网关的作用&#xff1a; 认证、鉴权服务路由、负载均衡请求限流 网关的实现&#xff1a; gateway 基于Spring5中提供的WebFlu…

linux 设置登录提示语

勿以恶小而为之&#xff0c;勿以善小而不为---- 刘备 /etc/motd 文件里面 保存的是 登录后提示语 vim /etc/motd可以放置自定义的 文字信息 -------------------- 每天都要加油努力噢&#xff0c;岳泽霖!!! -------------------登录之后&#xff0c;就会展示信息: 参考链接: …

【Linux】Linux命令行git的使用

前进才是唯一的方向 文章目录一、git是什么&#xff1f;二、gitee仓库创建1.新建仓库2.复制仓库链接3.克隆远端仓库到本地来三、git提交代码1.下载git2. 配置用户名和邮箱&#xff08;否则git commit无法正常使用&#xff09;3. git提交代码三板斧3.1 git add&#xff08;将代…

git merge合并开发分支到上线分支遇到的问题,提示 no new changes

git merge 后 push 到 Gerrit 失败&#xff0c;提示 no new changes 解决思路&#xff1a; 分析&#xff1a;no new changes 的意思&#xff0c;是说&#xff0c;这个合并&#xff0c;是个线性的合并。而合并的那些历史的 commit 节点&#xff0c;在 gerrit 上都已经评审过了&…

在Linux中安装ShowDoc

在Linux中&#xff0c;有两种方式安装ShowDoc。第一种是自动脚本安装&#xff0c;第二种是手动安装。官方推荐使用自动脚本安装ShowDoc。如果自动脚本安装ShowDoc失败&#xff0c;可以考虑手动安装ShowDoc。 自动脚本安装ShowDoc 自动脚本利用docker来安装运行环境&#xff0…

酒鬼私定,只是酒鬼酒一次破圈营销?

围坐红泥小火炉&#xff0c;煮酒谈今夕。 过去一年多时间&#xff0c;经历了业绩向上&#xff0c;股市向下的反差时期后&#xff0c;越来越多人意识到白酒行业已步入存量时代。 2022年前三季度&#xff0c;中国规模以上白酒行业实现总产量487.9万千升&#xff0c;同比减少2.5…

proxychains for Windows

proxychains for Windows背景介绍项目地址使用scoop安装proxychains for windows验证命令行能否调用proxychains配置代理使用为Windows终端配置proxy--适用于cmd为Windows终端配置proxy--适用于PowerShellpowershell配置变量背景介绍 有时候Windows下的一些命令行程序想要挂代…

正大国际期货:外盘德指期货交易应该怎么做?

作为一个期货交易者&#xff0c;想要在市场上生存下来&#xff0c;就必须针对各种可能性都有所准备。比如&#xff0c;如果你强烈看涨&#xff0c;就必须准备好应对市场打你个冷不防的可能。相反&#xff0c;如果你对眼前的涨势高度怀疑&#xff0c;也不能彻底排除上演一场黑天…

ElasticSearch安装和部署和整合springboot

因为项目每次用到&#xff0c;每次重新搭都踩坑&#xff0c;特此记录一些坑&#xff0c;防止花费大量时间在搭建和整合上面安装 准备好压缩包elasticsearch-6.2.4解压 在config文件夹下配置文件elasticsearch.yml&#xff0c;可更改自行喜欢的端口和配置账号密码安装中文分词器…

git笔记

coderwhy听课笔记 什么是集中式 分布式 集中式是将整个仓库放到服务器&#xff1b;分布式是每台电脑上都有对应的仓库&#xff0c;可以在本地提交&#xff0c;之后把本地的仓库同步到服务器的仓库里 git安装 除了能使用git命令&#xff0c;还安装了git bash,git GUI git ba…