Ratpack + Thymeleaf + shadowJar - 解析模板“home”时出错,模板可能不存在或无法访问
Posted
技术标签:
【中文标题】Ratpack + Thymeleaf + shadowJar - 解析模板“home”时出错,模板可能不存在或无法访问【英文标题】:Ratpack + Thymeleaf + shadowJar - Error resolving template "home", template might not exist or might not be accessible 【发布时间】:2018-12-03 00:59:32 【问题描述】:我正在开发 ratpack.io 网络应用程序并使用 gradle 作为构建工具。模板是从src/main/thymeleaf
目录中的模板文件呈现的,该目录在运行时运行良好(仅使用gradle run
)。
$ ls ./src/main/thymeleaf
home.html
我在创建 uber jar 时遇到了问题,其中不包含模板文件。当我打开输出 jar 文件时,我看到 thymeleaf
目录是空的。
我知道 shadow-jar 过程的一部分是将所有依赖项合并到一个 jar 中,但我不确定我还需要做什么来包含模板文件。我尝试创建特殊规则来包含 html 文件,但最终我只得到了 jar 中的 html 文件,甚至没有来自 thymeleaf 目录的文件。
我需要配置什么来获取包含在这个 uber jar 中的模板文件? 如果我真的得到了包含在 jar 模板目录中的文件,我是否需要更新模板解析器以从 jar 中提取文件而不是当前工作目录?【问题讨论】:
我刚刚尝试使用 groovy 模板并得到了相同的结果,但它们不会自动包含在 uber jar 中。我一定是在做一些非常天真的事情,因为我不可能是唯一一个想在 CLI 构建和 uberjar 中使用模板的人。 【参考方案1】:您有什么理由将模板文件保存在src/main/thymeleaf
中吗?默认情况下,Thymeleaf 模板应存储在 src/ratpack/thymeleaf
目录中。
ThymeleafModule
类定义存储所有模板的文件夹名称。默认值为thymeleaf
,当您创建shadowJar 时,您应该在JAR 存档中找到一个文件夹thymeleaf
。 shadowJar 将src/ratpack/thymeleaf
复制到此目的地没有任何问题。
默认情况下,基于 Java 的 Ratpack 项目不知道 src/ratpack
,但您可以通过在 src/ratpack
中创建一个名为 .ratpack
的空文件并配置 server -> server.findBaseDir()
来轻松配置它(更详细的示例如下)。
这是一个简单的例子:
build.gradle
buildscript
repositories
jcenter()
dependencies
classpath "io.ratpack:ratpack-gradle:1.5.4"
classpath "com.github.jengelman.gradle.plugins:shadow:1.2.4"
apply plugin: "io.ratpack.ratpack-java"
apply plugin: "com.github.johnrengelman.shadow"
apply plugin: "idea"
apply plugin: "eclipse"
mainClassName = 'app.RatpackApp'
repositories
jcenter()
dependencies
// Default SLF4J binding. Note that this is a blocking implementation.
// See here for a non blocking appender http://logging.apache.org/log4j/2.x/manual/async.html
runtime 'org.slf4j:slf4j-simple:1.7.25'
compile ratpack.dependency('thymeleaf')
compile ratpack.dependency('guice')
testCompile "org.spockframework:spock-core:1.0-groovy-2.4"
src/main/java/app/RatpackApp.java
package app;
import ratpack.guice.Guice;
import ratpack.server.BaseDir;
import ratpack.server.RatpackServer;
import ratpack.thymeleaf.ThymeleafModule;
import java.util.HashMap;
import static ratpack.thymeleaf.Template.thymeleafTemplate;
public final class RatpackApp
public static void main(String[] args) throws Exception
RatpackServer.start(server ->
server.serverConfig(config -> config.findBaseDir())
.registry(Guice.registry(bindings -> bindings.module(ThymeleafModule.class)))
.handlers(chain -> chain.get(ctx -> ctx.render(thymeleafTemplate(new HashMap<String, Object>()
put("title", "Hello, Ratpack!");
put("header", "Hello, Ratpack!");
put("text", "This template got rendered using Thymeleaf");
, "home"))))
);
src/ratpack/thymeleaf/home.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<title th:text="$title" />
</head>
<body>
<h1 th:text="$header"></h1>
<p th:text="$text" />
</body>
</html>
记得在
src/ratpack
中创建一个空文件.ratpack
,这样Ratpack 就可以发现这个位置作为文件基目录。
现在使用gradle shadowJar
创建最终JAR 后,我可以看到模板文件被正确复制:
ratpack-thymeleaf-example [master●●] % unzip -l build/libs/ratpack-thymeleaf-example-all.jar | grep home
232 06-24-2018 10:12 thymeleaf/home.html
在这里你可以找到完整的例子 - https://github.com/wololock/ratpack-thymeleaf-example
【讨论】:
我将它们放在“src/main/thymeleaf”中,因为这是我看到的一个示例 (github.com/pac4j/ratpack-pac4j-demo/blob/master/src/main/java/…) 放置它们的地方。我认为这是正确的,因为模板解析器正确地找到了它们。我是ratpack的新手,我需要设置基本目录,所以我将它设置为“src/main”以匹配示例。包括您在内的所有其他在线示例都是未指定基本目录的常规示例,因此我不知道应该将其设置为什么。 感谢@voodoogiant 指出ratpack-java。我更新了示例以涵盖 ratpack-java 而不是 ratpack-groovy。 Github 示例应用也更新了。以上是关于Ratpack + Thymeleaf + shadowJar - 解析模板“home”时出错,模板可能不存在或无法访问的主要内容,如果未能解决你的问题,请参考以下文章
使用Ratpack和Spring Boot打造高性能的JVM微服务应用