基本匕首示例NoClassDefFoundError:dagger / internal / Preconditions

时间:2018-02-01 14:34:23

标签: java gradle dependency-injection dagger-2 dagger

我有一个非常简单的基本项目,它给了我一个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时呢?我不明白为什么我不能以这种方式使用它。

0 个答案:

没有答案