项目已使用Maven成功运行,但在使用intellij运行时失败

时间:2018-10-26 07:31:41

标签: intellij-idea dependency-injection guice dropwizard intellij-14

我正在App.java(这是我模块的主类)内创建一个托管对象。我正在使用带有dropwizard框架的guice库,并且只有在使用IntelliJ运行时才获得此异常,如果我使用mvn运行相同的代码,则它的工作原理非常好,这很奇怪,超出了我的理论范围。因此,如果有人经历过类似的事情或对此有一定的理论基础,请分享。随时询问任何细节。

   environment.lifecycle().manage(new Managed() {
        @Override
        public void start() throws Exception {
        }

        @Override
        public void stop() throws Exception {
        }
    });

异常stacktrace:-

  Exception in thread "main" com.google.inject.CreationException: Unable to create injector, see the following errors:

        1) Injecting into inner classes is not supported.  Please use a 'static' class (top-level or nested) instead of com.phonepe.growth.App$4.
        at ru.vyarus.dropwizard.guice.module.installer.InstallerModule.bindExtension(InstallerModule.java:191) (via modules: ru.vyarus.dropwizard.guice.module.GuiceSupportModule -> ru.vyarus.dropwizard.guice.module.installer.InstallerModule)

        1 error
        at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:470)
        at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:155)
        at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:107)
        at com.google.inject.Guice.createInjector(Guice.java:99)
        at ru.vyarus.dropwizard.guice.injector.DefaultInjectorFactory.createInjector(DefaultInjectorFactory.java:20)
        at ru.vyarus.dropwizard.guice.GuiceBundle.createInjector(GuiceBundle.java:191)
        at ru.vyarus.dropwizard.guice.GuiceBundle.run(GuiceBundle.java:138)
        at ru.vyarus.dropwizard.guice.GuiceBundle.run(GuiceBundle.java:93)
        at io.dropwizard.setup.Bootstrap.run(Bootstrap.java:200)
        at io.dropwizard.cli.EnvironmentCommand.run(EnvironmentCommand.java:42)
        at io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:85)
        at io.dropwizard.cli.Cli.run(Cli.java:75)
        at io.dropwizard.Application.run(Application.java:79)
        at com.phonepe.growth.App.main(App.java:48)

1 个答案:

答案 0 :(得分:1)

这实际上是guicey类路径扫描(.enableAutoConfig)中的错误。

您的应用程序类已被扫描覆盖,因此内部类也可见:从想法“托管”启动应用程序时,内部类(由编译器为new Managed() {...}创建)被检测并注册为扩展,也指在guice上下文中注册。但是guice无法实例化内部类并引发错误。

您可以使用.printLifecyclePhasesDetailed()启用额外的诊断消息(在guice捆绑包上),并看到从构思运行时确实出现了其他扩展名。

当然可以肯定,当您从maven运行应用程序时,它会先内置到jar中,然后启动。在这种情况下,类路径扫描的工作方式略有不同,并且看不到内部类(在jar内)。因此一切正常。

请注意,您不需要手动实例化和注册托管对象(和其他常见对象):您只需declare managed as a separate class,guicey就会找到它并正确注册(两者在guice和dropwizard)。这是expected way of extensions registrations,尤其是与类路径扫描一起使用。