# Wo/Wie Eclipse Plugin einhängen für Jar-Export?



## raiha (3. Jun 2009)

Hi,

versuche gerade ein Plugin zu bauen, welches (nach dem Export als Jar-File aus Eclipse herraus) das Jar noch passend signiert. Habe 2 Probleme und hoffe, dass Ihr mir ein paar Stichworte geben könnt.

1. Wo/Wie müsste ich das Plugin einhängen, dass ich das Jar noch in Eclipse "verändern" kann?

2. Wie rufe ich den Kommandozeilen-basierten JarSigner aus meinm Plugin heraus auf und bekomme die Ausgabe visualisiert? Von maven her kenne ich, dass in der IDE ja auch "Kommandozeilen-Output" angezeigt werden können.

Danke und Gruß
Raine


----------



## Wildcard (3. Jun 2009)

Also zunächst mal: wenn es dir nur um die Funktionalität als solche geht, kannst du das bspw. mit einem Ant Script machen.
Wenn du allerdings einen solchen Wizard anbieten willst, dann ist das natürlich auch machbar, allerdings musst du einen neuen Wizard erstellen, du kannst nicht einfach den existierenden Modifizieren (wenn du nicht JDT selbst modifzieren willst).

1)Du hängst dich einfach unter org.eclipse.ui.exportWizards ein und gibst dort deinen signed jar wizard an. Der kann dann natürlich vom bestehenden erben (org.eclipse.jdt.internal.ui.jarpackager.JarPackageWizard) und ihn entsprechend modifizeren.

2) Aufrufen wie in jedem anderen Java Programm auch. Anzeigen kannst du es über zB die ConsoleView. Das ist eigentlich ziemlich selbsterklärend, schau es dir einfach mal an und frag nach wenn du Probleme hast.


----------



## raiha (4. Jun 2009)

Hallo,

danke für die Hilfe. Punkt 2 mit ConsoleView und exec() konnte ich komplett abhaken .
Bei Punkt 1 (Erweiterung des exportWizards) stehe ich aber noch ein bisschen auf dem Schlauch.

Habe jetzt einen neuen Abschnitt in der plugin.xml

   <extension
         point="org.eclipse.ui.exportWizards">
   </extension>

Aber wie geht es jetzt weiter. Was für eine Klasse müsste ich jetzt stricken und wie, dass ich später "meinen Export" wählen kann?

Danke und Gruß
Rainer


----------



## raiha (4. Jun 2009)

Hi,

bin jetzt einen Schritt weiter. Habe meinen eigenen Jar-Export Wizard als Plugin eingehängt. Dieser erbt alle Funtionalität vom org.eclipse.jdt.internal.ui.jarpackager.JarPackageWizard. Jetzt stehe ich aber wieder auf dem Schlauch. Wie bekomme ich da jetzt meine eigenen Funktionalität rein?

1. Gui erweitern
2. Wenn er mit dem Exportieren fertig ist, noch selbst was mit dem Jar anstellen (abh. von den GUI-Einstellungen).

Danke und Gruß
Rainer


```
package test.ExportWizards;

import org.eclipse.jdt.internal.ui.jarpackager.JarPackageWizard;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IExportWizard;
import org.eclipse.ui.IWorkbench;

public class ExportWizard extends JarPackageWizard implements IExportWizard {
	
	public ExportWizard() {
		super();
	}

	public boolean performFinish() {
		return super.performFinish();
	}
	 
	public void init(IWorkbench workbench, IStructuredSelection selection) {
		super.init(workbench, selection);
	}

	@Override
	public void addPages() {
		super.addPages();
	}

	@Override
	public boolean canFinish() {
		return super.canFinish();
	}

	@Override
	public void createPageControls(Composite arg0) {
		super.createPageControls(arg0);
	}

	@Override
	public void dispose() {
		super.dispose();
		
	}

	@Override
	public IWizardContainer getContainer() {
		return super.getContainer();
	}

	@Override
	public Image getDefaultPageImage() {
		return super.getDefaultPageImage();
	}

	@Override
	public IDialogSettings getDialogSettings() {
		return super.getDialogSettings();
	}

	@Override
	public IWizardPage getNextPage(IWizardPage arg0) {
		return super.getNextPage(arg0);
	}

	@Override
	public IWizardPage getPage(String arg0) {
		return super.getPage(arg0);
	}

	@Override
	public int getPageCount() {
		return super.getPageCount();
	}

	@Override
	public IWizardPage[] getPages() {
		return super.getPages();
	}

	@Override
	public IWizardPage getPreviousPage(IWizardPage arg0) {
		return super.getPreviousPage(arg0);
	}

	@Override
	public IWizardPage getStartingPage() {
		return super.getStartingPage();
	}

	@Override
	public RGB getTitleBarColor() {
		return super.getTitleBarColor();
	}

	@Override
	public String getWindowTitle() {
		return super.getWindowTitle();
	}

	@Override
	public boolean isHelpAvailable() {
		return super.isHelpAvailable();
	}

	@Override
	public boolean needsPreviousAndNextButtons() {
		return super.needsPreviousAndNextButtons();
	}

	@Override
	public boolean needsProgressMonitor() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean performCancel() {
		return super.performCancel();
	}

	@Override
	public void setContainer(IWizardContainer arg0) {
		super.setContainer(arg0);		
	}
}
```


