如何在运行时调试 jar?

2022-08-31 20:00:27

我陷入了一个非常奇怪的位置(从我的java新手的角度来看):

  1. 使用Eclipse,我编写了一个“java程序”(一些带有类的.java文件),它基本上(批处理)读取文本*.csv文件,“评估”其内容,并将结果写出到*_out.csv文本文件中。要找到输入文件,它使用“文件选择器”(从此处获取示例:http://docs.oracle.com/javase/tutorial/uiswing/components/filechooser.html)

  2. 我调试了所有代码,并使用调试器,它可以正常工作

  3. 我运行了代码(主类,它按顺序调用所有其他类),它在Eclipse中工作

  4. 我将项目的所有内容导出到一个“可运行的jar”文件中。

请注意,除了文件选择器之外,这主要是一个读取和写入的“批处理”:几乎没有用户界面。在 Eclipse 中,我使用“if(debug) System.out.print(”something to print“)”)等内容显示了一些内部结果;“在调试时设置”调试“TRUE,在生产环境中设置 FALSE。

以上都有效!

现在,启动可运行的jar(在Win / XP中双击jar文件),我可以看到文件选择器,我可以使用它,但是,在选择输入文件之后...仅此而已:(没有用户界面)我不知道文件是否被读取,我没有看到任何生成的输出文件,我甚至没有“控制台”来列出任何中间调试消息,以查看jar是否正常工作,即使我将其重新导出,调试变量设置为TRUE。

有没有办法“运行时调试”正在运行的jar(如VB的MsgBox或其他)?某种“日志文件”我可以“启用”或查看?(显然,由于我的jar没有写入结果文件,所以我不能尝试编写*.log)我还必须说,除了Eclipse之外,我就无法在我的机器上安装其他设备(而且很幸运它运行了),所以没有通常的开发人员工具,实用程序和其他有用的东西。


答案 1

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

基本上运行它:

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

应用程序在启动时将等到您从另一个源进行连接。

所以 CLI 命令将是:

java -jar yourJarFileName.jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=1044

答案 2

您可以使用特殊选项在启动命令时激活 JVM 的调试功能:java

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

在命令行上像这样启动将:jar.jar

  • 将此 JVM 实例置于侦听端口 8000 (server=yaddress=8000)
  • 写到和Listening for transport dt_socket at address: 8000stdout
  • 然后暂停应用程序 (),直到某个调试器连接。在此方案中,调试器充当客户端suspend=y

选择调试器的常用选项包括:

  • Eclipse 调试器:在“运行 ->调试配置...” 下 ->选择“远程 Java 应用程序”->单击“新建启动配置”按钮。为此调试配置提供任意名称连接类型:标准(套接字连接),并将条目“主机:本地主机”、“端口:8000”作为连接属性应用更改,然后单击调试。在 Eclipse Debugger 已成功连接到 JVM 的那一刻,应该开始执行。jar.jar
  • jdb 命令行工具:启动它jdb -connect com.sun.jdi.SocketAttach:port=8000