2010-12-16 4 views
1

Ich verwende ein Daemon-Skript, das einen Remote-Server überwacht. Wenn der Remote-Server aktiv ist, möchte ich, dass Netbeans seinen Debugger automatisch mit dem Remote-Server verbindet.Steuern Netbeans von Commandline: anfügen Debugger von Shell-Skript

Kann dieses Verhalten über die Befehlszeile gesteuert werden? zu etwas wie

netbeans --attach-debugger 192.168.178.34:9009 

in einem Terminal eingeben, das zu tun? Oder welche anderen Möglichkeiten habe ich, Zugang zu Netbeans-internem Zeug zu bekommen? (Bis jetzt war ich nur ein "Benutzer" von Netbeans, also kenne ich nicht die Interna und wie man auf sie sehr gut zugreift)

Oder muss ich ein Netbeans-Plugin schreiben, um das zu tun? Wenn ja, können Sie mir einen guten Ausgangspunkt geben, um diese Funktionalität hinzuzufügen?

Antwort

3

Ok, da es keine Option gibt, den Debugger an die Kommandozeile anzuhängen, schrieb ich ein Netbeans Plugin mit Hilfe von this blog entry und this thread von der NB-Mailingliste. Jetzt kann ich meine Plugin-Aktionen von der Kommandozeile aus aufrufen.

Erstellen Sie ein einfaches NetBeans-Modul, das 2 wichtige Klassen enthält. Diese ist die Klasse, die die Kommandozeilen-Parameter erhält und leitet sie an meine Aktion:

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; 
    } 

} 

Das ist mein Plugin Aktion, die den Debugger an die angegebene Remote-Adresse legt:

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); 
     } 
    } 
} 

Jetzt kann ich anhängen der Netbeans-Debugger an eine bestimmte Adresse durch Aufruf netbeans/bin/netbeans --debug 192.168.178.79