Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让JSF在docker容器中使用spring boot应用程序?_Jsf_Docker_Spring Boot - Fatal编程技术网

如何让JSF在docker容器中使用spring boot应用程序?

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

我有一个应用程序是用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页面工作正常,但当尝试访问
/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升级到最新版本后,这些例外就消失了,但我认为这不属于这个主题