内联第三方依赖到自己的包中

栏目: 编程工具 · 发布时间: 6年前

内容简介:Java世界一个很难绕过的问题就是依赖包,绝大部分项目总会或多或少的依赖第三方包。Maven或者Gradle等可以帮助我们轻松的管理第三方依赖,但是对于自己对外提供的包,特别是作为中间件或者基础组件等提供出去的包,还是会遇到一些第三方依赖的问题,主要有两个问题第一个情况可以先打一个fatjar,然后通过ProGuard精简代码。第二个情况就需要把第三方包的代码拷贝到自己的包中,在自己的代码中直接使用拷贝进来的三方包代码(pakcage name不一样),这样就可以最大程度保证稳定性。

Java世界一个很难绕过的问题就是依赖包,绝大部分项目总会或多或少的依赖第三方包。Maven或者Gradle等可以帮助我们轻松的管理第三方依赖,但是对于自己对外提供的包,特别是作为中间件或者基础组件等提供出去的包,还是会遇到一些第三方依赖的问题,主要有两个问题

  • 包依赖比较少,而且依赖第三方包中的极少部分代码
  • 一些关键依赖版本敏感,不希望使用方随意变更

第一个情况可以先打一个fatjar,然后通过ProGuard精简代码。

第二个情况就需要把第三方包的代码拷贝到自己的包中,在自己的代码中直接使用拷贝进来的三方包代码(pakcage name不一样),这样就可以最大程度保证稳定性。

当然大部分情况下对于第三方包的版本依赖没有那么敏感,上面说到的情况其实是大部分针对asm,cglib和objenesis等几个字节码增强的包。

具体的操作可以借助jarjar工具,先将三方包重新打包,然后修改Gradle的Jar任务,将重新打包后的jar复制到自己的包中。

task cglibRepackJar(type: Jar) { repackJar -> 	repackJar.baseName = "cglib-repack" 	repackJar.version = cglibVersion 	doLast() { 		project.ant { 			taskdef name: "jarjar", classname: "org.pantsbuild.jarjar.JarJarTask", 					classpath: configurations.jarjar.asPath 			jarjar(destfile: repackJar.archivePath) { 				configurations.cglib.each { originalJar -> 					zipfileset(src: originalJar) 				} 				// Repackage net.sf.cglib => com.huangyunkun.cglib 				rule(pattern: "net.sf.cglib.**", result: "com.huangyunkun.cglib.@1") 				// As mentioned above, transform cglib's internal asm dependencies from 				// org.objectweb.asm => com.huangyunkun.asm. Doing this counts on the 		
rule(pattern: "org.objectweb.asm.**", result: "com.huangyunkun.asm.@1") } } } }

然后修改Gradle的Jar任务配置

jar {
dependsOn cglibRepackJar
from(zipTree(cglibRepackJar.archivePath)) {
include "com/huangyunkun/cglib/**"
}
}

当然在具体打包的时候还可以根据需要exclude一些不需要的模块。

参考:https://github.com/shevek/jarjar


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C++ API设计

C++ API设计

[美] Martin Reddy / 刘晓娜、臧秀涛、林健 / 人民邮电出版社 / 2013-8 / 89.00

现代软件开发中的一大难题就是如何编写优质的API。API负责为某个组件提供逻辑接口并隐藏该模块的内部细节。多数程序员依靠的是经验和冒险,从而很难达到健壮、高效、稳定、可扩展性强的要求。Martin Reddy博士在自己多年经验基础之上,对于不同API风格与模式,总结出了API设计的种种最佳策略,着重针对大规模长期开发项目,辅以翔实的代码范例,从而有助于设计决策的成功实施,以及软件项目的健壮性及稳定......一起来看看 《C++ API设计》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具