2016-07-20 32 views
1

Wir verwenden die JAR-Datei von Closure Compiler, um unsere JS-Dateien zu minimieren. Diese JS-Dateien werden generiert, wenn ein Client die Schaltfläche [Speichern] auf dem Einstellungsbildschirm anklickt.Ein Dienst, der JAR-Dateien ausführt

Jeder Aufruf der Closure Compiler-JAR-Datei dauert 3-6 Sekunden, da bei jedem Aufruf eine JVM gestartet wird. Das ist viel zu lang und ohne guten Grund ... Ich würde froh sein, die JVM im Hintergrund zu halten, entweder beim Booten oder beim ersten Anruf.

Gibt es eine Möglichkeit, JAR-Dateien von einer laufenden JVM-Maschine als Dienst oder ähnlichem zu laden? oder vielleicht eine Möglichkeit, die JVM "zwischenzuspeichern", so dass beim nächsten Aufruf eines JAR keine neue JVM gestartet wird, sondern die vorherige verwendet wird?

Die Umgebung ist Ubuntu-Server, Django, Python. Hier ist der aktuelle Code, der die JAR-Dateien aufruft:

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() 

Antwort

0

Gradle

Ich denke, dass anstatt es selbst zu tun, Sie Gradle verwenden können. Gradle hat eine ausgezeichnete Funktion namens gradle daemon, die ein langlebiger JVM-Hintergrundprozess ist, der Ihre Builds viel schneller ausführt, als es sonst der Fall wäre.

Gradle hat Schließung compiler plugin, so kann die Integration leicht durchgeführt werden.

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 
} 

Und Sie müssen nicht gradle auf Ihrem Rechner installiert haben, können Sie gradle wraper verwenden, die entsprechende Version von gradle herunterladen, bevor es angefangen hat.

Drip

Wenn Sie gradle nicht verwenden möchten, können Sie Drip stattdessen verwenden. Drip ist ein Startprogramm für die Java Virtual Machine, das viel schnellere Startzeiten bietet als der Java-Befehl. Das Tropfskript soll nur ein schneller Ersatz für den Java-Befehl sein.

Sie können Tropf installieren und verwenden Sie drip Befehl anstelle von java in Ihrem Python-Skript.

+0

Versuchte Tropf zuerst, weil die Integration ein Kinderspiel ist. Es hatte keine signifikante Verbesserung der Geschwindigkeit. Gradle sagt, dass es nicht für die Produktion geeignet ist, besonders nicht mit eingeschaltetem Daemon. Weißt du, warum ist das so? – oriadam

+0

@oriadam, Könnten Sie einen Link zu dieser Aussage geben? – SerCe

+0

SerCe, Hier: https://docs.gradle.org/current/userguide/gradle_daemon.html – oriadam