执行 jar 文件的服务

A service that executes jar files

我们正在使用 Closure Compiler jar 文件来缩小我们的 JS 文件。 这些 JS 文件是在客户点击其设置屏幕上的 [保存] 按钮时生成的。

每次调用 Closure Compiler jar 文件需要 3-6 秒,因为每次调用都会启动一个 JVM。这太长了,而且没有充分的理由......我很乐意在启动时或第一次调用时保持 JVM 和 运行 在后台。

有没有办法从 运行 JVM 机器加载 JAR 文件作为服务,或类似的东西?或者可能是 'cache' JVM 的一种方法,以便下次调用 jar 时,它不会启动新的 JVM,而是使用以前的 JVM?

环境是Ubuntu服务器,Django,Python。 这是调用 jar 文件的当前代码:

import time, subprocess, random
# run google closure compiler
jarjs = os.path.join(ROOT_DIR, "compiler.jar")
fn_min = fn_max.replace('.js','.min.js')
p = subprocess.Popen(['java','-jar',jarjs,'--jscomp_off','internetExplorerChecks','--compilation_level','SIMPLE_OPTIMIZATIONS','--js',fn_max,'--js_output_file',fn_min], stdout=subprocess.PIPE,stderr=subprocess.PIPE)
out, err = p.communicate()

Gradle

我认为你可以使用 Gradle 而不是自己做。 Gradle 有一个名为 gradle daemon 的出色功能,它是一个长期存在的后台 JVM 进程,可以比其他情况更快地执行您的构建。

Gradle 有闭包 compiler plugin,所以集成很容易。

repositories {
    mavenCentral() //or jcenter()
}
configurations {
    closureCompiler
}
dependencies {
    closureCompiler 'com.google.javascript:closure-compiler:v20150609'
}

task compileJS(type: JavaExec){
    classpath configurations.closureCompiler
    main = 'com.google.javascript.jscomp.CommandLineRunner'

    def closureArgs = []
    //append all your command line options here
    closureArgs << "--compilation_level=SIMPLE_OPTIMIZATIONS"
    closureArgs << "--js_output_file=app.js"
    closureArgs << "input1.js"
    closureArgs << "input2.js"
    closureArgs << "src/**.js"

    args closureArgs
}

而且您不必在您的计算机上安装 gradle,您可以使用 gradle wraper 它将在开始之前下载适当版本的 gradle。

点滴

如果您不想使用 gradle,您可以使用 Drip。 Drip 是 Java 虚拟机的启动器,它提供比 java 命令快得多的启动时间。 drip 脚本旨在作为 java 命令的直接替代品,只是速度更快。

您可以安装 drip 并在 python 脚本中使用 drip 命令代替 java