在Tomcat中使用Spring RESTful服务的WAR而不是JAR

19

我正在使用Java Spring创建一个REST Web服务。我已经成功加载了STS并使用以下详细说明中的示例:

"本指南将带您完成使用Spring创建“Hello World” RESTful Web服务的过程。" http://spring.io/guides/gs/rest-service/

然而,该教程只有这么多......我想创建一个WAR文件,而不是包含Servlet的自运行JAR,并部署该WAR文件。然后,我找到了这个教程,并尝试修改第一个教程的build.gradle文件。

"将Spring Boot JAR应用程序转换为WAR" http://spring.io/guides/gs/convert-jar-to-war/

它似乎构建成了一个.war文件……服务正在我的TOMCAT实例的管理器中运行……但是一旦我尝试使用该服务,就会出现404错误。

URL 404'd

http://localhost:8080/gs-rest-service-0.1.0/dbgreeting?name=MyName

我需要修改映射吗?

DataBaseController.java

@RequestMapping("/dbgreeting")
    public @ResponseBody DataBaseGreeter dbgreeting(
            @RequestParam(value="name", required=false, defaultValue="World") String name) {
        return new DataBaseGreeter(counter.incrementAndGet(),String.format(template, name));
    }

现在我已经根据一些混合的东西创建了.war文件,并担心我可能漏掉了某些东西。

后来我发现OSX上的XAMPP没有webapp/文件夹,这迫使我加载Bitnami的Tomcat堆栈。人们通常会基于此在XAMPP和其他堆栈之间切换吗?还是我错过了在XAMPP中创建webapp文件夹的步骤?


应用程序部署成功了吗?Tomcat日志中有任何错误信息吗? - samlewis
我能看到应用程序正在“运行”。这个应用程序作为一个.jar文件也非常好用。我会检查一下日志,以防万一。 - Erik
1
请将您的答案发布为答案。然后选择您的答案。 - Ammar
实际上,这并不是完全必要的。只需在configure方法上面添加public static void main(String[] args) { SpringApplication.run(Application.class, args); }方法即可。 :) - Pierre
3个回答

6
一个WAR文件其实就是一个带有特殊属性的JAR文件。它需要有一个WEB-INF文件夹,其中需要一个web.xml文件来描述你的部署情况,还需要一些应用服务器相关的XML配置文件,通常还会包含lib、classes和其他一些杂项。
最简单的方法是使用Maven创建你的WAR文件。我认为你只需要在pom.xml中将项目类型从JAR改成WAR即可。你所遵循的教程似乎使用了Gradle,而Gradle又使用了Maven,所以你应该可以找到其中的一个。除此之外,你可以搜索一些关于如何构建WAR文件的教程。我认为Tomcat不需要任何特殊的部署描述符,所以你只需要一个web.xml文件即可。

2
我只想澄清一下,在Servlet 3.0中,web.xml文件是可选的。 - Luciano
1
我认为将Spring Boot Jar项目转换为War的最简单方法是使用@Erik遵循的说明。 - samlewis
3
“Gradle使用Maven,我相信。” 我不认为这是正确的,它仅提供了Maven的许多功能。 - Erik
1
我自己也是Gradle的新手,只是因为正在调查Spring Boot而深入研究它。但是我可以肯定地告诉你,在我的Spring Boot应用程序中,确实有一个pom.xml文件。我对build.gradle文件所做的更改会被推送到pom.xml文件中。再次强调,我只是根据观察所得做出这个陈述,因为我并不是Gradle的专家。 - CodeChimp
很酷……很高兴它运行成功了。不过要小心,因为我认为非XML Web应用程序配置是最新的Servlet规范的一部分,所以根据您使用的应用服务器,它可能无法正常工作。 - CodeChimp

3

(OP的答案从问题移至此处)

我感觉自己真的很蠢..在更改gradle说明后,发现教程还有更多内容..其中包括非常需要的自动配置,它超越/替代了对web.xml的需求

解决方案

初始化servlet

以前,该应用程序包含一个public static void main()方法,当使用java -jar命令时,spring-boot-gradle-plugin会配置其运行。

通过将其转换为没有XML文件的WAR文件,您需要向servlet容器发送不同的信号,以指示如何启动应用程序。

src/main/java/hello/HelloWebXml.java

package hello;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.SpringBootServletInitializer;

public class HelloWebXml extends SpringBootServletInitializer {

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

}

第一个回答会得到赞赏,但你们两个都是正确的,web.xml文件(或Spring-Boot用来替代它的)是必需的。


1
我希望在启动Spring Boot应用程序时能看到一些INFO输出,以下是一些想法:
尝试使用常规的Tomcat实例
1. 下载并提取 zip distribution。 2. 使用bin/startup.sh启动Tomcat。 3. 将您的war文件复制到webapps目录中。 4. 检查日志...希望看到一些Spring启动的证据。
手动检查war文件
1. 解压缩您的war文件。 2. 期望看到WEB-INF/web.xml。

没有web.xml文件。我将按照第二个教程进行,不偏离主题...但我认为将这两个混合在一起并不太好。 - Erik
查看我的编辑解决方案... 实质上,我缺少了 Spring-Boot 创建其 web.xml 所需的内容。 - Erik

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