在开发Java应用程序的过程中,可能会遇到需要从IDE中远程调试正在运行的Java应用程序的情况。幸运的是,JVM提供了远程调试支持,大多数IDE也具备了调试远程应用程序的能力。本文将通过一个示例,展示如何使用Eclipse进行远程调试。本示例在以下平台上进行了测试:
如果是Eclipse和Java编程的新手,可以参考之前的文章《设置Eclipse用于Java开发》。
为了测试Eclipse的远程调试功能,创建了一个小型的Swing应用程序,该程序在Eclipse的包资源管理器中显示。这个小型Swing应用程序实现在"SwingApplication.java"文件中。
package com.song.simpleapp;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class SwingApplication extends JFrame {
private static final long serialVersionUID = 1L;
public SwingApplication() {
setSize(800, 500);
setTitle("一个简单的Swing应用程序 - 远程调试测试");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton btn = new JButton("点击");
btn.setFont(new Font(Font.SERIF, Font.BOLD, 16));
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String remote = "远程";
String debugging = "调试";
String test = "测试";
String message = remote + " " + debugging + " " + test + " 正在进行中!";
JOptionPane.showMessageDialog(null, message);
}
});
add(btn);
setVisible(true);
}
public static void main(String[] args) {
new SwingApplication();
}
}
这是一个非常简单的Swing应用程序。在这个应用程序中,在JFrame上添加了一个JButton。点击按钮会弹出一个消息对话框。
为了使应用程序能够独立于Eclipse运行(远程),可以导出一个Jar文件。在Eclipse中,可以通过右键点击项目 -> 导出来打开导出工具。
由于正在导出一个jar文件,可以从Java部分中选择它,然后点击"下一步"按钮。由于不需要在jar文件中包含".classpath"和".project"文件,可以取消它们旁边的复选框。然后可以为jar文件选择一个位置并命名。如果点击"完成"按钮,jar文件将在期望的位置生成。
为了远程调试应用程序,需要在启动时添加两个额外的参数。
如果想详细了解这些选项参数,可以查看和。确保正确的JRE在环境路径中,可以使用以下命令从jar文件所在的目录启动Swing应用程序。
java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n -cp ASimpleSwingApplication.jar com.song.simpleapp.SwingApplication
在导出jar文件时,将其命名为"ASimpleSwingApplication.jar"。如果想自己重复这个实验,并且如果给jar文件起了不同的名字,需要在启动应用程序时指定正确的文件名。成功启动后,将看到以下应用程序正在运行。
根据Oracle文档,"-Xdebug"选项不应在生产环境中使用,除非想调试应用程序,如果使用"-Xdebug"选项,应用程序将不会以全速运行。
为了远程调试运行中的应用程序,Eclipse将需要应用程序的源代码。如果已经关闭了Eclipse,可以重新启动它并将工作区加载到其中。然后可以右键点击项目 -> 调试为 -> "调试配置..."来打开调试配置工具。
由于将要远程调试应用程序,需要在窗口的左侧选择"远程Java应用程序"。
然后可以点击"调试"按钮来调试应用程序。如果在"actionPerformed"方法中设置了一个断点,然后点击运行中的应用程序中的"点击"按钮,将看到断点在Eclipse中被命中。
然后可以逐步执行代码,并享受Eclipse的所有调试功能和良好特性,就好像应用程序是从Eclipse本身启动的一样。