2013-09-25 54 views
2

我有一個將用作executable.jar文件的Java項目。如果我的項目在其資源文件夾中包含批處理文件,那麼如何編寫我的項目以便在executable.jar運行時可以在內部調用批處理文件?執行一個存在於jar文件中的批處理文件

編輯:這是一個Windows 7的批處理文件

+0

我不認爲你可以。 –

+1

這是一個Windows或Linux批處理文件?解決方案可能是解壓縮它,或重新創建一個具有相同內容的臨時文件,然後執行它 – Morfic

+0

我不認爲這是可能的。但是,您可以非常輕鬆地將該批處理腳本的內容寫入程序的當前工作目錄,然後使用'ProcessBuilder'執行它,假設您有對當前工作目錄的寫權限。 – CodeBlind

回答

0

讓我們假設你的批處理文件位於classpath中的「com.mycompany.MyBatch.bat」

首先,您需要將文件複製到tmp,然後使其可執行,然後運行它:

public static void main(String[] args) throws Exception { 
    final File tmp = File.createTempFile("myBatch", "batch"); 
    try (final ReadableByteChannel channel = Channels.newChannel(App.class.getResourceAsStream("/com/mycompany/MyBatch.bat")); 
      final FileChannel fileChannel = new RandomAccessFile(tmp, "rw").getChannel()) { 
     final ByteBuffer bb = ByteBuffer.allocate(1024); 
     while (channel.read(bb) > 0) { 
      bb.flip(); 
      fileChannel.write(bb); 
      bb.clear(); 
     } 
    } 
    tmp.setExecutable(true); 
    //run script 
} 
+0

,所以如果我使用的是Runtime.getRuntime().exec(「這是什麼命令?」) ; – Jason

+0

第一步不使用'Runtime.getRuntime().exe',使用[ProcessBuilder](http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html)。第2步'ProcessBuilder pb = 新的ProcessBuilder(tmp.getAbsolutePath(),「myArg1」,「myArg2」);' –

+0

它的工作原理!那麼,我無法讓它與ProcessBuilder一起工作,並且File.createTempFile()的第二個參數需要是「.bat」,但非常感謝您的幫助!有一件事我不能包裹頭,bb.flip()是什麼? – Jason

相關問題