2

Pythonの多くのJavaScriptファイルでGoogleクロージャーコンパイラを実行したいと思います。
私はこれを使用します:

subprocess.Popen('/usr/bin/java -jar /var/www/compiler.jar --js "%s" --js_output_file "%s"' % (fullname, dest_filename),shell=True);

しかし、私が理解しているように、プロセスごとにJavaVMが作成されます。
したがって、これはすべてのRAMを消費します。スワップが使用されているときに、HDDのクラッキングが聞こえるだけです。そして、システムはほとんど絞首刑にされています。開始されたすべてのプロセスに1つのVMのみを使用するようにJavaに指示できますか?

何か間違って書いたのかもしれません。それは私がJavaを全く知らないからです。そのために残念

4

1 に答える 1

1

考えられる答え1:

Googleクロージャコンパイラは、次のような構文の複数の入力ファイルを受け入れます。

java -jar compiler.jar --js=in1.js --js=in2.js ... --js_output_file=out.js

これにより、すべての入力の組み合わせである1つの出力ファイルのみが生成されます。ただし、各ファイルを個別にコンパイルしようとしている場合、これは希望どおりではない可能性があります。


考えられる答え2:

bashパラメータのペアを受け入れる小さなラッパースクリプト( 、、、pythonまたはお気に入りのスクリプト言語を使用)を作成するのは難しくありません。

wrapper.sh in1.js out1.js in2.js out2.js ...

のコードはwrapper.sh、(ペアの)パラメーターをループして繰り返し呼び出しjava -jar --js=xxx --js_output_file=yyy、それぞれが完了するのを待ってから次のパラメーターを開始することができます。これには、各プロセスを並行して開始しないという利点があるため、少なくとも(潜在的に)多くのJVMを同時に実行することはありません。ただし、実行ごとにJVMを再起動する必要があるという非効率性があります。


考えられる答え3:

本当に1つのJVMだけが必要な場合は、Javaコードを少し書かずに(私が知る限り)要求したことを実行する方法はありません。Javaに精通している場合は、CommandLineRunner.javaのソースコードをコピーして、ニーズに合わせて変更できます。

または、さらに簡単な場合は、関数がメインを何度でもmain呼び出すだけの小さなJavaクラスを作成し、適切なパラメーターを渡して通常のコマンドライン呼び出しをシミュレートします。CommandLineRunnerこれがトリックを行う迅速で汚いものです(VonCへの帽子のヒント

import com.google.javascript.jscomp.CommandLineRunner;
import java.security.Permission;
public class MyRunner {
    public static void main(String [] args) {
        // Necessary since the closure compiler calls System.exit(...).
        System.setSecurityManager(new NoExitSecurityManager());
        for (int i=0; i<args.length; i+=2) {
            System.out.println("Compiling " + args[i] + " into " + args[i+1] + "...");
            try {
                CommandLineRunner.main(new String[] {
                    "--js=" + args[i],
                    "--js_output_file=" + args[i+1]
                });
            }
            catch (ExitException ee) {
                System.out.println("Finished with status: " + ee.getStatus());
            }
        }
    }

    private static class ExitException extends SecurityException {
        private int status;
        public ExitException(int status) { this.status = status; }
        public int getStatus() { return status; }
    }
    private static class NoExitSecurityManager extends SecurityManager {
        public void checkPermission(Permission p) { }
        public void checkPermission(Permission p, Object context) { }
        public void checkExit(int status) { throw new ExitException(status); }
    }
}

次のようなものでコンパイルします。

javac -classpath compiler.jar MyRunner.java

次のようなもので実行します。

java -classpath .:compiler.jar MyRunner in1.js out1.js in2.js out2.js ...

そして、次のような出力を参照してください。

Compiling in1.js into out1.js...
Finished with status: 0
Compiling in2.js into out2.js...
Finished with status: 0
于 2012-05-25T18:47:15.560 に答える