2017-12-21 115 views
5

hiện tại Tôi có một số mã Java khởi chạy một quy trình Java mới, sử dụng hiệu quả hệ thống JRE mặc định (trong trường hợp của tôi là JDK 8). Thay vào đó, tôi cần nó để chạy với phiên bản đang chạy quá trình gốc (ví dụ: JDK 9).Bắt đầu quá trình Java với cùng một tệp thực thi như

Tôi có thể làm như thế nào? (Các giải pháp cần phải làm việc trên cả hai Java 8 và 9.)

Chi tiết

Mã này hiện dựa trên JRE hệ thống mặc định bằng cách đơn giản ban hành một lệnh java .... Một thay thế sẽ là sử dụng một cái gì đó giống như System.getProperty("java.home") + "/bin/java" (nhưng nền tảng độc lập), nhưng cả hai đều có cùng một vấn đề (đối với tôi): Chúng khởi chạy một quá trình Java với phiên bản JVM được biết đến với hệ thống.

CẬP NHẬT: Hoàn toàn sai, System.getProperty("java.home") thực sự làm những gì tôi muốn và trả về thư mục chính của JVM hiện tại. (Stupid tôi, tôi nghĩ rằng tôi đã thử điều đó.)

Một cách để khởi chạy với cùng một phiên bản Java, sẽ hỏi quá trình hiện tại cho nó thực thi và tái sử dụng, nhưng tôi không tìm thấy API cho điều đó.

+3

'System.getProperty (" java.home ")' cung cấp cho bạn JRE hiện tại, không phải là JRE mặc định –

+0

@IngoKegel Bạn hoàn toàn đúng, tôi không biết làm thế nào mà thoát được tôi ... Cảm ơn! – Nicolai

Trả lời

3

Nếu bạn không thể sử dụng mới Java 9 API chưa, here you go:

static String getJavaRuntime() throws IOException { 
    String os = System.getProperty("os.name"); 
    String java = System.getProperty("java.home") + File.separator + "bin" + File.separator + 
      (os != null && os.toLowerCase(Locale.ENGLISH).startsWith("windows") ? "java.exe" : "java"); 
    if (!new File(java).isFile()) { 
     throw new IOException("Unable to find suitable java runtime at "+java); 
    } 
    return java; 
} 

Để biết thêm chi tiết bạn có thể xem cách chúng tôi làm điều đó trong josm của restart action, trong đó có các yêu cầu sau:

  • làm việc trên Java 8+, Linux, Windows và MacOS
  • làm việc với java chạy một file jar hoặc lớp tập tin trực tiếp (ví dụ như từ một IDE)
  • làm việc với J ava Web Start và hệ điều hành MacOS ứng dụng đóng gói
  • làm việc với đường dẫn chứa ký tự không gian

Số tiền thu được mã như sau:

  • thấy thời gian chạy java sử dụng tài sản java.home hệ thống
  • kiểm tra xem hệ thống sun.java.command tài sản có sẵn (không phải là trường hợp cho IBM JVM), sau đó trích xuất các lớp chính của chương trình và các đối số chương trình từ nó.
  • tái cấu trúc dòng lệnh hoặc bằng cách thêm -cp hoặc -jar lập luận, tùy thuộc vào những gì chúng tôi tìm thấy ở bước trước
  • chạy lệnh sử dụng Runtime.getRuntime().exec

Ngoài ra còn có rất nhiều thứ liên quan đến JNLP (WebStart) và ứng dụng macOS.Tôi cho rằng bạn không quan tâm đến nó nhưng tôi có thể giải thích nó nếu bạn muốn.

+0

Nhưng điều đó không sử dụng thực thi được tìm thấy trong thuộc tính hệ thống 'java.home'? Bởi vì điều đó không phù hợp với hóa đơn của tôi. – Nicolai

+0

Nó sẽ ổn thôi. Tất cả các thử nghiệm của chúng tôi cho thấy rằng thuộc tính 'java.home' được điền vào với thời gian chạy Java hiện tại, không phải là hệ thống mặc định. Bạn đã kiểm tra chưa? – vip

+0

Tôi chắc chắn rằng tôi đã thử điều đó nhưng tôi bắt đầu khám phá ra cùng ... lạ. Tôi sẽ trở lại sau nhiều lần kiểm tra ... – Nicolai

3

Giải pháp chỉ dành cho Java 9. Với

ProcessHandle.current().info().command().map(Paths::get).orElseThrow(); 

bạn sẽ có được một xử lý để thực thi java hiện tại: <JAVA_HOME>/bin/java[.exe]

Bây giờ, sử dụng (tuyệt đối) con đường với quá trình API mới theo ý thích của bạn.

+0

Đó không phải là cơ hội của một API Java 9, phải không? Tôi cần điều này để làm việc trên Java 8 là tốt (sẽ làm rõ câu hỏi). – Nicolai

+1

Dooh. Với '.orElseThrow()' được sử dụng, nó thực sự là Java 10 ... – Sormuras

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