2010-09-10 28 views
5

Tôi có tập tin thực thi, tên run.bat mà inlcudes đoạn mã sau:Vấn đề thực hiện một tập tin thực thi trong một ứng dụng Java

@echo off 
REM bat windows script 
set CXF_HOME=.\lib\apache-cxf-2.2.7 
java -Djava.util.logging.config.file=%CXF_HOME%\logging.properties -jar archiveServer-0.1.jar 

Khi tôi thực hiện tập tin này trên một dòng lệnh nó hoạt động hoàn hảo. Tuy nhiên khi tôi cố gắng thực hiện trong một file java với tuyên bố sau đây:

File path = new File("C:/Documents and Settings/Zatko/My Documents/Project-workspace/IUG/external/application/archive");  

Runtime.getRuntime().exec(new String[]{"cmd.exe", "/C", "start", "run.bat"}, new String[]{}, path); 

tôi nhận được lỗi sau trong cửa sổ terminal:

'java' is not recognized as internal or external command, operable program or batch file. 

Trong trường hợp lỗi có thể được?

Trả lời

1

Tôi cho rằng bạn không thêm vào biến môi trường PATH của mình.

+0

bạn làm như thế nào? – Anto

+0

Giá trị C: \ Program Files \ Java \ jdk1.6.0_18 \ bin; được bao gồm trong biến PATH – Anto

+0

Hãy thử thêm C: \ Program Files \ Java \ jdk1.6.0_18 \ bin trước java trong tập tin thực thi của bạn. Một cách sạch hơn có thể là sử dụng Runtime.getRuntime(). Exec() với hai tham số cho môi trường được chỉ định. – stacker

2

Java.exe không được tìm thấy trong PATH của bạn.

Nếu bạn có thể giả định rằng biến JAVA_HOME được xác định, bạn có thể sửa đổi tập tin thực thi của bạn:

%JAVA_HOME%\bin\java -Djava.util.logging.config.file=%CXF_HOME%\logging.properties -jar archiveServer-0.1.jar 

Một cách tốt hơn để làm điều đó sẽ là, như Staker đề nghị, để thiết lập các biến môi trường PATH chứa % JDK_HOME% \ bin

File workingDirectory = new File("C:/Documents and Settings/Zatko/My Documents/Project-workspace/IUG/external/application/archive");  
String javaProgram = System.getProperty("java.home") + "\bin"; 
String[] command = {"cmd.exe", "/C", "start", "run.bat"}; 
String[] environment = {"PATH=" + javaProgram}; 
Process process = Runtime.getRuntime().exec(command, environment, workingDirectory); 

Tùy chọn thứ ba, bạn cũng có thể tránh để có tệp lô bằng cách gọi trực tiếp lớp chính của bình. Tuy nhiên, bạn lưu trữServer sẽ chạy trong cùng một quy trình. Có lẽ đó không phải là điều bạn muốn.

+0

+1 Tôi đã khắc phục một số lỗi chính tả nhỏ, vui lòng quay lại nếu bạn không đồng ý. – stacker

+0

@stacker Cảm ơn. Tôi vừa thêm lại thư mục workingDirectory như được chỉ định trong mã của câu hỏi. – gawi

Các vấn đề liên quan