如何让JSF在Docker容器中使用spring-boot应用程序?
我有一个使用spring-boot 1.4.0和JSF 2.2(Mojarra 2.2.13)在embedded式tomcat(8.5)上运行的应用程序。
当我在本地运行应用程序时,它工作正常 – 不pipe我是否从IDE启动它,使用mvn spring-boot:run
或java -jar target/myapp.jar
但是,当我启动Docker容器内的应用程序(使用docker 1.12.1)时, 除 JSF页面外 ,其他所有工作都可以使用。 例如,spring / boot-actuator页面/health
工作就好,但是当试图访问/home.xhtml
(一个JSF页面)时,我得到:
白标签错误页面
此应用程序没有明确的映射/error
,所以你看到这是一个后备。
Wed Oct 12 09:33:33 GMT 2016有一个意外的错误(type = Not Found,status = 404)。 /home.xhtml Not Found in ExternalContext as a Resource
我使用io.fabric8:docker-maven-plugin
构buildio.fabric8:docker-maven-plugin
镜像(基于alpine with openjdk-8-jre),其中包括Docker容器中的/maven
下的构build工件和java -jar /maven/${project.artifactId}-${project.version}.jar
来启动应用程序。
我正在使用端口9000,而不是标准的tomcat端口(8080),这也是泊坞窗的形象。
我已经比较了本地jar和Docker容器中包含的jar,它们都有相同的内容。
任何帮助,将不胜感激。 提前致谢
XHTML文件和其余的JSF文件被放置在错误的目录中。
至less在使用<packaging>jar</packaging>
,看起来所有JSF的东西都必须放在src/main/resources/META-INF
而不是src/main/webapp
,大多数IDE会自动放置它。
当JSF的东西在src/main/webapp
它不会被包含(或者没有放在正确的地方)到spring-boot-repackaged jar文件中。
我的src/main/resources
看起来像这样:
src └── main └── resources ├── application.yml └── META-INF ├── faces-config.xml └── resources ├── administration │ └── userlist.xhtml ├── css │ └── default.css ├── images │ └── logo.png └── home.xhtml
我有完全相同的问题。 直接从maven或打包的WAR文件运行Spring Boot应用程序工作正常,但从Docker容器运行它导致同样的问题。
实际上,对于我来说,问题在于访问dynamic资源(JSP等)总是导致尝试显示错误页面,而错误页面无法find,因此返回了404,但是静态内容正确返回。
这听起来很愚蠢,但是对我来说,启动它时是否调用打包的WAR文件“.war”或“.jar”很重要。 我用Spring Boot的一个Docker例子(出于某种原因)将WAR文件命名为“app.jar”。 如果你这样做,你会在Docker容器中遇到这个问题。 如果你把它称为“app.war”,它可以正常工作。
顺便说一下,这与Docker无关。 如果您尝试直接在主机上启动应用程序(如果扩展名为.jar时除外),那么也会发生同样的情况(除非您以提取的方式在所需资源处于位置的位置启动应用程序)。
用我的应用程序开始
java -Duser.timezone=UTC -Djava.security.egd=file:/dev/./urandom -jar application.jar
导致错误。 从.jar重命名为.war并使用
java -Duser.timezone=UTC -Djava.security.egd=file:/dev/./urandom -jar application.war
使其工作。