Spring Jet应用程序打包为部署在Jetty 9.2上的WAR

时间:2016-01-27 13:18:12

标签: java hibernate spring-boot jetty

我创建了一个Spring Boot应用程序。它在独立模式下正常运行。我的下一步是生成一个可以由嵌入式Jetty Server实例(版本9.2)加载的WAR文件。

我设法生成一个WAR文件。但是,默认情况下不会解释Spring Boot注释并且Spring Boot本身没有加载(即当我打开与应用程序关联的URL时,会列出WAR文件)。

我发现启动Spring Boot的一种方法是在 WEB-INF 中添加 web.xml 文件,其中包含启用组件的应用程序上下文扫描。这样,Spring Boot由嵌入式Jetty服务器加载。但是,看起来某些应用程序属性(来自 META-INFO / application.properties 文件)未被评估:例如spring.jpa.hibernate.ddl-auto=update无效,而create-drop则被使用。

我能够重新配置一些bean来使一些应用程序属性工作,但不是最后一个与hibernate相关的。看起来所有Spring自动配置都没有启用。

是否有意义将Spring启动应用程序打包为部署在Jetty上的WAR而不使用 web.xml 或至少使用通用配置启用所有Spring自动配置?

以下是与创建嵌入式Jetty服务器相关的代码:

Server server = createHttpServer(properties, restPort, httpsEnabled);
server.setStopAtShutdown(true);

HandlerList handlerList = new HandlerList();
addWarsToHandlerList(handlerList);
server.setHandler(handlerList);
server.start();

方法addWarsToHandlerList只是调用以下方法,以便在应用服务器上部署所有WAR存档:

private static void addWarFile(HandlerList handlerList, File file) {
    String contextPath = "/" + FilenameUtils.getBaseName(file.getName());
    WebAppContext webApp = createWebAppContext(contextPath);
    webApp.setWar(file.getAbsolutePath());
    handlerList.addHandler(webApp);
    logger.debug("Deploying " + contextPath + " using war file " + file);
}

此后,Web配置。首先是我的 web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextAttribute</param-name>
            <param-value>org.springframework.web.context.WebApplicationContext.ROOT</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

以及前一个使用的 applicationContext.xml 文件:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.2.xsd">

    <context:component-scan base-package="my.package"/>

    <bean id="appConfigProperties"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:application.properties"/>
    </bean>

    <bean id="filterMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="100000000"/>
    </bean>

</beans>

欢迎任何评论,建议等。

1 个答案:

答案 0 :(得分:0)

加载了Spring自动配置,但application.properties文件没有加载。解决方案是将@PropertySource与我的应用程序类一起使用:

@PropertySource("classpath:application.properties") public class Application extends WebMvcConfigurerAdapter { ... }