2016-11-16 1 views
1

Ich habe meine Feder Boot-Anwendung unter Verwendung von sbt Montag verpackt und bei dem Versuch, das Glas laufen ichFederschuh mit sbt: Kann nicht starten EmbeddedWebApplicationContext aufgrund EmbeddedServletContainerFactory fehlt

Application startup failed 
org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is 
    org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean. 

Das Projekt arbeitet in IntelliJ ganz gut erhalten. Mein build.sbt unter

lazy val news = (project in file("wherever")). 
enablePlugins(DockerPlugin). 
settings(commonSettings: _*). 
settings(
    name := "name", 
    mainClass in assembly := Some("mainEntry"), 
    test in assembly := {}, 
    assemblyJarName := "jarName", 
    libraryDependencies ++= dependency1, 
    libraryDependencies ++= dependency2, 
    libraryDependencies += ScalaTest, 
    scalaSource in Compile := baseDirectory.value/"src/main/scala", 
    dockerfile in docker := { 
    val artifact: File = assembly.value 
    val artifactTargetPath = "/" 
    new Dockerfile { 
     from("openjdk:8-jre-alpine") 
     add(artifact, artifactTargetPath) 
     add(new File("./config/"),"/config") 
     cmd("java", "-jar", " -Denv=$env","jarName") 
     env("env","stage") 
    } 
    }, 
    imageNames in docker := Seq(
    ImageName("imageName") 
) 
) 

ich einige Graben um getan haben und es sieht aus wie Spring Boot requires the jar to contain nested jars (anstelle eines Uber Glas wie mit sbt Baugruppe erstellt wird). Also, das gibt mir zwei Möglichkeiten. Packen Sie mein Jar als verschachteltes Jar mit sbt oder konfigurieren Sie Spring, um einen normalen Classloader zu verwenden und von einem Uber-Jar zu laden.

Ich habe in verschachtelte jar sbt plugins untersucht und ich kann scheinbar nichts finden, was beibehalten wird (oder sogar in maven central). This und this sind beide Jahre veraltet und nicht in Maven Central. Hat jemand Vorschläge dafür?

Ich habe auch in die Konfiguration von Spring-Boot untersucht, um Uber-Gläser zu verwenden, und die überwältigende Antwort ist nur "Verwenden Sie das Maven-Plugin", das hier nicht anwendbar ist.

Antwort

0

Sie müssen eine eingebettete Servlet-Container-Factory in der Anwendung bereitstellen. Es sollte in etwa wie folgt aussehen:

import org.springframework.boot.SpringApplication 
import org.springframework.boot.autoconfigure.SpringBootApplication 
import org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration 
import org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainerFactory 
import org.springframework.boot.context.web.SpringBootServletInitializer 
import org.springframework.context.annotation.{Bean, ComponentScan, Configuration, PropertySource} 

/** 
* Spring boot application configuration and servlet initializer. 
*/ 
@Configuration 
@ComponentScan(value = Array("com.foobusiness.foopackage")) 
@PropertySource(Array("classpath:application.properties")) 
@SpringBootApplication(exclude = Array(classOf[ErrorMvcAutoConfiguration])) 
class Application extends SpringBootServletInitializer { 
    @Bean 
    def servletContainer: JettyEmbeddedServletContainerFactory = new JettyEmbeddedServletContainerFactory() 
} 

object Application { 
    def main(args: Array[String]): Unit = { 
    SpringApplication run classOf[Application] 
    } 
} 

Die obige Jetty verwendet, offensichtlich, was bedeutet, dass Sie auch die jetty-runner als Bibliothek Kompilierung-Abhängigkeit umfassen brauchen würde. Ihre sbt-Build-Datei muss auch die obige Klasse verwenden beim Kompilieren, Laufen oder Verpackung:

mainClass in(Compile, run, packageBin) := Some("com.foobusiness.foopackage.Application"), 

Die Anwendung kann mit sbt run

von der Kommandozeile ausgeführt werden
Verwandte Themen