基础Dagger项目出现NoClassDefFoundError: dagger/internal/Preconditions问题求助
解决Dagger 2 + Gradle运行时NoClassDefFoundError问题
你遇到的NoClassDefFoundError大概率是两个核心原因导致的:要么Dagger编译时自动生成的代码没被打包进你的Jar,要么运行时缺少必要的依赖支持。我给你一步步拆解解决方案:
1. 替换过时的APT插件,改用Gradle原生注解处理器支持
你当前使用的net.ltgt.apt插件已经比较老旧,Gradle从Java插件3.0版本开始就自带了注解处理器的原生支持,完全不需要额外插件。修改你的Gradle配置:
首先移除顶部的plugins { id "net.ltgt.apt" version "0.10" },然后把依赖部分调整为:
dependencies { // 用Gradle原生的annotationProcessor配置注解处理器 annotationProcessor 'com.google.dagger:dagger-compiler:2.14.1' // 用implementation替代compile(Gradle 3.0+的标准依赖配置) implementation 'com.google.dagger:dagger:2.14.1' }
这样Gradle会自动把Dagger生成的类(比如DaggerMain_Runner)纳入编译路径,打包时也会自动包含这些生成的代码。
2. 确保运行时依赖可用
你当前打包的Test.jar只包含自己编写的代码,没有包含Dagger的核心依赖。运行时有两种解决方式:
- 方式一:手动指定classpath运行
在命令行运行时,把Dagger的Jar包加到类路径中:# Windows系统用分号分隔路径 java -cp "Test.jar;dagger-2.14.1.jar" test.Main # Linux/Mac系统用冒号分隔路径 java -cp "Test.jar:dagger-2.14.1.jar" test.Main - 方式二:打包包含所有依赖的"胖Jar"
如果想生成一个可以直接双击运行的独立Jar,推荐使用shadowJar插件:- 在Gradle配置顶部添加插件:
plugins { id 'java' id 'com.github.johnrengelman.shadow' version '7.1.2' } - 配置shadowJar的主类和打包信息:
shadowJar { manifest { attributes 'Implementation-Title': 'test', 'Implementation-Version': '1.0.0', 'Main-Class': 'test.Main' } archiveName 'Test.jar' } - 执行
./gradlew shadowJar命令,生成的Jar在build/libs/Test.jar,直接运行即可:java -jar Test.jar
- 在Gradle配置顶部添加插件:
3. 补全Main类中的Dagger组件初始化代码
你的Main类里Runner runner = ...部分未完成,Dagger会根据你的@Component注解自动生成DaggerMain_Runner类(前提是ServiceModule配置正确),补全代码示例:
public static void main(String[] args) { // 初始化Dagger自动生成的组件 Runner runner = DaggerMain_Runner.create(); ApplicationRunner appRunner = runner.runner(); // 这里调用ApplicationRunner的业务方法,比如 appRunner.run(); }
另外要确保ServiceModule类存在,并且正确提供了ApplicationRunner的实例,否则Dagger无法生成对应的组件类,也会导致编译或运行时错误。
内容的提问来源于stack exchange,提问作者Samuel Amantea-Collins
相关产品推荐
相关产品推荐

