zoukankan      html  css  js  c++  java
  • 使用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>
    
  • 相关阅读:
    【转载】数据结构与算法设计
    【转载】简述Linux的启动过程
    【转载】20分钟MySQL基础入门
    【转载】linux内核笔记之进程地址空间
    【转载】linux内核笔记之高端内存映射
    Logical Address->Linear Address->Physical Address
    【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
    【转载】不会编程也能写爬虫?可视化爬虫工具是什么东东
    【转载】我是一个键盘
    80. Remove Duplicates from Sorted Array II
  • 原文地址:https://www.cnblogs.com/slankka/p/11663595.html
Copyright © 2011-2022 走看看