James
James

Reputation: 83

Spring boot WAR deployed to Tomcat and missing context for static resources

I'm having a problem when deploying a Spring Boot application as a WAR file to a standalone Tomcat 7 server. It builds and deploys fine but when the index.html page tries to load other static resources they are missing the context in the url so fail to load (404).

e.g. http://localhost:8080/app/images/springboot.png

should be: http://localhost:8080/spring-boot-war-context-issue/app/images/springboot.png

Image showing issue

It works fine when using the embedded Tomcat

Similar issues:

Seems to be a similar issue to: Spring-Boot war external Tomcat context path

However the suggestions in that question did not seem to solve my issue. I wasn't sure about the Tomcat xml file.

Steps followed:

I created a simple sample application and followed the steps in the Spring Boot docs.

The sample code can be seen in this github repo along with steps to reproduce the problem: https://github.com/jgraham0325/spring-boot-war-context-issue

Things I've tried so far:

Contents of spring-boot-war-context-issue.xml:

    <Context 
    docBase="spring-boot-war-context-issue" 
    path="spring-boot-war-context-issue" 
    reloadable="true" 
    />

Any advice would be much appreciated!

Thanks

Update 23/10/2016:

Alex's answer below about using relative URLs without the slash at the start was perfect solution!

Upvotes: 3

Views: 4727

Answers (2)

Somebody
Somebody

Reputation: 2779

If using Thymeleaf, another way is using Context-Relative URLs like below:

<link rel="icon" type="image" th:href="@{/img/favicon.ico}"/>

For more information please refer to: Thymeleaf Documentation

Upvotes: 0

alexbt
alexbt

Reputation: 17045

Isn't it simply caused by the way you defined your url in index.html (the url does not include the context root):

<img src="/app/images/springboot.png" />

Use relative uri

You should be able to use a relative uri (without the leading forward slash):

<img src="app/images/springboot.png" />

get the context root

With JSP/JSTL:

<img src="${pageContext.request.contextPath}/app/images/springboot.png" />

Or with Javascript:

function getContextPath() {
   return window.location.pathname.substring(0,  window.location.pathname.indexOf("/",2));
}
...
var img = new Image();
img.src = getContextPath() + "/app/images/springboot.png";
document.getElementById('div').appendChild(img);

Upvotes: 3

Related Questions