我怎样才能在运行时调试jar?
我从一个非常奇怪的位置(从我的java-newbie观点来看):
-
使用Eclipse我写了一个“java程序”(一些带有类的.java文件),它基本上(批处理)读取文本* .csv文件,“评估”其内容,并将结果写入* _out.csv文本文件。 要找到输入文件,它使用“文件选择器”(从这里获取示例: http : //docs.oracle.com/javase/tutorial/uiswing/components/filechooser.html )
-
我调试了所有代码,并使用调试器, 它的工作原理 。
-
我运行了代码(主类,它按顺序调用所有其他代码), 它 在Eclipse中运行 。
-
我将所有项目的内容导出到“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: 8000
到stdout
和 - 然后暂停应用程序(
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
,源代码,运行Jar
的JRE
并开始调试。 这是文档。