2017-02-14 3 views
1

Ich kann die generierte JAR-Datei nicht mit meinem Spring-Boot mit Jersey-Projekt ausführen.Kann generierte Glas aus Spring-Boot Trikot nicht ausführen

Ausnahme, dass ich begegnet ist:

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 

Projekt ordnungsgemäß ausgeführt wird, wenn es über IDE (mit dem Hauptklasse) gemacht wird oder wenn der Frühling-Boot mit:

Hier sind die Details des aktuellen laufen Setup:

Verpackung:

jar 

Abhängigkeit:

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

mein Jersey-Konfiguration (ResourceConfig) gesetzt Pakete

@Component 
public class JerseyConfiguration extends ResourceConfig { 

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

} 

Feder-boot-Maven-Plugin scannen konfiguriert als: org.springframework.boot

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

I verwendete auch nicht den Spring-Boot-Starter-Parent, sondern fügte die Spring-Boot-Abhängigkeiten wie in den Dokumenten angegeben hinzu.

+0

Welchen Befehl führen Sie aus, um das generierte jar auszuführen? * Und posten Sie bitte alle Ausnahmeprotokolle *. –

+0

java -jar myjarfile.jar auch mein Anwendungsfall ist ähnlich zu diesem: https://github.com/spring-projects/spring-boot/issues/3528 – geneqew

+0

Haben Sie 'MANIFEST.MF' Datei in Ihrem Projekt ? –

Antwort

0

Dies ist eher eine Problemumgehung als eine tatsächlich gültige Lösung für die Verwendung von -Paketen (true, "my.package");

in Bezug auf Anton Antwort, ließ ich mich mit dieser Lösung mit der Einschränkung, dass es Ressourcen mit Klassenstufe @Path oder @Provider Anmerkung erfordert:

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

Ich kam zu der gleichen Lösung (zuvor beantwortet hier: http://stackoverflow.com/a/42281515/1732450). Die Annotationen "@ Path" und "@ Provider" auf Klassenebene sind keine echten Einschränkungen. Siehe die Quelle von 'org.glassfish.jersey.server.internal.scanning.AnnotationAcceptingListener'. Es ist die Bestandslösung und es scannt auch nach den gleichen Klassen wie die Problemumgehung. – mihu86

0

Ich hatte dieses Problem, ich wollte nicht komplizieren Dinge zu viel, so dass ich nur alle meine Jersey-Controller einzeln registriert.

@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); 

} 

HINWEIS: Ich würde nicht mit vielen Dateien für große Projekte empfehlen, wird es sehr schnell zu lang und nicht lesbar und langwierig zu halten. Das heißt, es ist eine funktionierende Lösung und Sie können Ihr Glas mit dem üblichen java -jar my-project.jar Befehl ausführen.

Verwandte Themen