Bagaimana cara memulai ulang aplikasi Java AWT? Saya memiliki tombol yang telah saya lampirkan penangan kejadian. Kode apa yang harus saya gunakan untuk memulai ulang aplikasi?
Saya ingin melakukan hal yang sama dengan yang Application.Restart()
dilakukan di aplikasi C #.
java
restart
application-restart
Azfar Niaz
sumber
sumber
Jawaban:
Tentu saja dimungkinkan untuk memulai ulang aplikasi Java.
Metode berikut menunjukkan cara untuk memulai ulang aplikasi Java:
Pada dasarnya ini melakukan hal berikut:
MyClassInTheJar
kelas untuk menemukan lokasi jar itu sendiri)sumber
System.exit(0)
menghentikan proses anak memiliki jawaban yang sama seperti apakah jawaban ini benar-benar berfungsi dan mengapa. Jika Anda tidak dapat memberikan penjelasan yang masuk akal bersama dengan jawaban Anda, Anda melakukan pekerjaan yang buruk. Jawaban yang memberikan lebih banyak pertanyaan daripada jawaban bukanlah contoh jawaban yang menyeluruh. Jawaban yang baik tidak hanya menunjukkan kode tetapi juga menjelaskan bagaimana dan mengapa mereka bekerja, bahwa kekurangannya dan apa alternatifnya. Anda bahkan tidak mencoba menutupi hal-hal ini.Didedikasikan untuk semua orang yang mengatakan itu tidak mungkin.
Program ini mengumpulkan semua informasi yang tersedia untuk merekonstruksi baris perintah asli. Kemudian, itu meluncurkannya dan karena ini adalah perintah yang sama, aplikasi Anda memulai untuk kedua kalinya. Kemudian kita keluar dari program aslinya, program anak tetap berjalan (bahkan di Linux) dan melakukan hal yang sama.
PERINGATAN : Jika Anda menjalankan ini, ketahuilah bahwa ini tidak pernah berhenti membuat proses baru, mirip dengan bom garpu .
sumber
ManagementFactory.getRuntimeMXBean().getInputArguments()
hanya akan memberi Anda argumen input yang diteruskan ke JVM. Ini melewatkan parameter yang diteruskan ke aplikasi Anda. misalnyajava -jar start.jar -MISSED_PARAM=true
,. Pada oracle jvm, Anda dapat mengambil parameter tersebut menggunakanSystem.getProperty("sun.java.command")
.ProcessBuilder
daninheritIO()
, VM anak dapat dimulai dengan cara yang akan diakhiri oleh VM induk.Pada dasarnya, Anda tidak bisa. Setidaknya tidak dengan cara yang dapat diandalkan. Namun, Anda tidak perlu melakukannya.
Tidak bisa berpisah
Untuk memulai ulang program Java, Anda perlu memulai ulang JVM. Untuk memulai ulang JVM, Anda perlu
Temukan
java
peluncur yang digunakan. Anda dapat mencobaSystem.getProperty("java.home")
tetapi tidak ada jaminan bahwa ini benar-benar akan mengarah ke peluncur yang digunakan untuk meluncurkan aplikasi Anda. (Nilai yang dikembalikan mungkin tidak mengarah ke JRE yang digunakan untuk meluncurkan aplikasi atau bisa saja diganti oleh-Djava.home
.)Anda mungkin ingin menghormati pengaturan memori asli dll (
-Xmx
,,-Xms
…) jadi Anda perlu mencari tahu pengaturan mana yang digunakan untuk memulai JVM pertama. Anda dapat mencoba menggunakanManagementFactory.getRuntimeMXBean().getInputArguments()
tetapi tidak ada jaminan bahwa ini akan mencerminkan pengaturan yang digunakan. Ini bahkan dijabarkan dalam dokumentasi metode itu:Jika program Anda membaca input dari
Standard.in
stdin asli akan hilang di restart.Banyak dari trik dan peretasan ini akan gagal jika ada file
SecurityManager
.The seharusnya tidak perlu bagian
Saya menyarankan Anda untuk mendesain aplikasi Anda sehingga mudah untuk membersihkan semuanya dan setelah itu buat instance baru dari kelas "utama" Anda.
Banyak aplikasi dirancang untuk tidak melakukan apa pun selain membuat instance dalam metode utama:
Dengan menggunakan pola ini, seharusnya cukup mudah untuk melakukan sesuatu seperti:
dan biarkan
launch()
mengembalikan true jika dan hanya jika aplikasi ditutup sedemikian rupa sehingga perlu dimulai ulang.sumber
java
! Anda lupa bahwa Java adalah spesifikasi bahasa, bukan program. Bagaimana jika saya menjalankan program Anda menggunakan jvm lain, seperti kaffe misalnya? Memperbarui jawaban saya :-)Sebenarnya, program Java tidak dapat memulai ulang sendiri karena untuk melakukannya, program tersebut harus mematikan JVM yang menjalankannya dan kemudian memulainya lagi, tetapi setelah JVM tidak lagi berjalan (dimatikan) maka tidak ada tindakan yang dapat diambil.
Anda dapat melakukan beberapa trik dengan pemuat kelas khusus untuk memuat, mengemas, dan memulai komponen AWT lagi tetapi ini kemungkinan akan menyebabkan banyak sakit kepala terkait dengan loop peristiwa GUI.
Bergantung pada bagaimana aplikasi diluncurkan, Anda dapat memulai JVM dalam skrip pembungkus yang berisi perulangan do / while, yang berlanjut saat JVM keluar dengan kode tertentu, maka aplikasi AWT harus memanggil
System.exit(RESTART_CODE)
. Misalnya, dalam pembuatan skrip pseudocode:Aplikasi AWT harus keluar dari JVM dengan sesuatu selain RESTART_CODE pada penghentian "normal" yang tidak memerlukan restart.
sumber
JavaApplicationStub
... Tidak yakin apakah ada cara mudah untuk itu.Eclipse biasanya dimulai ulang setelah plugin diinstal. Mereka melakukan ini menggunakan eclipse.exe pembungkus (aplikasi peluncur) untuk windows. Aplikasi ini menjalankan jar pelari gerhana inti dan jika aplikasi java gerhana diakhiri dengan kode peluncuran ulang, eclipse.exe memulai ulang meja kerja. Anda dapat membuat kode asli, skrip shell, atau pembungkus kode java lain yang serupa untuk memulai ulang.
sumber
Windows
/ mnt untuk memulai skrip di jendela yang diperkecil
^ & keluar untuk menutup jendela cmd setelah selesai
contoh skrip cmd
tidur 10 tidur selama 10 detik
sumber
Jika Anda benar-benar perlu memulai ulang aplikasi Anda, Anda dapat menulis aplikasi terpisah untuk memulainya ...
Halaman ini memberikan banyak contoh berbeda untuk berbagai skenario:
http://www.rgagnon.com/javadetails/java-0014.html
sumber
Meskipun pertanyaan ini sudah lama dan sudah terjawab, saya telah menemukan masalah dengan beberapa solusi dan memutuskan untuk menambahkan saran saya ke dalam campuran.
Masalah dengan beberapa solusi adalah mereka membangun satu string perintah. Ini menimbulkan masalah ketika beberapa parameter berisi spasi, terutama java.home .
Misalnya, di jendela, baris
Mungkin mengembalikan sesuatu seperti ini:
C:\Program Files\Java\jre7\bin\java
String ini harus dibungkus dengan tanda kutip atau di-escape karena spasi di dalamnya
Program Files
. Bukan masalah besar, tapi agak mengganggu dan rawan error, terutama pada aplikasi lintas platform.Oleh karena itu solusi saya membangun perintah sebagai larik perintah:
sumber
Saya sendiri sedang meneliti subjeknya ketika menemukan pertanyaan ini.
Terlepas dari kenyataan bahwa jawabannya sudah diterima, saya tetap ingin menawarkan pendekatan alternatif untuk kelengkapan. Secara khusus, Apache Ant berfungsi sebagai solusi yang sangat fleksibel.
Pada dasarnya, semuanya bermuara pada file skrip Ant dengan satu tugas eksekusi Java (lihat di sini dan di sini ) yang dipanggil dari kode Java (lihat di sini ). Kode Java ini, yang bisa menjadi metode peluncuran , bisa menjadi bagian dari aplikasi yang perlu direstart. Aplikasi harus memiliki ketergantungan pada pustaka Apache Ant (jar).
Setiap kali aplikasi perlu dimulai ulang, itu harus memanggil peluncuran metode dan keluar dari VM. Tugas Ant java harus memiliki opsi fork dan spawn disetel ke true.
Berikut adalah contoh skrip Ant:
Kode untuk metode peluncuran mungkin terlihat seperti ini:
}
Hal yang sangat mudah di sini adalah bahwa skrip yang sama digunakan untuk aplikasi awal dan juga untuk memulai ulang.
sumber
Hanya menambahkan informasi yang tidak ada di jawaban lain.
Jika procfs
/proc/self/cmdline
tersediaJika Anda menjalankan di lingkungan yang menyediakan procfs dan karena itu memiliki
/proc
sistem file yang tersedia (yang berarti ini bukan solusi portabel), Anda dapat meminta Java membaca/proc/self/cmdline
untuk memulai ulang sendiri, seperti ini:Pada sistem yang
/proc/self/cmdline
tersedia, ini mungkin cara paling elegan untuk "memulai ulang" proses Java saat ini dari Java. Tidak ada JNI yang terlibat, dan tidak perlu menebak jalur dan hal-hal yang diperlukan. Ini juga akan menangani semua opsi JVM yang diteruskan kejava
biner. Baris perintah akan sama persis dengan salah satu proses JVM saat ini.Banyak sistem UNIX termasuk GNU / Linux (termasuk Android) saat ini memiliki procfs Namun pada beberapa sistem seperti FreeBSD, ini sudah usang dan dihentikan. Mac OS X adalah pengecualian dalam arti tidak memiliki procfs . Windows juga tidak memiliki procfs . Cygwin memiliki procfs tetapi tidak terlihat di Java karena hanya terlihat oleh aplikasi yang menggunakan Cygwin DLL, bukan panggilan sistem Windows, dan Java tidak mengetahui Cygwin.
Jangan lupa gunakan
ProcessBuilder.inheritIO()
Standarnya adalah
stdin
/stdout
/stderr
(dalam Java disebutSystem.in
/System.out
/System.err
) dari Proses yang dimulai diatur ke pipa yang memungkinkan proses yang sedang berjalan untuk berkomunikasi dengan proses yang baru dimulai. Jika Anda ingin memulai kembali proses saat ini, ini kemungkinan besar ini bukan yang Anda inginkan . Sebaliknya Anda ingin agarstdin
/stdout
/stderr
sama dengan VM saat ini. Ini disebut warisan . Anda dapat melakukannya dengan memanggil instanceinheritIO()
AndaProcessBuilder
.Jebakan di Windows
Kasus penggunaan yang sering dari suatu
restart()
fungsi adalah memulai ulang aplikasi setelah pembaruan. Terakhir kali saya mencoba ini di Windows, ini bermasalah. Saat menimpa file aplikasi.jar
dengan versi baru, aplikasi mulai berperilaku tidak semestinya dan memberikan pengecualian tentang.jar
file tersebut. Saya hanya memberi tahu, kalau-kalau ini kasus penggunaan Anda. Saat itu saya memecahkan masalah dengan membungkus aplikasi dalam file batch dan menggunakan nilai kembali ajaib dariSystem.exit()
yang saya tanyakan di file batch dan file batch memulai ulang aplikasi sebagai gantinya.sumber
Pertanyaan lama dan semua itu. Tapi ini adalah cara lain yang menawarkan beberapa keuntungan.
Di Windows, Anda dapat meminta penjadwal tugas untuk memulai aplikasi Anda lagi untuk Anda. Keuntungannya adalah menunggu beberapa saat sebelum aplikasi dimulai ulang. Anda dapat pergi ke pengelola tugas dan menghapus tugas dan itu berhenti berulang.
sumber
Mirip dengan jawaban ' ditingkatkan ' Yoda , tetapi dengan peningkatan lebih lanjut (baik fungsional, keterbacaan, dan kemampuan pengujian). Sekarang aman untuk dijalankan, dan dimulai ulang sebanyak jumlah argumen program yang diberikan.
JAVA_TOOL_OPTIONS
opsi.Perbaikan Bug V1.1: pointer null jika JAVA_TOOL_OPTIONS tidak disetel
Contoh:
sumber
Saya kira Anda tidak benar-benar ingin menghentikan aplikasi, tetapi untuk "Memulai kembali". Untuk itu, Anda dapat menggunakan ini dan menambahkan "Reset" Anda sebelum tidur dan setelah jendela tak terlihat.
sumber