一种执行jar文件的服务



我们使用闭包编译器jar文件来缩小JS文件。这些JS文件是在客户端点击设置屏幕上的[Save]按钮时生成的。

对闭包编译器jar文件的每次调用需要3-6秒,因为每次调用都会启动一个JVM。这太长了,而且没有充分的理由。。。我很乐意让JVM在后台运行,无论是在启动时还是在第一次调用时。

有没有一种方法可以将JAR文件作为服务从正在运行的JVM机器中加载,或者类似的方法?或者可能是一种"缓存"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有闭包编译器插件,所以集成可以很容易地完成。

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。

滴水

如果你不想使用渐变,你可以使用滴水。Drip是Java虚拟机的启动器,它提供了比Java命令更快的启动时间。滴漏脚本旨在取代java命令,只是速度更快。

您可以在python脚本中安装drip并使用drip命令它,而不是java

最新更新