在Tomcat中部署Spring-Boot WAR时崩溃

3

我成功地使用java -jar命令运行了一个spring-boot Web应用程序。但是,当将pom.xml中的打包字段更改为war并将其构建为war时,在Tomcat 7中无法运行。

我修改了pom.xml中的parent标签:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>0.5.0.M7</version>
</parent>

并且:
public class ApplicationWebXml extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(
            SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

}

我收到的错误信息是:
INFO: Deploying web application archive /home/ichsan/coding/java/tools/apache-tomcat-7.0.39/webapps/hello.war
Jan 4, 2014 10:18:50 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(/home/ichsan/coding/java/tools/apache-tomcat-7.0.39/webapps/hello/WEB-INF/lib/tomcat-embed-core-7.0.47.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
Jan 4, 2014 10:18:50 PM org.apache.catalina.startup.ContextConfig getServletContainerInitializer
SEVERE: The ServletContentInitializer [org.apache.tomcat.websocket.server.WsSci] could not be created
java.lang.ClassNotFoundException: org.apache.tomcat.websocket.server.WsSci
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1713)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1558)

我的问题是:

  1. 这里发生了什么,如何克服这个问题?
  2. 使用spring-boot真的安全吗?因为嵌入式服务器库似乎影响其部署到j2ee容器的可靠性。我知道,它仍处于里程碑版本。

哪个版本的Tomcat?看起来是不支持正确的Websockets的版本。 - Boris the Spider
3个回答

7

请在您的pom.xml中添加以下内容:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

这将确保在部署到服务器时,不会为您的Web应用程序提供嵌入式的Tomcat服务器。

3
这个WAR文件看起来有问题(嵌入式Tomcat JAR文件根本不应该在WEB-INF/lib中)。您需要在构建配置中将Tomcat嵌入式JAR标记为scope=providedGS转换JAR为WAR指南是标准配置选项的好参考,Spring Boot代码库中还有几个示例。
如果您的应用程序没有使用Tomcat的Web Socket功能,则仍应使用旧版本(因此请随时在github上提出问题)。对您最简单的解决方法就是升级Tomcat(7.0.47应该可以工作)。

0
使用Gradle中的providedRuntime将Tomcat JAR文件移动到WEB-INF/lib-provided文件夹中,这是Gradle文档推荐的做法。
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接