【问题标题】:Spring boot deployed on Tomcat 8 having structure or application context issues部署在 Tomcat 8 上的 Spring Boot 存在结构或应用程序上下文问题
【发布时间】:2016-11-04 02:15:25
【问题描述】:

我有一个简单的 Spring Boot 应用程序,我可以使用 URL http://localhost:8080/#/appName 在本地运行它。这是我的应用结构

当我将其打包为战争并尝试将其部署在 linux 服务器中时,我无法使用能够在本地加载的相同上下文 (http://SERVERNAME:PORT/#/appName) 加载应用程序。我想我错过了什么,有人可以指导我。

这是部署到tomcat服务器后的应用结构。

WEB-INF/classes/目录下,内容如下。

【问题讨论】:

  • 当您说“在本地运行”时,您使用的是嵌入式容器吗?或者是本地的tomcat安装?如果您不使用嵌入式容器,则应用程序上下文由容器而不是应用程序处理。在 tomcat 中,默认情况下它是战争名称。如果您在嵌入式容器中运行 Spring Boot 应用程序,您可以在 application.properties 文件中使用“server.context-path”指定上下文
  • 我的意思是它在嵌入式容器中工作。后来我创建了war并尝试将其部署在远程Tomcat服务器中。它使用我的帖子中提到的不同目录结构进行部署。这就是我被阻止的地方,不知道如何点击应用程序
  • 我只是更改了主类以扩展 SpringBootServletInitializer 并将其打包为 war,然后将其作为 abc.war 部署到 Tomcat 实例。然后后来我尝试使用server:port/#/abc,因为我曾经在我的本地访问相同的localhost:8080/#/abc 仅供参考,我包含了 pom.xml 中提供的依赖项 spring-boot-starter-tomcat

标签: angularjs tomcat spring-boot


【解决方案1】:

Spring boot 部署到 tomcat 容器时,默认情况下会将其上下文根作为其战争名称。假设您在端口 8080 上的“localhost”安装了 tomcat。您部署了名为“abc.war”的战争,这意味着您将其放入 webapps 目录。该应用程序的主文件夹为“abc”,其他文件夹(WEB-INF、META-INF 等)位于其中。该特定应用程序的上下文根现在将是

http://localhost:8080/abc

如果您的应用程序有一个端点路径为“cde/fg”,那么将上下文根添加到此路径后,整个 url 将是

http://localhost:8080/abc/cde/fg

但是,如果您在一个嵌入式容器中运行 完全相同 spring boot 应用程序,该容器在端口 8080 上的“localhost”上运行,(并假设 application.properties没有提到 server.context-path ),那么嵌入式容器中的上述端点将是

http://localhost:8080/cde/fg

然后将应用程序部署在容器的根上下文中。

我认为这种细微的差异是您所缺少的。如果我的猜测是正确的,那么在您在 tomcat 容器中部署之后,只需像这样将战争名称添加到 url -

http://SERVERNAME:PORT/{warname}/#/appName

【讨论】:

  • 我完全同意你的观点,我也做了同样的事情。当我使用嵌入式容器在本地运行应用程序时,我使用 URL localhost:8080/#/abc 运行它。在远程 Tomcat 实例中,我部署的战争是 abc.war,我的路由由 AngularJS 控制。因此,我使用 URL server:8081/abc/#/abc FYI 访问应用程序,我的 spring 控制器用 @RestController 注释
  • 有人可以在这里点灯吗?
  • 我认为它没有识别位于 resources/static/index.html 中的 index.html。它是 index.html 的正确位置还是我应该将它放在其他地方。我尝试将它放在 /WEB-INF/classes 下,但仍然没有用。按照我的预期,index.html 应该默认加载,Angular 会根据导航添加其他路由
  • 如果有人遇到类似的问题,那么我就是这样做的。我不确定这是否是正确的方法,但它有效。我必须在 'src/main/' 中创建一个目录 'webapp' 并将我的所有静态内容移动到该目录中。然后后来通过servername:port{{warname}}/{{endpoint}}访问了我的应用程序。成功了
  • 你遇到过this吗?
猜你喜欢
  • 2019-08-03
  • 2019-04-30
  • 2017-12-17
  • 2020-06-27
  • 1970-01-01
  • 2016-01-16
  • 2017-04-01
  • 1970-01-01
  • 2019-01-17
相关资源
最近更新 更多