我有一个非常简单的基本项目,它给了我一个NoClassDefFoundError。
这是我的傻瓜:
plugins {
id "net.ltgt.apt" version "0.10"
}
group 'test'
version '1.0-SNAPSHOT'
apply plugin: 'java'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
apt group: 'com.google.dagger', name: 'dagger-compiler', version: '2.14.1'
compile group: 'com.google.dagger', name: 'dagger', version: '2.14.1'
}
jar {
manifest {
attributes 'Implementation-Title': 'test',
'Implementation-Version': '1.0.0',
'Main-Class': 'test.Main'
}
archiveName 'Test.jar'
}
我的主要课程:
package test;
import dagger.Component;
public class Main {
@Component(modules = { ServiceModule.class })
interface Runner {
ApplicationRunner runner();
}
public static void main(String[] args) {
Runner runner = DaggerMain_Runner.builder()
.serviceModule(new ServiceModule())
.build();
runner.runner().execute();
}
}
我的ServiceModule:
package test;
import dagger.Module;
import dagger.Provides;
@Module
public class ServiceModule {
@Provides
public HelloService provideHelloService() {
return new HelloServiceImpl();
}
}
HelloService:
package test;
public interface HelloService {
void sayHello();
}
HelloServiceImpl:
package test;
public class HelloServiceImpl implements HelloService {
@Override
public void sayHello() {
System.err.println("HELLO");
}
}
最后是ApplicationRunner:
package test;
import javax.inject.Inject;
public class ApplicationRunner {
public final HelloService helloService;
@Inject
public ApplicationRunner(HelloService helloService) {
this.helloService = helloService;
}
public void execute() {
helloService.sayHello();
}
}
如果我现在跑:
./gradlew clean build && java -jar build/libs/Test.jar
我得到以下输出:
:clean:compileJava:processResources NO-SOURCE:classes:jar :assemble:compileTestJava NO-SOURCE:processTestResources NO-SOURCE :testClasses UP-TO-DATE:测试NO-SOURCE:检查UP-TO-DATE:build
建立成功
总时间:1.352秒线程“main”中的异常 java.lang.NoClassDefFoundError:dagger / internal / Preconditions at test.DaggerMain_Runner $ Builder.serviceModule(DaggerMain_Runner.java:49) 在test.Main.main(Main.java:14)引起: java.lang.ClassNotFoundException:dagger.internal.Preconditions at java.net.URLClassLoader.findClass(URLClassLoader.java:381)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:335)at at java.lang.ClassLoader.loadClass(ClassLoader.java:357)... 2更多
任何人都可以确定为什么我得到NoClassDefFoundError?作为参考,Main的第14行是:
.serviceModule(new ServiceModule())
我尝试过改变周围的东西,使用静力学,注入属性等等。虽然我似乎并不理解这里的基本内容。我可以让它工作的唯一方法就是将ServiceModule声明为抽象并使用@Bind注释样式。这一切都很好,但是当我真的想要使用@Provides时呢?我不明白为什么我不能以这种方式使用它。