Comment puis-je déboguer un jar à l'exécution?

Je suis dans une position assez étrange (de mon point de vue java-newbie):

  1. En utilisant Eclipse j'ai écrit un " programme java "(certains .fichiers java avec des classes dans) qui essentiellement (lot) lit un texte *.fichier csv, "évalue" son contenu, et écrit les résultats dans un * _out.fichier texte csv. Pour localiser le fichier d'entrée, il utilise un "sélecteur de fichiers" (exemple obtenu ici: http://docs.oracle.com/javase/tutorial/uiswing/components/filechooser.html)

  2. J'ai débogué tout le code et, en utilisant le débogueur, cela fonctionne .

  3. J'ai couru le code (la classe principale, qui appelle tous les autres en séquence) et cela fonctionne, alors que dans Eclipse .

  4. J'ai exporté tout le contenu du projet dans un fichier "JAR exécutable".

Notez que, sélecteur de fichiers à part, il s'agit principalement d'un "lot" qui lit et écrit: presque pas D'Interface utilisateur du tout. Alors que dans Eclipse j'ai montré quelques résultats internes en utilisant quelque chose comme " if(debug) système.hors.print("quelque chose à imprimer"); "fournir à set" debug " TRUE pendant le débogage et FALSE dans l'environnement de production.

Tout ce qui précède a fonctionné!

Maintenant, en démarrant le jar exécutable (double-cliquez sur le fichier jar, dans Win / XP), je peux voir le sélecteur de fichiers et je peux l'utiliser mais, après avoir choisi le fichier d'entrée... rien de plus : (n'ayant pas d'interface utilisateur) Je ne sais pas si le fichier a été lu, je ne vois pas tout fichier de sortie généré, et je n'ai même pas de "console" pour lister un message de débogage intermédiaire, pour voir si le jar fonctionne, même si je le réexporte avec la variable de débogage définie sur TRUE.

Existe-t-il un moyen de "déboguer l'exécution" du jar en cours d'exécution (comme MsgBox de VB, ou autre chose)? une sorte de "fichier journal" je peut "activer" ou regarder dans? (évidemment, comme mon jar n'écrit pas le fichier de résultat, Je ne peux tout simplement pas essayer d'écrire un *.journal trop) Je dois aussi dire que je ne peux pas installer autre que Eclipse sur ma machine (et juste eu de la chance qu'il a couru), donc pas d'outils de développement habituels, utilitaires et autres choses utiles.

29
demandé sur Andrea 2013-11-07 21:14:41

4 réponses

Même s'il s'agit d'un jar exécutable, Vous pouvez toujours l'exécuter à partir d'une console-ouvrez une fenêtre de terminal, accédez au répertoire contenant le jar et entrez "java-jar yourJar.pot". Il s'exécutera dans cette fenêtre de terminal, et la sortie sysout et syserr y apparaîtra, y compris les traces de pile des exceptions non interceptées. Assurez-vous que votre débogage est défini sur true. Et bonne chance.


Juste pensé à autre chose - si vous êtes sur Win7, il a souvent des problèmes d'autorisation avec l'utilisateur applications écrivant des fichiers dans des répertoires spécifiques. Assurez-vous que le répertoire dans lequel vous écrivez votre fichier de sortie est celui pour lequel vous avez les droits.

Dans un futur projet, s'il est assez grand, vous pouvez utiliser l'une des fonctions de journalisation standard pour la sortie 'debug'; alors il sera facile(ier) de le rediriger vers un fichier au lieu de dépendre d'une console. Mais pour un travail plus petit comme celui-ci, cela devrait être bien.

12
répondu arcy 2013-11-07 17:34:04

Http://www.eclipsezone.com/eclipse/forums/t53459.html

Exécutez-le avec:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=1044

L'application, au lancement, attendra jusqu'à ce que vous vous connectiez à partir d'une autre source.

70
répondu RamonBoza 2015-09-04 16:25:02

Vous pouvez activer la capacité de débogage de la JVM lors du démarrage de la commande java avec une option spéciale:

java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y -jar path/to/some/war/or/jar.jar

Démarrage jar.jar comme ça sur la ligne de commande:

  • mettez ce JVM instance dans le rôle d'un serveur (server=y) écoute sur le port 8000 (address=8000)
  • écrire Listening for transport dt_socket at address: 8000 à stdout et
  • puis mettre en pause l'application (suspend=y) jusqu'à ce qu'un débogueur se connecte. Le débogueur agit en tant que client dans ce scénario.

Les options courantes pour sélectionner un débogueur sont:

  • Débogueur Eclipse: Sous Exécuter -> Configurations De Débogage... - > sélectionnez Application Java distante - > cliquez sur le bouton nouvelle configuration de lancement . Fournissez un Nom arbitraire pour cette configuration de débogage, Type de connexion: Standard (Socket Attach) et comme Propriétés de connexion les entrées hôte: localhost, Port: 8000. Appliquer les Modifications et cliquez sur Debug. Au moment où le débogueur Eclipse s'est connecté avec succès à la JVM, jar.jar devrait commencer à s'exécuter.
  • outil de ligne de commande jdb : démarrez-le avec jdb -connect com.sun.jdi.SocketAttach:port=8000
31
répondu Abdull 2016-07-13 17:04:02

Avec IntelliJ IDEA vous pouvez créer un Jar Application configuration d'exécution, sélectionnez le JAR, les sources, les JRE pour exécuter le Jar avec et démarrer le débogage. Voici la documentation.

0
répondu BullyWiiPlaza 2018-09-04 19:50:44