Maven,如果想要修改底层依赖的库,先clone下来修改构建,然后使用本地JAR文件。StackOverflow的高票回答里有一些坑。记录一下。
背景
Soot加载新的APK总是报错,而且报错了就停了。能不能让它忽略当前报错,直接放弃当前method body呢?基于这个想法我开始修改soot源码,最后的方案在这个commit。
遇到的问题
编译时跳过测试
修改了Soot代码,直接编译会说一些测试异常。使用mvn -Dmaven.test.skip=true package
在打包时跳过异常。
maven引用本地jar文件
- 基于scope=system的方式
网上搜索首先会看到这个回答,它推荐使用system类型的依赖:
1 | <dependency> |
然而,再看看就发现很多地方说这种方式不好,比如已经depricated了。直接劝退我的,是我用的shaded插件(和依赖一起打包为一个jar),不会把这种依赖加进来,直接报错找不到Soot.G
这个类。
- 基于
mvn install:install-file
的方式
于是采用回答里的第二种方法,安装到本地maven缓存。
1 | mvn install:install-file \ |
问题在于,这种方式引入的依赖似乎不会引入递归的依赖。比如我发现缺了很多soot的依赖。
- 基于maven-install-plugin的方式
根据官方文档,如果那边jar是maven构建的,则可以使用下面这种方式直接安装到本地缓存,因为读取了jar里的pom.xml
文件。既然都有了pom了,依赖信息也在了。但是坑点是版本要改成3.0.1以上,因为其实这个是个已知的问题,很晚才修复。这个comment救了我。
1 | # 删除本地的缓存 |
最后发现怎么还是在跑的旧代码,可能是shaded插件的问题。还是得删掉targets文件夹。
检查依赖问题
使用mvn dependency:tree
可以打印树状的依赖图
VSCode Java插件关联本地代码
根据这个issue里说的,看来只能在那边创建-src
后缀的jar文件,可能要同时放到本地maven仓库?
总体构建脚本
1 |
|