【问题标题】:A service that executes jar files执行jar文件的服务
【发布时间】:2016-11-23 12:37:41
【问题描述】:

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

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

有没有办法从正在运行的 JVM 机器上加载 JAR 文件作为服务,或者类似的东西?或者可能是一种“缓存”JVM 的方法,以便下次调用 jar 时,它不会启动新的 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()

【问题讨论】:

    标签: java jar jvm google-closure-compiler ubuntu-server


    【解决方案1】:

    分级

    我认为你可以使用 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 命令更快的启动时间。滴灌脚本旨在替代 java 命令,只是速度更快。

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

    【讨论】:

    • 首先尝试滴灌,因为集成是轻而易举的事。它在速度方面没有任何显着提高。 Gradle 声明它不适合生产,尤其是在打开守护程序的情况下。你知道这是为什么吗?
    • @oriadam,你能提供这个声明的链接吗?
    • @oriadam,我在那里没有找到任何“它不适合生产”。它提到“因为不建议将守护进程用于持续集成构建”,因为它会影响构建的可重复性。然而,即使是 IntelliJ IDEA 也使用 Gradle 集成的后台守护程序。
    • 人们也用 Nailgun 取得了一些成功martiansoftware.com/nailgun
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 2012-02-18
    • 2020-12-25
    • 1970-01-01
    相关资源
    最近更新 更多