2017-02-14 7 views
1

Im не удалось запустить созданный файл jar с моей весенней загрузкой с проектом трикотажа.Невозможно запустить сгенерированную банку из майки с пружинным ботинком

исключение, которое я столкнуться является:

Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration': Unsatisfied dependency expressed through constructor parameter 1 

Проект работает должным образом, когда это делается с помощью IDE (работает главный класс) или при использовании пружинного загрузки: запустить

Вот подробности тока установка:

Упаковка:

jar 

зависимость:

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-jersey</artifactId> 
    <version>1.5.1.RELEASE</version> 
</dependency> 

моя конфигурация Джерси (ResourceConfig) устанавливается для сканирования пакеты

@Component 
public class JerseyConfiguration extends ResourceConfig { 

    public JerseyConfiguration() { 
     packages(true, "com.my.base.jaxrs.packages"); 
    } 

} 

весна-загрузки Maven-плагин настроен как: org.springframework.boot

<artifactId>spring-boot-maven-plugin</artifactId> 
    <executions> 
    <execution> 
     <goals> 
     <goal>repackage</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 

I также не использовал родительский родитель-родитель, но добавил зависимые от пружины загрузки, как указано в документах.

+0

Какую команду вы выполнить пытаетесь запустить сгенерированный баночку? * И, пожалуйста, опубликуйте журнал исключений *. –

+0

java -jar myjarfile.jar также мой пример использования похож на этот: https://github.com/spring-projects/spring-boot/issues/3528 – geneqew

+0

У вас есть файл 'MANIFEST.MF' в вашем проекте ? –

ответ

0

Это более обходное решение, чем действительное действительное решение для использования пакетов (true, "my.package");

со ссылкой на ответ Антона, я поселился с этим решением, с тем ограничением, что он требует ресурсов с @Path уровня класса или @Provider аннотацией:

ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false); 
     provider.addIncludeFilter(new AnnotationTypeFilter(Path.class)); 
     provider.addIncludeFilter(new AnnotationTypeFilter(Provider.class)); 
     provider.findCandidateComponents("my.package.here").forEach(beanDefinition -> { 
      try { 
       LOGGER.info("registering {} to jersey config", beanDefinition.getBeanClassName()); 
       register(Class.forName(beanDefinition.getBeanClassName())); 
      } catch (ClassNotFoundException e) { 
       LOGGER.warn("Failed to register: {}", beanDefinition.getBeanClassName()); 
      } 
     }); 
+1

Я пришел к тому же решению (ранее ответ на этот вопрос: http://stackoverflow.com/a/42281515/1732450). Аннотации уровня @ @ Path и '@ Provider' не являются реальными ограничениями. См. Источник 'org.glassfish.jersey.server.internal.scanning.AnnotationAcceptingListener'. Это основное решение, и оно также сканирует те же классы, что и обходной путь. – mihu86

0

я эта проблема, я не хотел усложнять слишком много, поэтому я просто зарегистрировал все свои контроллеры джерси в отдельности.

@Configuration 
public class JerseyConfig extends ResourceConfig { 

    JerseyConfig() { 

     // my old version that does not play well with spring boot fat jar   
     /* 
      packages(
        "com.mycompany.api.resources"   
      ); 
     */ 

     register(com.mycompany.api.resources.FooController.class); 
     register(com.mycompany.api.resources.BarController.class); 

} 

Примечания: Я бы не рекомендовал это для крупных проектов с большим количеством файлов, он будет очень быстро становится длинным и нечитаемым, и утомительно для поддержания. Тем не менее, это рабочее решение, и вы сможете запустить свою банку с помощью обычной команды java -jar my-project.jar.

Смежные вопросы