从命令行控制 Netbeans:从 Shell 脚本附加调试器 [英] Control Netbeans from Commandline: attach Debugger from Shell-script

查看:67
本文介绍了从命令行控制 Netbeans:从 Shell 脚本附加调试器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用监控远程服务器的守护程序脚本.当远程服务器启动时,我希望 Netbeans 自动将它的调试器连接到远程服务器.

I'm using a daemon-script which is monitoring a remote server. When the remote server is up, i want that Netbeans automatically connects it's Debugger to the remote Server.

是否可以从命令行控制这种行为?输入类似

Is it possible to control this behavior from commandline? To type Something like

netbeans --attach-debugger 192.168.178.34:9009

在终端里面做那个?或者我还有什么其他方式可以访问 Netbeans 内部的东西?(直到现在,我只是 Netbeans 的用户",所以我不知道内部结构以及如何很好地访问它们)

inside a terminal to do that? Or what other ways do i have to get access to Netbeans-internal stuff? (until now, i was just a "user" of Netbeans so i don't know the internals and how to access them very well)

或者我是否必须编写一个 Netbeans 插件才能做到这一点?如果是,您能给我一个添加该功能的良好起点吗?

Or will i have to write a Netbeans Plugin to do that? If yes, can you give me a good starting point to add that functionality?

推荐答案

好的,因为没有从命令行附加调试器的选项,我在 此博客条目此来自 NB 邮件列表的线程.现在我可以从命令行调用我的插件操作.

Ok since there is no option to attach the Debugger from commandline, i wrote a Netbeans Plugin with the help of this blog entry and this thread from the NB-mailinglist. Now i'm able to call my plugin actions from the Commandline.

因此构建一个简单的 NetBeans 模块,其中包含 2 个重要的类.这是获取命令行参数并将它们转发到我的 Action 的类:

So build a simple NetBeans Module, which contains 2 important classes. This is the class which gets the commandline parameters and forwards them to my Action:

import java.awt.event.ActionEvent;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;
import javax.swing.Action;
import org.netbeans.api.sendopts.CommandException;
import org.netbeans.spi.sendopts.Env;
import org.netbeans.spi.sendopts.OptionProcessor;
import org.netbeans.spi.sendopts.Option;
import org.openide.ErrorManager;
import org.openide.cookies.InstanceCookie;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.loaders.DataObject;
import org.openide.util.lookup.ServiceProvider;
import org.openide.windows.WindowManager;

@ServiceProvider(service = OptionProcessor.class)
public class TriggerActionCommandLine extends OptionProcessor {

    //Here we specify "runAction" as the new key in the command,
    //but it could be any other string you like, of course:
    private static Option action = Option.requiredArgument(Option.NO_SHORT_NAME, "debug");

    private static final Logger logger = Logger.getLogger(AttachDebugger.class.getName());

    @Override
    public Set<org.netbeans.spi.sendopts.Option> getOptions() {
        return Collections.singleton(action);
    }

    @Override
    protected void process(Env env, Map<Option, String[]> values) throws CommandException {
        final String[] args = (String[]) values.get(action);
        if (args.length > 0) {
            //Set the value to be the first argument from the command line,
            //i.e., this is "GreetAction", for example:
            final String ip = args[0];
            //Wait until the UI is constructed,
            //otherwise you will fail to retrieve your action:
            WindowManager.getDefault().invokeWhenUIReady(new Runnable() {
                @Override
                public void run() {
                    //Then find & perform the action: 
                    Action a = findAction(AttachDebugger.ACTION_NAME);
                    // forward IP address to Action
                    ActionEvent e = new ActionEvent(this, 1, ip);
                    a.actionPerformed(e);
                }
            });
        }
    }

    public Action findAction(String actionName) {
        FileObject myActionsFolder = FileUtil.getConfigFile("Actions/PSFActions");
        FileObject[] myActionsFolderKids = myActionsFolder.getChildren();
        for (FileObject fileObject : myActionsFolderKids) {
            logger.info(fileObject.getName());
            //Probably want to make this more robust,
            //but the point is that here we find a particular Action:
            if (fileObject.getName().contains(actionName)) {
                try {
                    DataObject dob = DataObject.find(fileObject);
                    InstanceCookie ic = dob.getLookup().lookup(InstanceCookie.class);
                    if (ic != null) {
                        Object instance = ic.instanceCreate();
                        if (instance instanceof Action) {
                            Action a = (Action) instance;
                            return a;
                        }
                    }
                } catch (Exception e) {
                    ErrorManager.getDefault().notify(ErrorManager.WARNING, e);
                    return null;
                }
            }
        }
        return null;
    }

}

这是我的插件操作,它将调试器附加到给定的远程地址:

This is my Plugin Action which attaches the Debugger to the given remote address:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.netbeans.api.debugger.jpda.DebuggerStartException;
import org.netbeans.api.debugger.jpda.JPDADebugger;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.awt.ActionRegistration;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionReferences;
import org.openide.awt.ActionID;
import org.python.util.PythonInterpreter;

@ActionID(category = "PSFActions", id = "de.mackaz.AttachDebugger")
@ActionRegistration(displayName = "#CTL_AttachDebuggerAction")
@ActionReferences({
    @ActionReference(path = "Menu/Tools", position = 1800, separatorBefore = 1750, separatorAfter = 1850)
})
public final class AttachDebugger implements ActionListener {

    private static final Logger logger = Logger.getLogger(AttachDebugger.class.getName());

    public static final String ACTION_NAME="AttachDebugger";

    @Override
    public void actionPerformed(ActionEvent e) {
        String ip;
        if (!e.getActionCommand().contains("Attach Debugger")) {
            ip = e.getActionCommand();
        } else {
            ip = lookupIP();
        }
        try {
            logger.log(Level.INFO, "Attaching Debugger to IP {0}", ip);
            JPDADebugger.attach(
                    ip,
                    9009,
                    new Object[]{null});
        } catch (DebuggerStartException ex) {
            int msgType = NotifyDescriptor.ERROR_MESSAGE;
            String msg = "Failed to connect debugger to remote IP " + ip;
            NotifyDescriptor errorDescriptor = new NotifyDescriptor.Message(msg, msgType);
            DialogDisplayer.getDefault().notify(errorDescriptor);
        }
    }
}

现在我可以通过调用 netbeans/bin/netbeans --debug 192.168.178.79

这篇关于从命令行控制 Netbeans:从 Shell 脚本附加调试器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