是否存在为缺失Gradle/Maven依赖生成Java Stub/API JAR的编译工具?
当然有啦!这类工具还真不少,专门解决你这种「依赖拿不到但要先编译」的场景。我给你列几个常用的方案,分Gradle、Maven和通用工具三类:
Gradle专用:gradle-stub-plugin
这个插件是Gradle项目的首选,配置简单,能自动帮你生成目标依赖的Stub JAR。
- 首先在
build.gradle里引入插件并配置缺失的依赖坐标:
plugins { id 'com.github.johnrengelman.stub' version '1.0.0' } stub { dependencies { // 替换成你缺失的依赖坐标 stub 'com.example:your-missing-dependency:1.0.0' } }
- 执行命令生成Stub:
gradle generateStubs
生成的Stub JAR会自动被加入编译类路径,项目就能正常编译了。
Maven专用:Maven Stub Plugin
针对Maven项目,也有官方生态的插件可以用:
- 在
pom.xml中添加插件配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-stub-plugin</artifactId> <version>1.0</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <dependencies> <dependency> <!-- 替换成你的缺失依赖 --> <groupId>com.example</groupId> <artifactId>your-missing-dependency</artifactId> <version>1.0.0</version> </dependency> </dependencies> </configuration> </execution> </executions> </plugin>
- 运行生成命令:
mvn stub:generate
生成的Stub会被Maven自动识别为编译依赖。
通用灵活方案:Byte Buddy
如果需要对Stub的生成逻辑有更细的控制(比如让方法返回默认值、自定义空实现),Byte Buddy是个不错的选择。你可以写个简单的Java脚本生成Stub类,再打包成JAR:
import net.bytebuddy.ByteBuddy; import net.bytebuddy.description.modifier.Visibility; import net.bytebuddy.implementation.StubMethod; import java.io.File; import java.io.IOException; public class StubGenerator { public static void main(String[] args) throws IOException { // 生成一个名为com.example.MissingClass的Stub类 var dynamicType = new ByteBuddy() .subclass(Object.class) .name("com.example.MissingClass") .defineMethod("yourMethod", String.class, Visibility.PUBLIC) .intercept(StubMethod.INSTANCE) // 生成空实现 .make(); // 把生成的类保存到目录 dynamicType.saveIn(new File("stub-output")); // 之后用jar命令打包:jar cvf stub.jar -C stub-output/ . } }
极简手动方案
如果缺失的依赖API很少,直接手动写空实现的类/接口,然后用jar命令打包:
# 假设你的Stub类都在stub-classes目录下 jar cvf missing-dependency-stub.jar -C stub-classes/ .
之后把这个JAR添加到项目的编译依赖中即可。
⚠️ 注意:所有Stub JAR都只能用于编译阶段,运行时必须替换成真实的依赖JAR,否则会抛出NoClassDefFoundError或AbstractMethodError哦!
内容的提问来源于stack exchange,提问作者Lawrence Tierney
相关产品推荐
相关产品推荐

