Gradle 包含来自 webapp 目录的 Freemarker 文件
Posted
技术标签:
【中文标题】Gradle 包含来自 webapp 目录的 Freemarker 文件【英文标题】:Gradle include Freemarker files from webapp directory 【发布时间】:2017-07-17 12:08:28 【问题描述】:我有一个通过 gradle 变成 jar 的 spring boot 项目。
这是我的build.gradle
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'jetty'
apply plugin: 'war'
apply plugin: 'org.springframework.boot'
repositories
mavenCentral()
dependencies
compile("org.springframework.boot:spring-boot-starter-web:1.5.1.RELEASE")
exclude module: "spring-boot-starter-tomcat"
compile group: 'org.springframework.boot', name: 'spring-boot-starter-jetty', version: '1.5.1.RELEASE'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator', version: '1.5.1.RELEASE'
compile group: 'org.springframework', name: 'spring-webmvc', version: '4.3.6.RELEASE'
compile group: 'org.springframework', name: 'spring-context-support', version: '4.3.6.RELEASE'
compile group: 'org.springframework', name: 'spring-orm', version: '4.3.6.RELEASE'
compile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
compile group: 'org.freemarker', name: 'freemarker', version: '2.3.23'
compile group: 'mysql', name: 'mysql-connector-java', version: '6.0.5'
compile group: 'org.hibernate', name: 'hibernate-core', version: '5.1.4.Final'
compile group: 'commons-validator', name: 'commons-validator', version: '1.5.1'
compile group: 'junit', name: 'junit', version: '4.12'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '1.5.1.RELEASE'
task wrapper(type: Wrapper)
gradleVersion = '2.2'
buildscript
repositories
mavenCentral()
dependencies
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.1.RELEASE")
jar
from
(configurations.runtime).collect
it.isDirectory() ? it : zipTree(it)
baseName = 'carefree-cooking'
version = '0.1.0'
manifest
attributes 'Main-Class': 'carefree.cooking.Application'
springBoot
executable = true
sourceCompatibility = 1.8
targetCompatibility = 1.8
在我的 @Configuration
我有 Freemarker 配置如下方式
@Bean(name = "freemarkerConfig")
public FreeMarkerConfigurer freemarkerConfig()
FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
configurer.setTemplateLoaderPath("/");
return configurer;
@Bean(name = "viewResolver")
public FreeMarkerViewResolver viewResolver()
FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver();
viewResolver.setPrefix("/WEB-INF/template/");
viewResolver.setSuffix(".ftl");
return viewResolver;
我的控制器是
@Controller
@RequestMapping("/")
public class IndexController
@RequestMapping()
public String index(ModelMap model)
return "page";
而我的page.ftl
位于
src\main\webapp\WEB-INF\template\page.ftl
然后只是说 Hello world。
每当我通过运行构建我的 jar 时./gradlew clean jar
我注意到在创建的 jar 中 page.ftl
不存在
当我运行我的 Spring Boot 应用程序时,它找不到 page.ftl
,但是如果我创建一个目录webapp\WEB-INF\template\page.ftl
jar 所在的位置,然后找到 page.ftl
。
如何配置gradle
以包含page.ftl
并配置我的@Configuration
类以在那里查找page.ftl
?
我已经尝试添加
from("$projectDir/src/main")
include('webapp/WEB-INF/**')
到 build.gradle 中的我的 jar 任务,虽然这确保了 page.ftl
包含在 jar 中,但我的应用程序仍然由于某种原因找不到它。
【问题讨论】:
【参考方案1】:src/main/webapp
的内容只有当它是一个战争文件时才会包含在构建的存档中。构建 jar 时不包括它们。您已经应用了 war 插件,所以 ./gradlew clean war
应该可以工作。如果你想要一场肥沃的战争,即可以使用java -jar
运行的战争,然后运行./gradlew clean bootRepackage
。
【讨论】:
以上是关于Gradle 包含来自 webapp 目录的 Freemarker 文件的主要内容,如果未能解决你的问题,请参考以下文章