说明:在阿里巴巴《Java开发手册(黄山版)》附2中相关解释如下:
-
一方库:本工程内部子项目模块依赖的库(jar包);
-
二方库:公司内部发布到中央仓库,可供公司内部其他应用依赖的库(jar包);
-
三方库:公司之外的开源库(jar包);
有时候,我们项目需要引用二方库中的jar包才能跑起来,而在排查问题时,我们可能锁定到是二方库的代码(jar包)中的代码有问题。此时,就需要去对二方库的项目进行相应的修改,commit & push,更新公司私服,然后再回过头删除本地仓库的jar包再继续。
但是,在排查阶段,我们可能不确定就是二方库的错误,另外,二方库的更新可能也不那么方便,万一排查到问题又不是出现在二方库,岂不是乱改代码。
本文介绍在不push代码的情况下,修改二方库jar包的源码。
场景
以之前做过的MinIO起步依赖这个Demo为例,当做是第二方库。手动在第二方库制造一个BUG,如下:
/**
* 使用MultipartFile进行文件上传
*
* @param bucketName 存储桶
* @param fileBytes 文件字节数组
* @param objectName 对象名
* @param contentType 类型
* @return
* @throws Exception
*/
public ObjectWriteResponse uploadFile(String bucketName, byte[] fileBytes, String objectName,
String contentType) throws Exception {
InputStream inputStream = new ByteArrayInputStream(fileBytes);
// 手动制造一个异常
System.out.println(1 / 0);
return minioClient.putObject(
PutObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.contentType(contentType)
.stream(inputStream, inputStream.available(), -1)
.build());
}
install到本地仓库,其他项目直接引入该Minio-simple项目的Maven坐标;
<dependency>
<groupId>com.hzy</groupId>
<artifactId>minio-simple</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
现在在其他项目在使用上传文件到MinIO时,报下面的异常:
发现是第二方库的问题,需要修改第二方库代码。有两种方法,如下:
方法一:install
打开二方库项目,修改代码,点Maven的install
命令,安装到本地仓库,更新本地仓库的二方库jar包;
方法二:手动打包
打开二方库项目,修改代码,执行compile
命令找到修改后的class文件;
找到编译后的class文件后复制到桌面上,然后操作如下:
不用想,这种方式对修改内容肯定有限制,如果改动很大的话,可能会导致修改不生效,或者报错。因为这种方式跳过了项目启动时的一些检查。联想一下Arthas中的redefine
命令的限制条件,可能来自于此。
测试
方式一一定是可以的,不用测试。我对方式二的修改进行了测试,可以看项目中引入的二方库字节码文件,改动已生效;
启动项目,发送请求,上传图片
打开MinIO控制台,图片上传没得问题,说明修改二方库源码成功;
总结
推荐使用方法一