问题描述

我们偶尔会发现一些开源项目的问题,或者出于其他原因,想在某个dependency的代码中加几行或者删除几行来达到目的。

我这里遇到一个dubbo 2.7.3和open feign冲突的问题

参见 Issue https://github.com/apache/dubbo/issues/3990

这里不能等官方修复这个问题并发布更新时,怎么让项目正确的跑起来呢?

问题思路

第一种

字节码替换技术?使用bytebuddy,javassist, asm?

这些技术的局限性,就是JVM本身不允许 在JVM运行期间提供一个新版本类信息。

那么要么通过 javaagent,instrument, 要么JDWP。

第二种

直接clone 开源项目的源码,然后修改一两行,再重新编译,放在项目内,在配置lib依赖,从dependency中排除此依赖????

这种方式经过测试可行,具体需要的知识有,maven的 scope=provided, spring-boot-maven-plugin的 exclude,例如

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<excludes>
<exclude>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</exclude>
</excludes>
<executable>true</executable>
</configuration>
</plugin>

目标就是让项目不会把maven仓库的jar包打到依赖中。

另外还需要将lib下的新编译的jar编译到项目。

这还需要配置resources。比较麻烦。

最后,为了改一两行代码,重新编译整个开源项目,还要改动这么多地方,不值得

第三种

有没有那种maven插件?

答案是有的:maven-shade-plugin和maven-dependency-plugin

这里由于spring-boot-maven-plugin插件内有maven-shade-plugin,而且经过尝试,在额外配置一个maven-shade-plugin之后,需要很多include,exclude,

要不就是导致最后UberJar特别大。

如果项目仅仅是一个单一的jar,那么使用maven-shade-plugin理论上也是可以的,将某个jar的内部给exclude掉。

但是这里仍旧推荐maven-dependency-plugin,简单粗暴不容易出错。

问题解决

  1. 项目中提供ServiceBean的实现
  2. 项目的POM添加如下plugin,不用担心插件打包顺序问题,phase=generate-sources是比较靠前的。
  3. 项目的POM如果用到SpringBoot的spring-boot-maven-plugin插件,还要exclude掉dubbo的artifact。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>generate-sources</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<type>jar</type>
<overWrite>true</overWrite>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<excludes>
**/ServiceBean.class
</excludes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>

使用maven替换项目依赖中的字节码的更多相关文章

  1. Maven下载项目依赖jar包和使用方法

    一.Maven3.5.0安装与配置+Eclipse应用 参考:Maven3.5.0安装与配置+Eclipse应用 二.http://mvnrepository.com/ 此处以http://mvnre ...

  2. 【maven】maven查看项目依赖并解决依赖冲突的问题

    一.问题 项目开发过程中,经常会遇到jar冲突,然后maven根据自己的规则进行冲突解决,导致项目在运行的过程中报错. 1.maven自动解决依赖冲突的规则是什么? 2.如何查看当前项目的maven的 ...

  3. 【转】maven导出项目依赖的jar包

    本文转自:http://my.oschina.net/cloudcoder/blog/212648 一.导出到默认目录 targed/dependency 从Maven项目中导出项目依赖的jar包:进 ...

  4. eclipse maven 导出项目依赖的jar包

    转自:https://blog.csdn.net/andyliulin/article/details/46544555 一.导出到默认目录 targed/dependency 从Maven项目中导出 ...

  5. maven导出项目依赖的jar包

    摘要: 在进行项目部署时,需要将maven项目所依赖的jar导出到指定目录,本文讲解如何导出项目依赖的jar包 一.导出到默认目录 targed/dependency 从Maven项目中导出项目依赖的 ...

  6. Maven解读:项目依赖管理如何优化

    Github地址:https://github.com/zwjlpeng/Maven_Detail Maven最大的好处莫过于其强大的依赖管理系统,在Pom配置文件中指定项目需要的Jar包的坐标,Ma ...

  7. Maven配置项目依赖使用本地仓库的方法汇总

    Maven配置项目使用本地仓库有以下方式实现: 1.类似本地仓库,但是属于本地依赖,比如某个JAR包是引用第三方的,直接放在了项目的lib文件夹,那么此时可以如下配置项目的POM: <depen ...

  8. 使用Maven导出项目依赖的jar包

    步骤1.进入项目目录(有pom.xml的目录) 2.创建存放导出jar依赖包的目录 3.地址栏输入cmd,回车 4.输入导出命令,回车mvn dependency:copy-dependencies  ...

  9. C#、Unity网络通信中基于字节码的自定义协议解码,C#版ByteBuffer

    http://www.oschina.net/code/snippet_42170_37516 C#.Unity基于字节的网络通信中字节码解析类,类似java中的ByteBuffer,不过这个实现是参 ...

随机推荐

  1. 为elastic的索引做快照并恢复快照到新集群

    1. 为指定的所有做快照 curl -XPUT "192.168.1.1:9200/_snapshot/my_backup/testindex_20170803?wait_for_compl ...

  2. Python连载40-协程定义及状态、send语句、yield用法

    一.协程 1.历史进程: (1)3.4引入协程,用yield来实现 (2)3.5引入协程语法 (3)实现协程比较好的包有asyncio,tornado,gevent 2.定义:协程是为非抢占式多任务产 ...

  3. Android Studio [相对布局RelativeLayout]

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...

  4. NET Core 3.0 新姿势 将AutoFac替换内置DI

    .NET Core 3.0 和 以往版本不同,替换AutoFac服务的方式有了一定的变化,在尝试着升级项目的时候出现了一些问题. 原来在NET Core 2.1时候,AutoFac返回一个 IServ ...

  5. 我用阿里云的虚拟云主机,也能配置https加密吗?

    我用阿里云的虚拟云主机,也能配置https加密吗?答案是YES. 整个过程比想象中还要简单,都是一些基本的配置,虚拟主机 Web托管都可以很容易的搞定https. 首先我们要了解一下,阿里云是怎么支持 ...

  6. MySQL 特性:Double Write

    1.什么是double write 首先要明白double write这个特性是针对谁的,日志or脏数据? 明白的是脏数据,是内存中修改后的数据页,这些数据页修改后和磁盘上存储的原数据不一致了,称为脏 ...

  7. 报错com.neenbedankt.android-apt not found如何解决

    apply plugin: 'com.neenbedankt.android-apt' 在moudle中build.gradle文件内有应用此插件,编译时报错 检查Project中build.grad ...

  8. Mysql Hash索引和B-Tree索引区别(Comparison of B-Tree and Hash Indexes)

    上篇文章中说道,Mysql中的Btree索引和Hash索引的区别,没做展开描述,今天有空,上Mysql官方文档找到了相关答案,看完之后,针对两者的区别做如下总结: 引用维基百科上的描述,来解释一下这两 ...

  9. 项目三:ssm仓库管理系统

    声明:项目来源于网络,尊重原创,学习使用,仅在此记录 项目介绍 ssm仓库管理系统,功能模块:客户信息管理,供应商管理,货物管理,仓库管理,仓库管理员管理,仓库出入口管理,仓库库存记录管理,系统日志管 ...

  10. 使用lombok中的log

    idea中安装lombok插件 引入lombok依赖 <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> ...