Reputation: 83
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
It works fine when using the embedded Tomcat
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.
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
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
Alex's answer below about using relative URLs without the slash at the start was perfect solution!
Upvotes: 3
Views: 4727
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
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" />
You should be able to use a relative uri (without the leading forward slash):
<img src="app/images/springboot.png" />
How do you get the contextPath from JavaScript, the right way?
How to use relative paths without including the context root name?
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