Spring boot JSF可执行JAR找不到xhtml文件

Posted

技术标签:

【中文标题】Spring boot JSF可执行JAR找不到xhtml文件【英文标题】:Spring boot JSF executable JAR can not find xhtml files 【发布时间】:2021-02-08 22:26:57 【问题描述】:

我的 Spring Boot JSF 应用程序可以在 IntelliJ 中运行,但不能作为可执行 JAR 运行。应用程序启动时没有问题,但它无法解析 xhtml 模板。在 IntelliJ 中,一切都按预期工作。

我发现这个问题与类似问题有关。我以文件结构为导向,看不出有什么区别。

Spring Boot JSF packaging as a JAR

我的maven文件结构:

  src
   | main
      | resources
           | META-INF
               | resources
                    | index.xhtml
               | faces-config.xml

所以当我启动 Spring Boot 应用程序时,它会在目标/类中启动

那里的结构:

 target
   | classes
        | META-INF
             | resources
                  | index.xhtml
             | faces-config.xml

在创建的可执行 JAR 中的结构是

  org
  BOOT-INF
     | lib
     | classes
         | de ...
  META-INF
     | resources
         | index.xhtml
     | faces-config.xml

据我了解各种站点和答案,这应该是 jar 中提取 xhtml 文件的正确结构。但这对我不起作用。我出于绝望将 META-INF 目录复制到了 BOOT-INF/classes 目录中,在另一个迭代中,只是将 META-INF 中的资源目录复制到了 BOOT-INF/classes 中。但没有任何效果。它仍然无法解析 xhtml 文件。

我的jar文件的结构应该是怎样的?

【问题讨论】:

【参考方案1】:

我在将 JSF 页面打包到可执行 jar 时遇到了同样的问题。还有其他与该问题相关的 SO 主题(对我没有帮助):

Cant deploy Spring Boot application. Error 404 on any page Springboot Whitelabel Error Page with JSF (AWS)

我最终将项目转换为 war。 希望spring-boot-maven-plugin 支持可执行的战争。

    我在 pom.xml 中指定了<packaging>war</packaging>。 我不得不从 spring-boot-maven-plugin 配置中删除 <layers><enabled>true</enabled></layers>

战争项目结构:

 pom.xml
 src
 └── main
     ├── java
     │   └── xxx
     ├── resources
     │   ├── application.yml
     └── webapp
         ├── xxx.xhtml
         └── WEB-INF
             └── faces-config.xml

spring-boot-maven-plugin 运行它的repackage。解压战争结构:

├── META-INF
│   ├── MANIFEST.MF
│   └── maven
│       └── com.fusion
│           └── jsf-application
│               ├── pom.properties
│               └── pom.xml
├── org
│   └── springframework
│       └── boot
│           └── loader
│               ... spring classes here
│               └── WarLauncher.class
├── xxx.xhtml
└── WEB-INF
    ├── classes
    │   ... project classes 
    ├── faces-config.xml
    └── lib
        ... all the libs


可以使用java -jar jsf-application.war 运行war

【讨论】:

优秀的答案!我花了几天时间对此进行调查,最终得出了这个结论。但是,如果 xxx.xhtml 文件也可以放在 WEB-INF 下,那就太好了。这对于带有 application.properties 的 jsp 文件是可能的:spring.mvc.view.prefix = /WEB-INF/ 但是对于 JSF 文件(xxx.xhtml)它似乎不起作用......

以上是关于Spring boot JSF可执行JAR找不到xhtml文件的主要内容,如果未能解决你的问题,请参考以下文章

JSF 注释不适用于 Spring-boot

spring boot jsp & 可执行 jar 抛出 /error

找不到spring-boot可执行war密钥库

找不到符号 - Spring Boot Maven 兄弟作为依赖

spring cloudspring boot2.x下 使用feign,注解@EnableFeignClients 找不到的解决方法

Launch4J 插件创建一个 EXE(连同 JAR),但 EXE 在 Spring boot 中找不到主类