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的主要内容,如果未能解决你的问题,请参考以下文章