使用maven替换项目依赖中的字节码

问题描述

我们偶尔会发现一些开源项目的问题,或者出于其他原因,想在某个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>

原文地址:https://www.cnblogs.com/slankka/p/11663595.html

时间: 2024-10-04 02:04:41

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

Maven百科 - 项目构建中的生命周期

Maven 中的三套生命周期 在maven中,其实是有三套相互独立的生命周期(Lifecycle),而不是我们以为的一套生命周期,准确地来说,在maven的世界,它有自己的一套生命周期管理的技术体系,在这套体系中,maven为我们定义了三套互相不影响的生命周期.它们分别是clean,default和site. 其中clean 和default最为常用了. 此外呢,每套生命周期 都有若干个生命周期阶段(phase).其中每套生命周期中的阶段都依赖于前一个阶段,以 clean 生命周期为例. cle

eclipse maven 导出项目依赖的jar包

一.导出到默认目录 targed/dependency 从Maven项目中导出项目依赖的jar包:进入工程pom.xml 所在的目录下,执行如下命令: 1.  mvn dependency:copy-dependencies 或在eclipse中,选择项目的pom.xml文件,点击右键菜单中的Run As,见下图红框中,在弹出的Configuration窗口中,输入dependency:copy-dependencies后,点击运行 maven项目所依赖的jar包会导出到targed/depen

maven导出项目依赖的jar包

在进行项目部署时,需要将maven项目所依赖的jar导出到指定目录,本文讲解如何导出项目依赖的jar包 一.导出到默认目录 targed/dependency 从Maven项目中导出项目依赖的jar包:进入工程pom.xml 所在的目录下,执行如下命令: ? 1 mvn dependency:copy-dependencies 或在eclipse中,选择项目的pom.xml文件,点击右键菜单中的Run As,见下图红框中,在弹出的Configuration窗口中,输入  dependency:c

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

Github地址:https://github.com/zwjlpeng/Maven_Detail Maven最大的好处莫过于其强大的依赖管理系统,在Pom配置文件中指定项目需要的Jar包的坐标,Maven就可以自动帮我们从中央仓库或者自已的私服下载,当项目中由于依赖的传递性,引入了两份相同的Jar包时,Maven也会根据自已的规则如路径最短,先声明者优先对相同Jar包进行取舍,达到项目类路径中只保留一份Jar包的目的,我们不排队一些粗心的程序员,在同一份Pom配置文件中对相同Jar写了两份不同

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

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

Maven把项目依赖的所有jar包都打到同一个jar中

目录 1 使用maven-shade-plugin 2 推荐: 使用maven-assembly-plugin 3 扩展: Maven安装本地jar包到本地仓库 4 扩展: 手动生成jar包 5 扩展: Linux下运行jar包的几种方式 5.1 阻塞式方式 5.2 后台运行方式 5.3 后台持续运行方式 5.4 其他命令扩展 1 使用maven-shade-plugin (1) 在项目的pom.xml文件中加入如下插件: <build> <plugins> <!-- Mav

Maven百科 - 项目构建中的聚合与继承

在笔者细心研究之前,对这这两者的概念虽有所理解,但在实际操作过程中往往只是知其然不知其所以然,因为他们的配置方式都是在一个 主POM 或者说父POM里面做相关的配置,不知道的可能很容易混淆. 接下来笔者做个清晰的介绍吧, 聚合 所谓聚合,其实就是多模块构建.面对较为复杂的项目,通常都会被分为很多相互依赖的模块,而这些模块是独立构建,maven为了应付这种类似的需求,设置了聚合方式. 使用聚合方式,需要组建一个主模块或者说聚合模块,它是用来管理组织那些小模块.这个聚合模块本身是不用构建的, 它只需

Maven百科 - 项目构建中的插件与目标

插件与目标 在讲述插件与生命周期关系之前,要明确一个概念,那就是插件目标.Maven它只抽象或者定义了生命周期与对应的任务, 真正去实现这些任务的是各个插件,所以maven的发布包只有3M左右的大小,当需要去做特定任务的时候,才会去下载插件(.jar). 从代码优化角度或者对于插件本身,考虑到代码的重用性,各任务之间想必一定会有可重用部分的代码,或者说,一部分可重用的代码,也能做很多事情. 所以一个插件,它并不是简单的完成一个任务,而是包含了很多任务,而这些插件可做的事情,就是插件目标. 以ma

【转载】Android Studio jar、so、library项目依赖,原文链接http://zhengxiaopeng.com/2014/12/13/Android-Studio-jar、so、library项目依赖/

前言 Android Studio(以下简称AS)在13年I/O大会后放出预览版到现在放出的正式版1.0(PS.今天又更新到1.0.1了)历时一年多了,虽然Google官方推出的Android开发者的IDE对我们Android DEV是很有吸引力的,但考虑到beta版还是太多问题所以自己主要还是把AS当做尝鲜为主,每放出一个较大更新就下载下来试试,感觉还是挺好的,渐渐用AS的人越来越多,Github上的项目也基本是AS的了,Google的sample也采用AS,所以使用Eclipse跟外界交流越