无法将Spring Boot应用程序部署到Azure

5
我无法让我的Spring Boot网站在Azure Web实例上响应。我已经按照Java应用程序说明上传说明进行了操作。似乎IIS服务器正在接收请求,但war中的servlet没有响应。根据文档,有一些需要注意的地方。特别是,web.config应该部署到wwwroot并指定java路径以及转发端口。我相信我已经涵盖了这些基础知识 - 我的web.config如下所示。
我尝试从市场部署tomcat服务器,那很好用。当我替换我的war文件和web.config时,spring boot应用程序不起作用。
有趣的信息之一是HTTP_PLATFORM_PORT环境变量似乎未定义。
应用设置:

app settings

Azure控制台信息(环境变量和Web.config):
D:\home\site\wwwroot

> dir
D:\home\site\wwwroot
Volume in drive D is Windows
 Volume Serial Number is 789E-197B

 Directory of D:\home\site\wwwroot

03/01/2016  02:14 AM    <DIR>          .
03/01/2016  02:14 AM    <DIR>          ..
02/29/2016  08:15 PM    <DIR>          bin
03/01/2016  01:49 AM         8,771,899 web-0.0.1-SNAPSHOT.war
03/01/2016  02:10 AM               496 web.config
03/01/2016  02:08 AM               496 web.custom.config
03/01/2016  01:54 AM             4,868 web.tomcat.config
03/01/2016  02:14 AM    <DIR>          webapps



> echo %java_home%
D:\home\site\wwwroot
D:\Program Files\Java\jdk1.8.0_60


> echo %http_platform_port%
D:\home\site\wwwroot
%http_platform_port%


> cat web.config
D:\home\site\wwwroot
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
    </handlers>
    <httpPlatform processPath="%JAVA_HOME%\bin\java.exe"
        arguments="-Djava.net.preferIPv4Stack=true -Dserver.port=%HTTP_PLATFORM_PORT% -jar &quot;%HOME%\site\wwwroot\web-0.0.1-SNAPSHOT.war&quot;">
    </httpPlatform>
  </system.webServer>
</configuration>

1
正确的路径是site/wwwroot。使用在Azure门户中配置的Web应用程序的ftp凭据。这里解释了web.config: https://azure.microsoft.com/en-us/documentation/articles/web-sites-java-custom-upload/ 我的web.config基本上与该页面上显示的springboot应用程序的配置文件相同。发生的情况是,您启动一个自定义Http模块来运行您的jar文件。 - Brett
非常感谢!还有一个问题,我不明白如何启动自定义的 Http 模块,我是 Azure 和这些东西的新手,顺便说一下,我也有一个 SpringBoot 应用程序。很抱歉给您留言造成麻烦:( - SeleM
1
那个经历促使我写下这个问题。在我的情况下,我部署了一个“thin jar”。如果你正在使用gradle,你必须用'gradle build'而不是'gradle jar'来构建Java应用程序。你需要一个包含所有依赖项的jar文件。 - Brett
你所说的“启动一个自定义的Http模块来运行你的jar包”,也许解决方案就在这里? - SeleM
非常感谢您的快速回复,问题出在Java版本上,我将其从8切换到7,虽然速度很慢,但它可以工作!谢谢。 - SeleM
显示剩余4条评论
4个回答

5

这句话应该改成可执行的JAR文件,而不是WAR文件吧?你可以只用安装JDK 8就能运行Spring Boot JAR文件,但是需要Java EE 应用服务器才能部署WAR文件。

我不知道什么是web.config文件,我使用Cloud Foundry。我只需要一个JAR文件,一个用于配置的.yml文件和一个JDK。Spring Boot JAR文件应该包含整个应用程序和其依赖项。我使用Maven创建这个fat JAR文件。


“Fat jar” 是关键。使用 “gradle build” 就可以搞定了。不起作用的 Gradle 命令有: “gradle jar” 和 “gradle war”。再次感谢。 - Brett
在https://azure.microsoft.com/en-us/documentation/articles/web-sites-java-custom-upload/#springboot中,您可以找到web.config文件以及部署它的说明。@duffymo也许您想将其添加到您的答案中。 - PhoneixS
那不是我的答案。请提供您自己的答案。我不使用Azure。 - duffymo

3
我个人的建议,希望能帮助某些人节省几个小时的时间。我试图通过Kudo界面将Spring Boot REST服务部署到Azure API App实例中,并成功完成了操作。
我正在将WAR文件部署到API App服务中。该API App服务是在Azure门户中创建的,所有应用程序设置均保留为默认设置。除了设置Java版本和Web容器之外,没有更改其他设置。

enter image description here

我在Eclipse中从Maven项目编译了一个War文件,然后将War文件重命名为ROOT.war。使用Kudo控制台,我将War文件放置在webapps文件夹下。请注意,我删除了/webapps/ROOT/文件夹的内容。我不需要添加web.config文件。我拖动War文件并上传它。但是,如果您将其拖到“蓝色框”上,它将解压War文件,这会导致服务失败。

enter image description here

如果您将war文件放在蓝色框之外的其他位置,则该文件不会被解压缩。

enter image description here

我随后重新启动了服务,等待了一分钟,然后通过Azure网址成功访问。


只是好奇,您如何在Spring Boot属性中设置“server.port”,或者这很重要吗? - Abhishek Dujari
1
在application.properties文件中:server.port=端口号 - BgRva
感谢你回来并回复 :) 很惊讶在 Azure 文档中没有提到这个环境变量。我实际上将其强制为 8080 并似乎工作正常。当然,我硬编码是错误的。你的回答给了我正确的方向,通过你的帮助,我已经成功让 war 格式工作了。 - Abhishek Dujari

0

根据我的经验,在Azure上部署Spring Boot应用程序的简单方法是创建一个包含Tomcat的Web应用程序,并参考Spring官方文档如何创建可部署的war文件创建war文件,然后通过FTP或Kudu控制台将其部署到路径wwwroot\webapps

如果您有现有的Spring Boot Jar应用程序,可以参考其他Spring文档将Spring Boot JAR应用程序转换为WAR将jar文件转换为war文件,然后简单地在Azure WebApp上部署它。

您的情况与SO线程Spring Boot War deployed to Tomcat非常相似。


0

确保你的项目中有ServletInitializer类。

如果不存在,你可以添加这个类。

public class ServletInitializer extends SpringBootServletInitializer {

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

}


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