我有一個將用作executable.jar文件的Java項目。如果我的項目在其資源文件夾中包含批處理文件,那麼如何編寫我的項目以便在executable.jar運行時可以在內部調用批處理文件?執行一個存在於jar文件中的批處理文件
編輯:這是一個Windows 7的批處理文件
我有一個將用作executable.jar文件的Java項目。如果我的項目在其資源文件夾中包含批處理文件,那麼如何編寫我的項目以便在executable.jar運行時可以在內部調用批處理文件?執行一個存在於jar文件中的批處理文件
編輯:這是一個Windows 7的批處理文件
讓我們假設你的批處理文件位於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
}
,所以如果我使用的是Runtime.getRuntime().exec(「這是什麼命令?」) ; – Jason
第一步不使用'Runtime.getRuntime().exe',使用[ProcessBuilder](http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html)。第2步'ProcessBuilder pb = 新的ProcessBuilder(tmp.getAbsolutePath(),「myArg1」,「myArg2」);' –
它的工作原理!那麼,我無法讓它與ProcessBuilder一起工作,並且File.createTempFile()的第二個參數需要是「.bat」,但非常感謝您的幫助!有一件事我不能包裹頭,bb.flip()是什麼? – Jason
我不認爲你可以。 –
這是一個Windows或Linux批處理文件?解決方案可能是解壓縮它,或重新創建一個具有相同內容的臨時文件,然後執行它 – Morfic
我不認爲這是可能的。但是,您可以非常輕鬆地將該批處理腳本的內容寫入程序的當前工作目錄,然後使用'ProcessBuilder'執行它,假設您有對當前工作目錄的寫權限。 – CodeBlind