Проект успешно запущен с использованием maven, но завершился неудачно при работе с intellij - PullRequest
0 голосов
/ 26 октября 2018

Я создаю управляемый объект внутри App.java (который является основным классом моего модуля).Я использую библиотеку guice с платформой dropwizard и получаю это исключение только при работе с IntelliJ, если я запускаю тот же код с mvn, он прекрасно работает, что странно и выходит за рамки моей теории.Так что, если кто-то испытал что-то подобное или имеет какую-то теорию за этим, пожалуйста, поделитесь.не стесняйтесь спрашивать любую деталь.

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

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

Исключение трассировки стека: -

  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 голосов
/ 26 октября 2018

На самом деле это ошибка в обычном сканировании пути к классам (.enableAutoConfig).

Ваш класс приложения покрыт сканированием, поэтому внутренние классы также видны: когда вы запускаете приложение из идеи, «управляемый» внутренний класс (созданный компилятором для new Managed() {...}) обнаруживается и регистрируется как расширениечто также означает регистрацию в контексте контекста.Но guice не может создать экземпляр внутреннего класса и выдает ошибку.

Вы можете включить дополнительные диагностические сообщения с помощью .printLifecyclePhasesDetailed() (в связке guice) и увидеть, что дополнительное расширение действительно появляется при запуске из идеи.

Скорее всего, когда вы запускаете приложение из maven, оно сначала встраивается в jar, а затем запускается.В этом случае сканирование classpath работает немного по-другому и не видит внутренние классы (внутри jar) .. поэтому все работает.

Обратите внимание , что вам не нужно создавать экземпляры изарегистрируйте управляемый объект (и другие общие объекты) вручную: вы можете просто объявить управляемый как отдельный класс , и guicey найдет его и правильно зарегистрирует (как в guice, так и в dropwizard).Это ожидаемый способ регистрации расширений , особенно вместе с проверкой пути к классам.

...