संपादित करें: यह निर्धारित करने के लिए मेरा परीक्षण लगता है कि मूल जेवीएम बाहर निकलने के लिए शुरू हुआ था (स्वीकृत उत्तर पर टिप्पणियां देखें)। शोर के लिए खेद है।जावा का उपयोग करके, क्या मेरे पास एक जेवीएम स्पॉन हो सकता है, और उसके बाद मूल एक बाहर निकल सकता है?
मुझे एक चल रहे JVM को एक और JVM प्रारंभ करने की आवश्यकता है और फिर बाहर निकलें। मैं वर्तमान में Runtime.getRuntime().exec()
के माध्यम से ऐसा करने की कोशिश कर रहा हूं। अन्य जेवीएम शुरू होता है, लेकिन मेरा मूल जेवीएम "बच्चे" जेवीएम प्रक्रिया बंद होने तक बाहर नहीं निकलेगा। ऐसा लगता है कि Runtime.getRuntime().exec()
का उपयोग प्रक्रियाओं के बीच अभिभावक-बाल संबंध बनाता है। क्या स्पॉन्डेड प्रक्रिया को दोबारा जोड़ने का कोई तरीका है ताकि माता-पिता मर सकते हैं, या किसी अन्य प्रक्रिया को प्रक्रिया प्रक्रिया के किसी भी रिश्ते के बिना उत्पन्न करने के लिए?
ध्यान दें कि यह वास्तव में इस प्रश्न की तरह लगता है: Using Java to spawn a process and keep it running after parent quits लेकिन स्वीकार्य उत्तर वास्तव में मेरे सिस्टम (विंडोज 7, जावा 5 और 6) पर कम से कम काम नहीं करता है। ऐसा लगता है कि शायद यह एक मंच-निर्भर व्यवहार है। मैं एक अन्य प्लेटफॉर्म स्वतंत्र तरीके से अन्य प्रक्रिया को विश्वसनीय रूप से आमंत्रित करने के लिए देख रहा हूं और मेरी मूल प्रक्रिया को मरने देता हूं।
उदाहरण के लिए, मान लीजिए कि मेरे पास C:\myjar.jar
पर एक जार फ़ाइल है और मैं कक्षा com.example.RunMe
को उस जार में रहना चाहता हूं। आइए कहें कि क्लास जॉप्शनपेन पॉप अप करता है, और उसके बाद उपयोगकर्ता ठीक हो जाता है।
अब, निम्नलिखित कार्यक्रम JVM # 1 में चल रहा है: "। शुरू JVM"
public static void main(String[] args) {
String javaHome = System.getProperty("java.home");
String os = System.getProperty("os.name");
String javawBin = javaHome + File.separator + "bin" + File.separator + "javaw";
if (os.toLowerCase().contains("win")) {
javawBin += ".exe";
}
List<String> cmd = new ArrayList<String>();
cmd.add("\"" + javawBin + "\"");
cmd.add("-cp");
cmd.add("\"C:\\myjar.jar\"");
cmd.add("com.example.RunMe");
System.out.println("Running: " + cmd);
try {
System.out.println("Launching...");
Process p = Runtime.getRuntime().exec(cmd.toArray(new String[cmd.size()]));
new Thread(new StreamGobbler(p.getInputStream())).start();
new Thread(new StreamGobbler(p.getErrorStream())).start();
System.out.println("Launched JVM.");
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
}
private static class StreamGobbler implements Runnable {
InputStream stream;
StreamGobbler(InputStream stream) {
this.stream = stream;
}
public void run() {
byte[] buf = new byte[64];
try {
while (stream.read(buf) != -1)
;
} catch (IOException e) {
}
}
}
मनाया व्यवहार है कि दोनों है "का शुभारंभ ..." और मुद्रित हैं, लेकिन जेवीएम # 1 द्वारा शुरू किए गए जॉप्शनपेन में ठीक होने के बाद JVM # 1 केवल निकलता है। साथ ही - व्यवहार वही है चाहे आप स्ट्रीम गोबेलर धागे को शुरू करें या नहीं।
इसके अलावा, किसी को सांस बचाने के लिए, हाँ मुझे पता है कि मैं उस जार फ़ाइल के साथ एक नया URLClassLoader बना सकता हूं और इसे इस तरह से चला सकता हूं, लेकिन ऐसा नहीं है कि मैं यहां क्या करने की कोशिश कर रहा हूं।
क्या आप नमूना प्रदान कर सकते हैं? – OscarRyz