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 文件的主要内容,如果未能解决你的问题,请参考以下文章

idea中,使用Gradle创建的项目,如何变为web项目

Gradle构建并自动部署Java Web项目到远程服务器

在gradle中如何使用来自项目外部相对路径的源

IntelliJ 无法识别来自 gradle 项目的某些导入

IIS无法删除应该程序池 因为它包含X个应用程序

Tomcat AJP协议文件包含漏洞(CVE-2020-1938)