Spring RESTful 服务作为 WAR 而不是 Tomcat 中的 JAR

Posted

技术标签:

【中文标题】Spring RESTful 服务作为 WAR 而不是 Tomcat 中的 JAR【英文标题】:Spring RESTful Service as a WAR instead of JAR in Tomcat 【发布时间】:2013-11-18 03:49:16 【问题描述】:

我正在使用 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 日志中是否有任何错误消息。 我可以看到应用程序正在“运行”,是的。我也让这个应用程序作为 .jar 工作得很好。我会检查日志以防万一。 请将您的答案作为答案发布。然后选择你的答案。 其实也不是完全需要的。在配置上方添加public static void main(String[] args) SpringApplication.run(Application.class, args); 方法。 :) 【参考方案1】:

WAR 只是一个具有特殊属性的 JAR。它需要有一个 WEB-INF,在它下面你需要一个 web.xml 来描述你的部署,任何依赖于应用服务器的 XML 配置文件,通常还有一个 lib、类和其他零碎的东西。

最简单的方法是使用 Maven 创建您的 WAR。我认为您应该能够简单地将 pom.xml 中的项目类型从 JAR 更改为 WAR。您遵循的教程似乎使用了 Gradle,而我相信它又使用了 Maven,因此您应该在某个地方拥有一个。除此之外,谷歌有关如何构建 WAR 的教程。我不相信 Tomcat 需要任何特殊的部署描述符,所以你应该只需要 web .xml。

【讨论】:

我只是想澄清一下,在 Servlet 3.0 中,web.xml 文件是可选的。 我认为将 Spring Boot jar 项目转换为战争的最简单方法是使用 @Erik 遵循的说明。 “Gradle,我相信它反过来使用 Maven”我认为这不是真的.. 它只是为您提供了 Maven 所做的很多事情。 我自己是 Gradle 新手,只是在研究 Spring Boot 时才深入研究它。但我绝对可以在我的 Spring Boot 应用程序中告诉你,那里有一个 pom.xml。我对 build.gradle 对依赖项所做的更改被推送到 pom.xml 中。再说一次,我只是根据我的观察发表了这个声明,因为我不是 Gradle 专家。 酷豆...很高兴它成功了。不过要小心,因为我认为非 XML Web 应用程序配置是最新 Servlet 规范的一部分,因此根据您使用的应用程序服务器,它可能无法正常工作。【参考方案2】:

(OP 的答案从问题移到了这里)

男孩,我真的很愚蠢.. 在更改 gradle 指令后发现教程还有更多内容.. 包括非常需要的自动配置,它取代/取代了对 web.xml 的需求

解决方案

初始化小服务程序

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

通过将其转换为没有 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 用来替换它的东西)是正确的。

【讨论】:

【参考方案3】:

我希望在 Spring Boot 应用程序启动时看到一些 INFO 输出,所以一些想法是:

试试普通的 tomcat 实例

下载并解压zip distribution。 用bin/startup.sh启动tomcat 将你的战争复制到webapps目录 检查日志...希望看到一些春天启动的证据

手动检查war文件

解压你的war文件 期待看到WEB-INF/web.xml

【讨论】:

不存在 web.xml。我将在不偏离的情况下完成第二个教程。但我认为将这两者混合在一起不太奏效。 查看我的编辑以获取解决方案.. 基本上我错过了 Spring-Boot 创建 web.xml 所需的内容。

以上是关于Spring RESTful 服务作为 WAR 而不是 Tomcat 中的 JAR的主要内容,如果未能解决你的问题,请参考以下文章

更新 Spring Boot 以生成 WAR 文件而不是 JAR 文件

Spring Security 和无状态的 Restful 服务

Web 服务作为 JAR 文件,还是另一个 WAR 中的 WAR?

基于guiceresteasymybatis和undertow实现的轻量级restful服务

具有多个参数的 RESTful Spring 服务

Spring Security 认证 RESTful Web 服务