如何让JSF在docker容器中使用spring boot应用程序?
我有一个应用程序是用SpringBoot1.4.0和JSF2.2(Mojarra2.2.13)构建的,运行在嵌入式tomcat(8.5)上 当我在本地运行应用程序时,无论我是从IDE启动它,还是使用如何让JSF在docker容器中使用spring boot应用程序?,jsf,docker,spring-boot,Jsf,Docker,Spring Boot,我有一个应用程序是用SpringBoot1.4.0和JSF2.2(Mojarra2.2.13)构建的,运行在嵌入式tomcat(8.5)上 当我在本地运行应用程序时,无论我是从IDE启动它,还是使用mvn spring boot:run或java-jar target/myapp.jar 但是,当我在docker容器中启动应用程序时(使用docker 1.12.1),除了JSF页面之外,一切都正常。例如,像/health这样的spring boot actuator页面工作正常,但当尝试访问/h
mvn spring boot:run
或java-jar target/myapp.jar
但是,当我在docker容器中启动应用程序时(使用docker 1.12.1),除了JSF页面之外,一切都正常。例如,像/health
这样的spring boot actuator页面工作正常,但当尝试访问/home.xhtml
(JSF页面)时,我得到:
白标错误页面 此应用程序没有针对
/error
的显式映射,因此您将其视为回退
2016年10月12日星期三09:33:33 GMT
出现意外错误(类型=未找到,状态=404)。
/home.xhtml未作为资源在ExternalContext中找到
我使用
io.fabric8:docker maven plugin
来构建docker映像(基于带openjdk-8-jre的alpine),其中包括docker容器中/maven
下的构建工件和启动应用程序的java-jar/maven/${project.artifactId}-${project.version}.jar
我使用的是端口9000,而不是标准的tomcat端口(8080),docker图像也显示了这一点
我已经比较了本地jar和docker容器中包含的jar,它们都有相同的内容
任何帮助都将不胜感激。
提前感谢XHTML文件,其余的JSF文件被放在了错误的目录中 至少在使用
jar
时,似乎所有JSF内容都必须放在src/main/resources/META-INF
下,而不是放在大多数IDE自动放置它的src/main/webapp
下
当JSF文件位于src/main/webapp
中时,它不会被包括(或不在正确的位置)到spring引导重新打包的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容器运行它也会导致同样的问题 实际上,对我来说,问题是访问动态资源(JSP等)总是导致试图显示错误页面,该页面无法找到,因此返回了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
成功了。对我有效的方法是在添加资源的同时将webapp文件夹复制到META-INF
<resource>
<directory>src/main/webapp</directory>
<targetPath>META-INF/resources</targetPath>
</resource>
src/main/webapp
META-INF/资源
然后将documentRoot添加到docker容器中可用的路径:
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>
webServerFactoryCustomizer() {
return factory -> factory.setDocumentRoot(new File("/workspace/META-INF/resources"));
}
@Bean
公共WebServerFactoryCustomizer
webServerFactoryCustomizer(){
返回factory->factory.setDocumentRoot(新文件(“/workspace/META-INF/resources”);
}
现在我可以在使用springboot:buildimage
和jar打包的同时使用jsf页面了
ps:我仍然有一些例外,在将SpringBoot+liquibase升级到最新版本后,这些例外就消失了,但我认为这不属于这个主题