2011-11-23 22 views
5

Tôi đang tạo một chức năng cập nhật cho dự án của mình, nó hoạt động rất tốt, cho đến khi tôi muốn khởi động lại, về cơ bản tôi tải xuống tệp mới và thay thế bằng tệp cũ và sau đó tôi muốn chạy nó một lần nữa, bây giờ đối với một số lý do nó không chạy WNA, và tôi không nhận được bất kỳ lỗi ...Làm thế nào tôi có thể chạy một tệp .jar trong java

đây là lớp cập nhật đầy đủ: http://dl.dropbox.com/u/38414202/Update.txt

đây là phương pháp tôi đang sử dụng để chạy tệp .jar của tôi:

String currDir = new File("(CoN).jar").getAbsolutePath(); 
Process runManager = Runtime.getRuntime().exec("java -jar " + currDir); 
+0

gì bạn đang mong đợi cho sau khi hoặc trong quá trình chạy jar này? – maks

+0

Bạn có mong đợi để có thể thoát khỏi quá trình Java hiện tại và được thay thế bằng quy trình bạn vừa mới khởi chạy không? Tôi không chắc chắn rằng có thể cho các giới hạn I/O mà Sun đề cập đến trong lớp Process. –

+0

Mặc dù vậy, tôi đã thấy nhiều ứng dụng Java "tự động cập nhật", do đó, phải có một số thiết kế được đề xuất cho nó. –

Trả lời

0

Không ai ở đây dường như để giúp tôi, vì vậy tôi đã đi hỏi bạn bè của tôi và tôi đã có nó gần như ngay. Nó yêu cầu chuỗi ký tự là một mảng.

giải pháp:

String[] cmd = {"java", "-jar", currDir}; 
try { 
    Runtime.getRuntime().exec(cmd); 
} catch (IOException e1) { 
    e1.printStackTrace(); 
} 
0

JavaDocs cho lớp Process chỉ ra rằng nếu bạn không nắm bắt được luồng đầu ra của Quy trình và nhanh chóng đọc nó rằng quá trình có thể tạm dừng. Nếu đây là trường hợp, thì bạn sẽ không thấy quá trình mà bạn bắt đầu chạy.

0

Tôi nghĩ rằng bạn cần phải nắm bắt được stream như thế này:

BufferedReader stdInput = new BufferedReader(new InputStreamReader(runManager.getInputStream()),8*1024); 

BufferedReader stdError = new BufferedReader(new InputStreamReader(runManager.getErrorStream())); 

// read the output from the command 

String s = null; 
System.out.println("Here is the standard output of the command:\n"); 
while ((s = stdInput.readLine()) != null) { 
System.out.println(s); 
    } 
+0

Tôi không chắc là mọi người hiểu tôi, tôi đã nói mọi thứ hoạt động tốt, cho đến khi tôi chạy lại ... vậy tại sao tôi lại cần dòng đầu vào? tất cả tôi sẽ làm là chạy .jar sau khi tôi đã thay thế nó, –

+0

@Wiggyboy Tệp jar mới của bạn có cung cấp bất kỳ đầu ra nào khi chạy không? –

1

Nó không rõ ràng với tôi, tại sao bạn cần phải chạy jar với một cuộc gọi đến exec(). Cho rằng bạn cần chạy mã trong tệp .jar từ một chương trình Java, bạn có thể chỉ cần chạy phương thức main() như được định nghĩa trong tệp kê khai của jar và nắm bắt đầu ra của nó - ở bất kỳ đâu.

Sử dụng exec() là OK khi bạn cần gọi chương trình từ hệ điều hành cơ bản, nhưng có những cách dễ dàng hơn để thực hiện việc này nếu cả người gọi và callee là các chương trình Java.

Bây giờ, nếu bình của bạn sẽ thay đổi động và bạn cần cập nhật chương trình của mình theo bình mới, có cơ chế tải lại nội dung của nó, ví dụ: xem post khác.

0

Chức năng exec không tự động tra cứu vào PATH để bắt đầu quá trình, vì vậy bạn phải vượt qua đường dẫn đầy đủ cho mã nhị phân java.

Bạn có thể làm điều đó bằng cách sử dụng tài sản java.home hệ thống, xem câu trả lời này: ProcessBuilder - Start another process/JVM - HowTo?

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