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

时间:2016-03-16 06:07:58

标签: java gradle gretty

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

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

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

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文件中没有太多代码?

1 个答案:

答案 0 :(得分:0)

您描述的行为是Gretty默认执行的操作。 documentation州:

  

fastReload:当设置为true(默认值)时,webAppDir文件夹(通常为src / main / webapp)设置为快速重新加载。这意味着:无论何时   webAppDir中的某些文件已更改,这些文件将被复制到   在没有重新启动web-app的情况下运行web-app。

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

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

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

copyAssets.shouldRunAfter assetsCompile