----------



## raiha (4. Jun 2009)

Wieder mal ein UPDATE:

In der Eclipsedoku sind ein paar Worte zu meinem Problem beschrieben.

Help - Eclipse SDK

Man kann es wohl mittels "JarPackageData" lösen. Aber wie und an welcher Stelle schaffe ich das aus meinem ExportWizard?
Hat jemand eine Idee?

Danke und Gruß
Rainer


----------



## Wildcard (4. Jun 2009)

Im einfachsten Fall überschreibst du einfach doFinish, rufst erst super auf um das jar dann anschließend post mortem zu signieren. Wenn du noch mehr machen willst, dann solltest du wohl addPages überschreiben und zB dort noch eine eigene einhängen.


----------



## raiha (5. Jun 2009)

Wildcard hat gesagt.:


> Im einfachsten Fall überschreibst du einfach doFinish, rufst erst super auf um das jar dann anschließend post mortem zu signieren. Wenn du noch mehr machen willst, dann solltest du wohl addPages überschreiben und zB dort noch eine eigene einhängen.



Sowas dachte ich mir schon . Wie aber komme ich in performFinish() an das erzeugte Jar bzw. dessen Pfad ran?

```
public boolean performFinish() {
		return super.performFinish();
	// ???
}
```

Danke und Gruß
Rainer


----------



## Wildcard (5. Jun 2009)

Schau doch mal ins orignal performFinish, da muss es doch auch abgefragt werden.


----------



## raiha (5. Jun 2009)

*schnüff* - Man kommt zwar im performFinish() im Debugger via Super() an die Attribute (auch das Feld in dem das *.jar steht ran) aber das war's dann auch. Da ist sichtbarkeitstechnisch scheinbar nichts zu machen :-(. Die Interfaces geben das einfach nicht her. Will man das lösen, muß man vermutlich an org.eclipse.jdt.ui ...jar ran und da was drehen. Ich glaube, dass ist aber der Aufwand nicht wert.

Trotzdem Danke für die viele Hilfe.

Gruß
Rainer


----------



## Wildcard (5. Jun 2009)

Ist alles in den JarPackageData. Mach einfach deinen eigenen Wizard, es verbietet dir ja niemand die gleichen Pages wie der Orginal Wizard einzusetzen.


----------



## raiha (6. Jun 2009)

Wildcard hat gesagt.:


> Ist alles in den JarPackageData. Mach einfach deinen eigenen Wizard, es verbietet dir ja niemand die gleichen Pages wie der Orginal Wizard einzusetzen.



Und was ist mit dem SourceCode der "originalen" Pages? Einfach copy/paste und dann mein eigendes Control + Behandlung mit rein? Via Vererbung lässt sich das leider nicht elegant lösen.

Gruß
Rainer


----------



## Wildcard (6. Jun 2009)

Die Pages sind doch eigene Klassen, die kannst du einfach wieder einbinden (und der Wizard selbst hat nicht viel Code)


----------



## raiha (7. Jun 2009)

Wildcard hat gesagt.:


> Die Pages sind doch eigene Klassen, die kannst du einfach wieder einbinden (und der Wizard selbst hat nicht viel Code)



Was meinst du mit einbinden? Eigene Implentierungen die die org. Klasse extenden geht ja leider nicht, weil die Klassen nicht sichtbar sichtbar sind:-(. Oder meinst du nur die Wizardklasse neu implementieren und die org Pages-Klassen verwenden?

```
public class ExportWizard extends JarPackageWizard implements IExportWizard {
...
}
```

Gruß Rainer


----------



## Wildcard (7. Jun 2009)

Genau. eigenen Wizard schreiben und in addPages vorhandene benutzen


----------



## raiha (8. Jun 2009)

Wildcard hat gesagt.:


> Genau. eigenen Wizard schreiben und in addPages vorhandene benutzen



Leider kann ich die bestehenden Pages mangels Sichbarkeit nicht "adden".


```
public class MyJarPackageWizard extends Wizard implements IExportWizard {

	...
	
	public void addPages() {
		super.addPages();
		...
		fJarOptionsWizardPage= new JarOptionsPage(fJarPackage);
		addPage(fJarOptionsWizardPage);
		addPage(new JarManifestWizardPage(fJarPackage));
		addPage(new JarMyPage(fJarPackage));
	}
	...
}
```

So kann ich beispielsweise keine JarOptionsPage adden. Hier müsste ich ja org.eclipse.jdt.internal.ui.jarpackager.JarOptionsPage importieren, was wegen der Sichtbarkeit verboten ist. Es kann doch unmöglich sein, dass ich hier alle einzelnen Pages Klassen ausimplementieren muß. Einfach nur in eigenen Klassen extenden geht ja wegen der Sichbarkeit leider auch nicht :-(

Danke und Gruß
Rainer


----------

