Ratpack + Thymeleaf + shadowJar - Ошибка при разрешении шаблона "home", шаблон может не существовать или быть недоступным - PullRequest
0 голосов
/ 24 июня 2018

Я работаю над веб-приложением ratpack.io и использую gradle в качестве инструмента для сборки.Шаблоны отображаются из файлов шаблонов в каталоге src/main/thymeleaf, который отлично работает во время выполнения (просто используя gradle run).

$ ls ./src/main/thymeleaf
home.html

У меня возникают проблемы при создании uber jar, где файлы шаблонов не включены.Когда я открываю выходной jar-файл, я вижу, что каталог thymeleaf пуст.

Я знаю, что часть процесса shadow-jar объединяет все зависимости в один jar, но я не уверен, что мне нужно также включать файлы шаблонов.Я попытался создать специальные правила для включения html-файлов, но в итоге я получил только html-файлы в jar, а не те, что были в каталоге thymeleaf.

  • что мне нужно настроить, чтобы получить файлы шаблонов, включенные в этот uber jar?
  • если я на самом деле получаю файлы, включенные в dir шаблона jar, нужно ли мне обновлять распознаватель шаблонов, чтобы извлекать файлы из jar против текущего рабочего каталога?

1 Ответ

0 голосов
/ 24 июня 2018

Есть ли причина, по которой вы храните файлы шаблонов в src/main/thymeleaf?По умолчанию шаблоны Thymeleaf должны храниться в каталоге src/ratpack/thymeleaf.

ThymeleafModule class определяет имя папки, в которой хранятся все шаблоны.Значение по умолчанию thymeleaf, и когда вы создаете shadowJar, вы должны найти папку thymeleaf прямо в архиве JAR.shadowJar копирует src/ratpack/thymeleaf в это место назначения без каких-либо проблем.

Проект Ratpack на основе Java не знает о src/ratpack по умолчанию, но вы можете легко настроить его, создав пустой файл с именем .ratpack в src/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>

Не забудьте создать пустой файл .ratpack в src/ratpack, чтобы Ratpack мог обнаружить это местоположение в качестве базы файлов dir.

Теперь, после создания окончательного JAR с gradle shadowJar, я вижуфайл шаблона копируется правильно:

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

...