如何让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:runjava -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 

使其工作。