Débogage JNLP commencé application
J'ai créé un bureau Java de l'application (à l'aide de Swing) et je suis maintenant en essayant de le faire fonctionner en le démarrant à partir du net à l'aide de JNLP. L'application fonctionne très bien quand je le lance depuis le terminal, mais dès que je le lance à partir de JNLP, il ne ferme pas. J'ai manuellement tuer le processus à chaque fois.
J'ai lu qu'il pourrait y avoir un problème si mon JFrame
utilise DISPOSE_ON_CLOSE
que la valeur par défaut à proximité de la coopération, mais il ne le fait pas. Il utilise DO_NOTHING_ON_CLOSE
(implicitement). Aussi, je suis en appelant explicitement System.exit(0)
après relâchement de tous mes objets:
f = new JFrame("Pacman");
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
//Terminate the Game-loop:
GameLoop.INSTANCE.stopLoop();
//Close the application:
System.exit(0);
}
});
Je suppose qu'il pourrait y avoir une exception levée lorsque je ferme l'application, mais je ne peux pas trouver un moyen d'obtenir la console de sortie (par exemple, le Stack-Trace) d'une application en cours d'exécution a commencé avec JNLP. Voici ce que j'ai essayé:
- Commencer
javaws
avec les paramètres de débogage et de se connecter avecjconsole
(fonctionne mais je ne trouve pas toute exception ou de la console de sortie). - Commencer
javaws
avec les paramètres de débogage et de joindre IntelliJ débogueur (fonctionne aussi mais ne me donne pas toute sortie)
Alors, comment puis-je démarrer l'application avec JNLP et obtenir la sortie (écrit à la valeur par défaut de sortie et d'erreur-les ruisseaux), comme si je le ferais avec une application de bureau?
try { GameLoop.INSTANCE.stopLoop(); } catch(Exception e) { e.printStackTrace(); /* maybe pop a JOptionPane for debugging */ } // Close the application: System.exit(0);
Pourriez-vous poster le code de
GameLoop.INSTANCE.stopLoop()
? Le nom de cette méthode, je pense, qu'il peut être un wait()
ou Threa#join()
appelé qui l'attend à l'infini pour une raison quelconque. Débogage de cette méthode est aussi une bonne idée.Je ne suis pas en utilisant la
Thread
de classe, mais l'exécuteur-cadre. Donc, pas de join()
- ou wait()
-appels. Vous pouvez trouver l'ensemble de la classe (et de l'ensemble du projet) iciEst leur vraiment pas d'autre moyen de le faire (sainement)? Si l'application se bloque, je ne pense pas que ça va frayer un
JOptionPane
dans le même contexte."Est leur vraiment pas d'autre moyen de le faire" je n'ai jamais voulu insinuer que c'était la seule façon. C'est juste un " quick-n-sale façon de suspendre l'exécution avant de s'éteindre. Vous pouvez vider la pile oligo-éléments pour le volet options.
OriginalL'auteur Lukas Knuth | 2012-06-05
Vous devez vous connecter pour publier un commentaire.
Solution #1 - Activer la Console Java, et de regarder pour les exceptions.
Vous pouvez le faire via Panneau de configuration Java. Interrupteur à Avancé onglet, et dans le Console Java assurez-vous que Montrer console est sélectionné.
Ensuite, exécutez l'application et le moniteur de la console pour les exceptions. Fixer l'exception.
Solution #2 - le Débogage de votre application en cours d'exécution (correctement).
Démarrer le Web Démarrer application comme ceci (pour Java 1.6 et plus récente):
Si l'aide de précédentes versions de java (1.4.2, 1.5) définissez la variable d'environnement comme ceci:
et à exécuter l'application via:
Lorsque l'application s'exécute:
javaws
(dans ce cas:8123
).windowClosing
méthode.GameLoop.INSTANCE.stopLoop()
méthode pour voir où/quand il se bloque.Ne vous attendez pas à voir des solutions dans la console, il vous suffit de parcourir le code avec un débogueur - si l'application se bloque, il va vous montrer où.
Est le Xnoagent option vraiment nécessaire pour les nouvelles Versions de Java?
Après le lancement de javaws avec option proposée dans la Solution#2, avec java 7 mon de lancement des applications, mais lors du démarrage du débogueur de eclipse il donner d'erreur qui ne pouvait pas se connecter à la VM. J'ai spécifié le bon port (8123) qui a été utilisé pour le lancement de javaws. Une observation a été que javaws était pas à l'affiche dans le gestionnaire des tâches en tant que le processus qui m'a surpris que l'application a été le lancement d'.
OriginalL'auteur npe
Il y a des moments où même la console ne veut pas montrer quoi que ce soit, par exemple quand il y a un problème avec la négociation TLS/SSL (c'est à dire un close_notify ou handshake_failure). Dans ces cas, vous devez effectuer les opérations suivantes:
Activer le Java journaux et de traçabilité dans le Panneau de configuration Java > Avancé.
Activer les paramètres de débogage Java & lancement de la JNLP, il y a deux façons dont vous pouvez faire:
2.un. Télécharger le fichier JNLP et de l'exécuter en ligne de commande (la
SET
de commande n'est pas nécessaire dans ce cas particulier).2.b. Ajouter des arguments (c'est à dire
-Djavax.net.debug=all
) de la JVM dans le Panneau de configuration Java > Java > Afficher (ce n'est pas nécessaire dans ce cas particulier), et de lancer le fichier JNLP de navigateur:Les journaux et les traces sont situés dans le
log
répertoire à partir de la Java Déploiement De La Maison d'où je colle ces endroits:un. Windows XP:
%HOME%\Application Data\Sun\Java\Deployment
b. Windows 7/Vista:
%APPDATA%\..\LocalLow\Sun\Java\Deployment
c. Linux/Solaris:
%HOME%/.java/deployment
OriginalL'auteur lmiguelmh