java - 使用 Gradle/Gretty 中的就地 Web 应用程序和 Assets 管道快速重新加载

标签 java gradle gretty

我正在使用 Gretty 通过 gradle appRun 运行我的 Web 应用程序。我也在使用the Gradle Asset Pipeline plugin将我的 Less 文件编译为 CSS。

我想与 Gretty's Fast reload feature 集成这样当我更改 Less 文件时,它会自动编译它并将 CSS 复制到就地 Web 应用程序。

我已经在我的 build.gradle 文件中使用 Gretty 的 onScanFilesChanged 设置实现了一个解决方案:

buildscript {
    dependencies {
        classpath 'org.akhikhl.gretty:gretty:1.2.4'
        classpath 'com.bertramlabs.plugins:asset-pipeline-gradle:2.7.0'
        classpath 'com.bertramlabs.plugins:less-asset-pipeline:2.7.0'
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'war'
apply plugin: 'org.akhikhl.gretty'
apply plugin: 'com.bertramlabs.asset-pipeline'

dependencies {
    // ...
}

assets {
    excludes = ['bootstrap/**']
}

war.dependsOn assetCompile

gretty {
    servletContainer = 'tomcat8'
    enableNaming = true
    contextPath = '/'

    // This affects the war task as well
    webappCopy {
        from 'build/assets', { into 'stylesheet' }
    }

    afterEvaluate {
        prepareInplaceWebAppFolder.dependsOn assetCompile
    }

    scanDir "src/assets"
    fastReload "src/assets"
    onScanFilesChanged { List<String> files ->
        if (files.findAll { it.endsWith ".less" }.size() > 0) {
            assetCompile.compile()
        }
    } 
}

有没有一种更简洁的方法可以做到这一点,并且在 build.gradle 文件中不涉及太多代码?

最佳答案

您所描述的行为是 Gretty 默认执行的行为。 documentation状态:

fastReload: When set to true (the default), webAppDir folder (which is typically src/main/webapp) is set as being fast-reloaded. That means: whenever some files within webAppDir are changed, these files are copied into running web-app without web-app restart.

这意味着,src/main/webapp 子目录中的任何更改都会触发 Gretty 的快速重新加载,但在此目录之外进行的任何更改都会触发服务器重新启动。

解决问题的更明智的方法是将 gradle assetsCompile 的输出路径覆盖到 src/main/webapp 的子目录,或者在 build.gradle 文件中将复制任务 Hook 到它,如下所示:

task copyAssets(type: Copy) {
    from buildDir + '/assets'
    into webAppDir + '/stylesheet'
}

copyAssets.shouldRunAfter assetsCompile

关于java - 使用 Gradle/Gretty 中的就地 Web 应用程序和 Assets 管道快速重新加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36027940/

相关文章:

android - 外部 AndroidManifest.xml 未出现在项目 View Pane 下

java - 如何使用 gradle 在另一个子项目的 Web 项目上运行集成测试

gradle - 如何在 Gretty 插件中选择特定的 jetty 版本

java - 使用定时过期时, Guava 缓存不会在 x 时间单位后过期

groovy - 使用 Gradle 执行 wix

java - 使用 try-with-resources java 关闭数据库连接

java - Gradle:如何从 JScience jar 依赖项中排除 javax.realtime 包(多个 dex 定义)

gradle - 如何对 gretty 和 war 执行相同的资源过滤?

java - 避免响应具有特定值的 JSON 字段

java - jhat 抛出无法识别的魔数(Magic Number)