2012-05-25 37 views
2

我想在python的許多JavaScript文件上運行google closure compiler
我用這個:Java,如何啓動幾個使用1個虛擬機的jar文件?

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

但據我瞭解它的每個進程創建Java虛擬機。
所以這吃所有的RAM。我只能聽到我的硬盤崩潰正在使用交換。 而系統幾乎被絞死。我可以告訴java以某種方式僅對所有啓動的進程使用1個虛擬機嗎?

可能是我寫錯了一些東西。那是因爲我完全不知道java。對不起,那

+0

另外:這正是那種有意義的情況,而不是使用'shell = True',因爲這樣你就不用擔心引用文件名了。 –

+0

@ThomasK,謝謝,只是不寫在popen參數列表我用1字符串和Shell參數 – Sergey

回答

1

可能的答案1:

的谷歌關閉編譯器接受多個輸入文件有這樣的語法:

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

這將產生只有一個輸出文件,該文件是組合所有的輸入。但是如果你試圖單獨編譯每個文件,這可能不是你想要的。


可能的答案2:

它不會是很難寫一個小包裝腳本(使用bashpython,或者你喜歡的腳本語言),接受對參數,例如

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

wrapper.sh可能環比(對)參數的代碼,並呼籲java -jar --js=xxx --js_output_file=yyy反覆,等待每個開始下一個之前完成。這將會有不會同時啓動每個進程的好處,所以至少您不會有(可能)多個JVM同時運行。儘管每次運行都必須重新啓動JVM,但確實存在一些低效率問題。


可能的答案3:

如果你真的只想要一個JVM,那麼有沒有辦法做到你的要求,而無需編寫Java代碼一點點(據我所知) 。如果您熟悉Java,則可以複製CommandLineRunner.java的源代碼並對其進行修改以適合您的需求。或者也許更容易,只需編寫一個小型的Java類,它的main函數只需簡單地調用CommandLineRunner主函數,傳遞適當的參數來模擬正常的命令行調用。這裏的東西快速和骯髒的,會做的伎倆(hat tip to 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); } 
    } 
} 

與這樣的編譯:

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

和:

javac -classpath compiler.jar MyRunner.java 

像這樣的東西來看,它看到這樣的輸出:

Compiling in1.js into out1.js... 
Finished with status: 0 
Compiling in2.js into out2.js... 
Finished with status: 0 
+0

謝謝,我想我會嘗試只有1,2個答案。請說爲什麼Google在java中編寫這個應用程序?它絕對應該用C++編寫,因爲它是一個「編譯器」。它一定很快。 – Sergey

相關問題