У меня есть небольшое веб-приложение Java, созданное с помощью Gradle, которое включает в себя некоторый собственный ванильный JavaScript. Я хотел бы минимизировать пользовательский код JS с помощью компилятора Google Closure.
Кажется, что вся документация по компилятору Closure посвящена использованию CLI или JSON API для минимизации JS. Я бы предпочел вызывать Java API непосредственно из Gradle, например, задание Копировать.
Я бы хотел избежать
java -jarЭтот пример устарел и не отражает самую последнюю версию Java API. Этот вопрос несколько лет назад, хотя большинство вызовов API кажутся похожими на текущий Java API.
Кто-нибудь еще минимизировал JavaScript из Gradle напрямую с помощью API Java компилятора Google Closure?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


У меня есть рабочее решение:
task processWebapp(type: Copy) {
from('src/main/webapp') {
include "**/*"
}
eachFile {
if (it.sourceName.endsWith('.js') && !it.sourceName.endsWith('.min.js')) {
it.exclude()
Reader reader = it.file.newReader()
String source = ""
try {
source = reader.readLines().join("\r\n")
} finally {
reader.close()
}
com.google.javascript.jscomp.Compiler compiler = new com.google.javascript.jscomp.Compiler(System.err)
CompilerOptions options = new CompilerOptions()
CompilationLevel.SIMPLE_OPTIMIZATIONS.setOptionsForCompilationLevel(
options)
SourceFile extern = SourceFile.fromCode("externs.js", "")
SourceFile input = SourceFile.fromCode(it.sourceName, source)
compiler.compile(extern, input, options)
String transpiled = compiler.toSource()
def directoryPath = it.relativePath - it.sourceName
File theDir = new File("build/resources/main/${directoryPath}")
if (!theDir.exists()) {
theDir.mkdirs()
}
PrintWriter writer = new PrintWriter("build/resources/main/${it.relativeSourcePath}", "UTF-8")
try {
writer.println(transpiled)
} finally {
writer.close()
}
}
}
destinationDir = file('build/resources/main')
}
Эта задача копирует все, начиная с src/main/webapp и заканчивая build/resources/main, при переносе (уменьшении) всех файлов, оканчивающихся на .js (но не заканчивающихся на .min.js) в пути. Затем Gradle упаковывает и встраивает эти ресурсы в полученный файл jar.
Надеюсь, это поможет кому-то еще, использующему Google Closure Compiler и Gradle.
Вы проверили и отклонили плагин eriwen? github.com/eriwen/gradle-js-plugin
@Nate Vaughan, чтобы этот пример работал, как называется плагин, который вы использовали в своем скрипте Gradle.
Вы все еще используете это решение сегодня? Есть обновления?