我怎样才能在运行时调试jar?

我从一个非常奇怪的位置(从我的java-newbie观点来看):

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

  2. 我调试了所有代码,并使用调试器, 它的工作原理

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

  4. 我将所有项目的内容导出到“runnable jar”文件中。

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

所有上述工作!

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

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

即使它是一个可运行的jar,你仍然可以从控制台运行它 – 打开一个终端窗口,导航到包含jar的目录,然后输入“java -jar yourJar.jar”。 它将在该终端窗口中运行,并且sysout和syserr输出将出现在那里,包括来自未捕获exception的堆栈跟踪。 确保将调试设置为true。 还有祝你好运。


只是想到了别的东西 – 如果你使用的是Win7,它通常会遇到用户应用程序将文件写入特定目录的权限问题。 确保您编写输出文件的目录是您具有权限的目录。

在未来的项目中,如果它足够大,您可以使用标准日志记录工具之一进行“调试”输出; 然后将它重定向到文件而不是依赖于控制台将很容易(ier)。 但对于像这样的小工作,这应该没问题。

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

基本上运行它:

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

启动时,应用程序将等待您从其他来源连接。

使用特殊选项启动java命令时,可以激活JVM的调试function:

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

在命令行上启动jar.jar会:

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

选择调试器的常用选项有:

  • Eclipse Debugger:在Run – > Debug Configurations …下 – 选择Remote Java Application – >单击New launch configuration按钮。 为此调试配置提供任意名称连接类型:标准(套接字连接)连接属性条目主机:localhost端口:8000应用更改并单击“ 调试” 。 在Eclipse Debugger成功连接到JVM的那一刻, jar.jar应该开始执行。
  • jdb命令行工具 :使用jdb -connect com.sun.jdi.SocketAttach:port=8000启动它

使用IntelliJ IDEA您可以创建Jar Application运行时配置,选择JAR ,源代码,运行JarJRE并开始调试。 这是文档。