<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		
		<title>JNBB - Joschs NetBeans Blog</title>
		<link>http://www.sepix.de/blogs/blogrittner</link>
		<description>News zu Java und NetBeans</description>
		<language>de</language>
		<image>
			<title>JNBB - Joschs NetBeans Blog</title>
			<url>http://www.sepix.de/fileadmin/jnbb.gif</url>
			<link>http://www.sepix.de/blogs/blogrittner</link>
			<width>47</width>
			<height>48</height>
			<description>News zu Java und NetBeans</description>
		</image>
		<generator>TYPO3 - get.content.right</generator>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		
		
		
		<lastBuildDate>Mon, 26 Jul 2010 17:01:00 +0200</lastBuildDate>
		
		
		<item>
			<title>BeanDev: Lookups - InstanceContent Inhalt löschen</title>
			<link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_lookups_instancecontent_inhalt_loeschen/index.html</link>
			<description>Moin!
Um den Inhalt eines InstanceContent komplett zu löschen, ohne die beinhalteten Objekte zu...</description>
			<content:encoded><![CDATA[<p class="bodytext">Moin!</p>
<p class="bodytext"><br />Um den Inhalt eines <a href="http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/lookup/InstanceContent.html" title="API InstanceContent" target="_blank" class="external-link-new-window" >InstanceContent</a> komplett zu löschen, ohne die beinhalteten Objekte zu kennen, gibt es folgenden Befehl:</p>
<pre>content.set (Arrays.asList (Object.class), null);</pre>
<p class="bodytext">Das erspart in einigen Szenarien unnötige Klimmzüge. Mit dem Befehl werden alle Dictonary-Objekte vom Typ Object.class mit dem Wert null besetzt. Da alle Java-Objekte immer vom Typ <a href="http://java.sun.com/javase/6/docs/api/java/lang/Object.html" title="Java API: Object" target="_blank" class="external-link-new-window" >Object</a> sind, ist die Registry in dem InstanceContent zurückgesetzt. Im Ergebnis gibt das <a href="http://bits.netbeans.org/dev/javadoc/org-openide-util-lookup/org/openide/util/Lookup.html" title="API: Lookup" target="_blank" class="external-link-new-window" >Lookup</a> (das den Content besitzt) nichts mehr zurück, ist also leer.</p>
<p class="bodytext">Beste Grüße,<br />&nbsp; Josch.</p>]]></content:encoded>
			<category>NetBeans Plattform</category>
			
			<author>rittner@sepix.de</author>
			<pubDate>Mon, 26 Jul 2010 17:01:00 +0200</pubDate>
		</item>
		
		<item>
			<title>BeanDev: Plugin Manager konfigurieren</title>
			<link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_plugin_manager_konfigurieren/index.html</link>
			<description>Es gibt eine sehr gute FAQ die zu meinem alten Blog Eintrag zum AutoUpdate Center passt:...</description>
			<content:encoded><![CDATA[<p class="bodytext">Es gibt eine sehr gute FAQ die zu meinem alten Blog Eintrag zum <a href="http://www.sepix.de/blogs/blogrittner/blog/archive/2010/july/08/beandev_autoupdatecenter_tweaks/index.html" title="AutoUpdate Center Tweaks" class="external-link-new-window" >AutoUpdate Center</a> passt: <a href="http://wiki.netbeans.org/FaqPluginManagerCustomization" title="FaqPluginManagerCustomization" target="_blank" class="external-link-new-window" >FaqPluginManagerCustomization.</a></p>
<p class="bodytext">In der FAQ wird beschrieben, wie man die Darstellung und das Verhalten des Plugin Managers modifizieren kann. Hier mal ein paar Auszüge:</p>
<h3>Alle Module anzeigen</h3>
<p class="bodytext">Setzt man das System property plugin.manager.modules.only auf true (z.B. in der etc-Datei per -J-Dplugin.manager.modules.only=true), werden alle Module angezeigt. Egal, ob diese als unsichtbar gekennzeichnet wurden. Das ist zum Testen in der Entwicklung sehr hilfreich, weil man ja doch ab und zu ein paar Abhängigkeiten vergisst.</p>
<h3>Code Name Base der Module anzeigen</h3>
<p class="bodytext">Auch das ist für die RCP Entwicklung sehr praktisch:</p>
<pre>-J-Dplugin.manager.extended.description=true</pre>
<h3>Plugin Manager geschwätziger machen</h3>
<p class="bodytext">Wenn man mehr Infos braucht, was der Plugin Manager gerade so tut, helfen einem diese Optionen weiter:</p>
<pre>-J-Dorg.netbeans.modules.autoupdate.ui.actions.AutoupdateSettings.level=FINE<br />-J-Dnetbeans.logger.console=true</pre>
<p class="bodytext">&nbsp;</p>
<p class="bodytext">Es lohnt sich die FAQ mal anzuschauen, da dort noch weitere Einstellungen zum Installations- und Updateverhalten beschrieben werden.</p>
<p class="bodytext">Beste Grüße,<br />&nbsp; Josch.</p>]]></content:encoded>
			<category>NetBeans Plattform</category>
			<category>NetBeans IDE</category>
			
			<author>rittner@sepix.de</author>
			<pubDate>Thu, 22 Jul 2010 09:55:00 +0200</pubDate>
		</item>
		
		<item>
			<title>BeanDev: Hintergrundarbeiten - Der RequestProcessor</title>
			<link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_hintergrundarbeiten_der_requestprocessor/index.html</link>
			<description>Moin!
Eine sehr schöne kleine Zusammenfassung, wie man (auch vorzeitig zu beendende)...</description>
			<content:encoded><![CDATA[<p class="bodytext">Moin!</p>
<p class="bodytext">Eine sehr schöne kleine Zusammenfassung, wie man (auch vorzeitig zu beendende) Hintergrundprozesse in der NetBeans Plattform programmiert findet man <a href="http://rubenlaguna.com/wp/2010/01/18/cancellable-tasks-and-progress-indicators-netbeans-platform/" title="Cancellable tasks and progress" target="_blank" class="external-link-new-window" >hier</a>.</p>
<p class="bodytext">In dem Blog wird beschrieben, wie man sauber Hintergrundtasks implementiert, wie sie im Fortschritt in der Statuszeile angezeigt und abgebrochen werden können. </p>
<p class="bodytext">Meines Erachtens ist die Verwendung des <a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/RequestProcessor.html" title="RequestProcessor API" target="_blank" class="external-link-new-window" >RequestProcessor</a> immer dem <a href="http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/javax/swing/SwingWorker.html" title="SwingWorker API" target="_blank" class="external-link-new-window" >SwingWorker</a> vorzuziehen. SwingWorker ist zwar einfacher zu verwenden, RequestProcessor ist aber erheblich mächtiger. Die done-Methode des  <a href="http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/javax/swing/SwingWorker.html" title="SwingWorker API" target="_blank" class="external-link-new-window" >SwingWorker</a> realisiert man über einen <a href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/TaskListener.html" title="TaskListener API" target="_blank" class="external-link-new-window" >TaskListener</a>. In der taskFinished kann man dann per SwingUtilities.invoke* GUI Updates durchführen. Bei häufiger Verwendung macht es bestimmt Sinn eine Hilfsklasse namens NbSwingWorker auf Basis des RequestProcessor zu implementieren ;-)</p>
<p class="bodytext">Beste Grüße,<br />&nbsp; Josch.</p>
<p class="bodytext">&nbsp;</p>
<p class="bodytext">&nbsp;</p>
<p class="bodytext">&nbsp;</p>]]></content:encoded>
			<category>NetBeans Plattform</category>
			
			<author>rittner@sepix.de</author>
			<pubDate>Tue, 20 Jul 2010 09:41:00 +0200</pubDate>
		</item>
		
		<item>
			<title>BeanDev: FileChooser für NetBeans Platform</title>
			<link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_filechooser_fuer_netbeans_platform/index.html</link>
			<description>Die Frage kommt häufiger in den Schulungen und auch die Foren sind voll davon: Hat NetBeans eine...</description>
			<content:encoded><![CDATA[<p class="bodytext">Die Frage kommt häufiger in den Schulungen und auch die Foren sind voll davon: Hat NetBeans eine FileChooser Komponente?&nbsp;</p>
<p class="bodytext">Die Antwort ist einfach: Nein ;-) - Der Grund auch: Swing hat einen sehr guten JFileChooser, der genutzt werden kann.</p>
<p class="bodytext">Aber da muss man sich immer noch viel Arbeit machen, um einen (für den Anwender) praktisch bedienbaren Datei-Dialog zu basteln.</p>
<p class="bodytext">Die FileSystem-API hat dafür aber auch eine Lösung: Der <a href="http://bits.netbeans.org/dev/javadoc/org-openide-filesystems/org/openide/filesystems/FileChooserBuilder.html" title="API: FileChooserBuilder" target="_blank" class="external-link-new-window" >FileChooserBuilder</a>.</p>
<p class="bodytext">Der lässt sich sehr einfach über Method-Chaining konfigurieren und merkt sich auch das zuletzt gewählte Verzeichnis.</p>
<p class="bodytext">Hier ein Beispiel, für die Auswahl einer Datenbank-Datei:</p>
<p class="bodytext">&nbsp;</p>
<pre>&nbsp;&nbsp;&nbsp; File basePath = new File (System.getProperty(&quot;netbeans.user&quot;));</pre>
<pre>&nbsp;&nbsp;&nbsp; File db = new FileChooserBuilder(&quot;database-dir&quot;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .setTitle(&quot;Choose a database&quot;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .setDefaultWorkingDirectory(basePath).addFileFilter(new FileFilter() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean accept(File f) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name = f.getName().toLowerCase();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name.endsWith(&quot;.fdb&quot;) || name.endsWith(&quot;.gdb&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getDescription() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;Firebird Database (*.fdb | *.gdb)&quot;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; })&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .setApproveText(&quot;Choose&quot;).showOpenDialog();</pre>
<p class="bodytext">&nbsp;</p>
<pre>&nbsp;&nbsp;&nbsp; if ( db != null ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tfDatabase.setText(db.getAbsolutePath());<br />&nbsp;&nbsp;&nbsp; }</pre>
<p class="bodytext">Spannend in dem Zusammenhang ist der <a href="http://bits.netbeans.org/dev/javadoc/org-openide-filesystems/org/openide/filesystems/FileChooserBuilder.BadgeProvider.html" title="API: BadgeProvider" target="_blank" class="external-link-new-window" >BadgeProvider</a>. Mit Ihm kann man Dateien mit kleinen zusätzlichen Icons versehen (wie man es in der IDE auch gewohnt ist).</p>
<p class="bodytext">Beste Grüße,<br />&nbsp; Josch.</p>
<p class="bodytext">&nbsp;</p>]]></content:encoded>
			<category>NetBeans Plattform</category>
			
			<author>rittner@sepix.de</author>
			<pubDate>Thu, 08 Jul 2010 13:08:00 +0200</pubDate>
		</item>
		
		<item>
			<title>BeanDev: Eigene Options - Hauptkategorien mit Annotationen</title>
			<link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_eigene_options_hauptkategorien_mit_annotationen/index.html</link>
			<description>Wenn man mit Annotationen in der NetBeans Platform arbeitet bekommt man eine deutliche...</description>
			<content:encoded><![CDATA[<p class="bodytext">Wenn man mit Annotationen in der NetBeans&nbsp;Platform arbeitet bekommt man eine deutliche Erleichterung, da man weniger&nbsp;in den layer.xml Dateien arbeiten muss. Trotzdem gibt es noch kleinere Fallstricke.</p>
<p class="bodytext">Möchte man dem Optionen-Dialog eine eigene Haupt-Kategorie zuordnen, in der Unterkategorien registriert werden dürfen (wie es die Verschiedenes-Kategorie zeigt), muss man eine besondere Form der Annotation verwenden: Die package-level Annotation <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-options-api/org/netbeans/spi/options/OptionsPanelController.ContainerRegistration.html" title="ContainerRegistration" target="_blank" class="external-link-new-window" >@OptionsPanelController.ContainerRegistration</a>. </p>
<p class="bodytext">Diese Annotation muss vor der package Deklaration angegeben werden:</p>
<pre>@OptionsPanelController.ContainerRegistration(<br />&nbsp; id=&quot;SepixBaseOptions&quot;,<br />&nbsp; categoryName = &quot;#OptionsCategory_Name_SepixBase&quot;,<br />&nbsp; iconBase = &quot;de/sepix/core/options/base/s-logo_32.png&quot;,<br />&nbsp; keywords = &quot;#OptionsCategory_Keywords_SepixBase&quot;,<br />&nbsp; keywordsCategory = &quot;SepixBase&quot;, position=10)<br />package de.sepix.core.options.base;<br /><br />import org.netbeans.spi.options.OptionsPanelController;</pre>
<p class="bodytext">Alte Java-Hasen werden sagen, dass das niemals eine vollständige Java-Datei sein kann, die compilierbar wäre. Das ist auch tatsächlich so. Es fehlt nämlich eine Klasse in dem Quelltext. Damit der Compiler nicht mit Fehler aussteigt, muss diese Datei eine ganz bestimmte Namenskonvention haben: sie muss <a href="http://entwickler.de/zonen/portale/psecom,id,101,online,659,.html" title="package-info.java Datei" target="_blank" class="external-link-new-window" >package-info.java</a> heißen. </p>
<p class="bodytext">Damit kommen wir zum nächsten Fallstrick. Der New File... Assistent für Java-Klassen erlaubt es nicht, einen solchen Namen zu verwenden. Man muss also das Empty File Template nehmen, als Namen package-info.java eintragen und die Datei mit der ContainerRegistration-Annotation bestücken.&nbsp;</p>
<p class="bodytext">Hat man ein passendes Icon und die Bundle.properties Datei im selben Package, erscheint tatsächlich eine leere Kategorie im Optionen-Dialog.</p>
<p class="bodytext">Jetzt kann man mit dem Assistenten weitere Sub-Kategorien erzeugen. Diese Sub-Kategorien erhalten als Primärpanel die ID des obigen Beispiels (man wählt also nichts aus der Combobox aus, sondern gibt die ID von Hand ein). </p>
<p class="bodytext">Man erhält damit den Panel-Controller und das GUI als Panel. Die Annotation zum Controller sieht dann so aus:</p>
<pre>package de.sepix.core.options.base.db;<br /><br />import java.beans.PropertyChangeListener;<br />import java.beans.PropertyChangeSupport;<br />import javax.swing.JComponent;<br />import org.netbeans.spi.options.OptionsPanelController;<br />import org.openide.util.HelpCtx;<br />import org.openide.util.Lookup;<br /><br />@OptionsPanelController.SubRegistration(location = &quot;SepixBaseOptions&quot;,<br />  displayName = &quot;#AdvancedOption_DisplayName_Database&quot;,<br />  keywords = &quot;#AdvancedOption_Keywords_Database&quot;,<br />  keywordsCategory = &quot;SepixBase/Database&quot;)<br />public final class DatabaseOptionsPanelController extends OptionsPanelController {</pre>
<p class="bodytext">Wichtig ist, dass location der id des Containers entspricht.</p>
<p class="bodytext">Die  Bundle-Datei wurde schon vom Assistenten angelegt. Hier mal ein Screenshot, wie die Optionen nun aussehen (könnten):</p>
<p class="bodytext"><img src="http://www.sepix.de/fileadmin/nboptions/main_sub.png" width="483" height="326" alt="" /></p>
<p class="bodytext">Beste Grüße,<br />&nbsp; Josch.</p>]]></content:encoded>
			<category>NetBeans Plattform</category>
			
			<author>rittner@sepix.de</author>
			<pubDate>Thu, 08 Jul 2010 11:50:00 +0200</pubDate>
		</item>
		
		<item>
			<title>BeanDev: AutoUpdateCenter Tweaks</title>
			<link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_autoupdatecenter_tweaks/index.html</link>
			<description>Es gibt ein paar Einstellungen die seit den 6'er Versionen neu in die manifest.mf hinzugekommen...</description>
			<content:encoded><![CDATA[<p class="bodytext">Es gibt ein paar Einstellungen die seit den 6'er Versionen neu in die manifest.mf hinzugekommen sind, die sich direkt auf die Ansicht des AutoUpdate-Center auswirken. Da man bei Maven Builds keine Einstellungen durch Assistenten hat, sollte man sich die Optionen mal wieder gedanklich abrufen:</p>
<h3>Module unsichtbar schalten</h3>
<p class="bodytext">Soll ein Modul nicht sichtbar für den Anwender sein, fügt man folgenden Eintrag hinzu:</p>
<pre>AutoUpdate-Show-In-Client: false</pre>
<p class="bodytext">Standard ist true (Modul wird im Plugin-Dialog angezeigt.).</p>
<h3>Module durch Anwender nicht zu deinstallieren</h3>
<p class="bodytext">Darf der Anwender ein Modul nicht deinstallieren, muss es als Essential gekennzeichnet werden:</p>
<pre>AutoUpdate-Essential-Module: true</pre>
<p class="bodytext">Beste Grüße,<br />&nbsp; Josch.</p>
<p class="bodytext">&nbsp;</p>]]></content:encoded>
			
			<author>rittner@sepix.de</author>
			<pubDate>Thu, 08 Jul 2010 11:30:00 +0200</pubDate>
		</item>
		
		<item>
			<title>BeanDev: Unit-Tests in der RCP Entwicklung</title>
			<link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_unit_tests_in_der_rcp_entwicklung/index.html</link>
			<description>In einer meiner letzten Schlungen kam die Frage auf, wie man  Unit-Tests für RCP Module durchführen...</description>
			<content:encoded><![CDATA[<p class="bodytext">In einer meiner letzten Schlungen kam die Frage auf, wie man  Unit-Tests für RCP Module durchführen kann, wenn man abhängige Module  der Platform benötigt.</p>
<p class="bodytext">Die Antwort ist <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-nbjunit/org/netbeans/junit/NbModuleSuite.html" title="NbModuleSuite" target="_blank" >NbModuleSuite</a>.</p>
<p class="bodytext"><br />Diese Hilfsklasse erlaubt es vor einem Test abhängige Module zu  laden, damit der Test durchlaufen kann:</p>
<pre> public class YourTest extends <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-nbjunit/org/netbeans/junit/NbTestCase.html" title="NbTestCase" target="_blank" >NbTestCase</a> {<br />   public YourTest(String s) { super(s); }<br /> <br />   public static Test suite() {<br />     return NbModuleSuite.create(YourTest.class);<br />   }<br /> <br />   public void testXYZ() { ... }<br />   public void testABC() { ... }<br /> }</pre>
<p class="bodytext">Die Aktivieren der abhängigen Module erfolgt über die <a href="http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-nbjunit/org/netbeans/junit/NbModuleSuite.Configuration.html" title="Configuration" target="_blank" >Configuration</a> der NbModuleSuite:</p>
<pre> public static Test suite() {<br />&nbsp; &nbsp;return NbModuleSuite.create(<br />&nbsp; &nbsp; &nbsp;NbModuleSuite.createConfiguration(YourTest.class)<br />       .addTest(YourTest.class, new String[] { &quot;testXYZ&quot;})<br />       .enableModules(&quot;.*&quot;).clusters(&quot;.*&quot;)<br />   );<br />&nbsp;}</pre>
<p class="bodytext">Beste Grüße,<br />&nbsp; Josch.</p>]]></content:encoded>
			<category>NetBeans Plattform</category>
			
			<author>rittner@sepix.de</author>
			<pubDate>Mon, 21 Jun 2010 16:31:00 +0200</pubDate>
		</item>
		
		<item>
			<title>BeanDev: RCP switch zur neuen Platform (NetBeans 6.9)</title>
			<link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_rcp_switch_zur_neuen_platform_netbeans_69/index.html</link>
			<description>Mit NetBeans 6.9 wurde die Lookup API in ein extra Modul ausgelagert. Will man nun seine Projekte...</description>
			<content:encoded><![CDATA[<p class="bodytext">Mit NetBeans 6.9 wurde die Lookup API in ein extra Modul ausgelagert. Will man nun seine Projekte (RCP, Plugins) auf die neue API verlinken müssen die Abhängigkeiten neu aufgelöst werden.</p>
<h3>Ant basierte Projekte</h3>
<p class="bodytext">Für Ant-Projekte gibt es ein sehr einfaches target, um die Abhängigkeiten generell zu korrigieren:</p>
<pre>ant fix-dependencies</pre>
<p class="bodytext">Das dauert eine Weile, bietet aber einen sicheren Schutz vor Buildfehlern. In der IDE kann man das über &quot;Important files&quot; -&gt; rechter Mausklick auf &quot;Build scripts&quot; -&gt; &quot;Run target&quot; -&gt; &quot;fix-dependendies&quot; aufrufen. </p>
<h3>Maven basierte Projekte</h3>
<p class="bodytext">Da muss man alles zu Fuß machen. Das Lookup-Artifakt wird so eingebunden:</p>
<pre>&lt;dependency&gt;<br />    &lt;groupId&gt;org.netbeans.api&lt;/groupId&gt;<br />    &lt;artifactId&gt;org-openide-util-lookup&lt;/artifactId&gt;<br />    &lt;version&gt;${netbeans.version}&lt;/version&gt;<br />&lt;/dependency&gt;</pre>
<p class="bodytext">Und die Platform hat seit 6.9 keine Versionskennung mehr. Es darf also nicht mehr platform11 heißen, sondern nur noch platform. Also im Application pom:</p>
<pre>&lt;dependency&gt;<br />    &lt;groupId&gt;org.netbeans.cluster&lt;/groupId&gt;<br />    &lt;artifactId&gt;platform&lt;/artifactId&gt;<br />    &lt;version&gt;${netbeans.version}&lt;/version&gt;<br />    &lt;type&gt;pom&lt;/type&gt;<br />&lt;/dependency&gt;</pre>
<p class="bodytext">Das war es schon. Nun sollte man die Projekte mal unter der neuen Platform testen.</p>
<p class="bodytext">Beste Grüße,<br />&nbsp; Josch.</p>]]></content:encoded>
			<category>NetBeans</category>
			<category>NetBeans Plattform</category>
			<category>Maven</category>
			
			<author>rittner@sepix.de</author>
			<pubDate>Mon, 21 Jun 2010 11:32:00 +0200</pubDate>
		</item>
		
		<item>
			<title>News: NetBeans als IDE stark im Anstieg</title>
			<link>http://www.sepix.de/blogs/blogrittner/blog/archive////news_netbeans_als_ide_stark_im_anstieg/index.html</link>
			<description>Moin!
Die neuen Java Trends sind raus und zeigen, dass die NetBeans IDE stark in der Nutzung...</description>
			<content:encoded><![CDATA[<p class="bodytext">Moin!</p>
<p class="bodytext">Die neuen Java Trends sind raus und zeigen, dass die NetBeans IDE stark in der Nutzung zunimmt. In den letzten Java-Trends war die NetBeans IDE noch bei 30%, inzwischen <a href="http://blog.expeso.de/2010/05/10/358/" title="Ticker: Java Trend Barometer" target="_blank" class="external-link-new-window" >nutzen knapp 50%</a>&nbsp;aller Entwickler NetBeans.</p>
<p class="bodytext">Der Anstieg der Nutzung der der NetBeans IDE ist damit bemerkenswert. Wir werden weiter daran arbeiten, dass das so bleibt!</p>
<p class="bodytext">Beste Grüße,<br />&nbsp; Josch.<br /></p>
<p class="bodytext">&nbsp;</p>]]></content:encoded>
			<category>NetBeans IDE</category>
			
			<author>rittner@sepix.de</author>
			<pubDate>Fri, 21 May 2010 10:59:00 +0200</pubDate>
		</item>
		
		<item>
			<title>BeanDev: Maven based Multi-Suite Plattform Applikationen</title>
			<link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_maven_based_multi_suite_plattform_applikationen/index.html</link>
			<description>Wenn man bei bisherigen Ant-Projekten sehr große NetBeans RCP Applikationen entwickelte, konnte man...</description>
			<content:encoded><![CDATA[<p class="bodytext">Wenn man bei bisherigen Ant-Projekten sehr große NetBeans RCP Applikationen entwickelte, konnte man dies durch Suites recht gut organisieren. <br /><br />Eine Suite sind eine Organisationseinheit, die Module zusammenfasst und im Build-Prozess auch, mit einer XML-Datei, für alle Module der Suite gemeinsames Updatecenter erzeugt.<br /><br />Die Suites, die per Maven Projekt erzeugt werden, sind allerdings sehr auf IDE Plug-ins eingeschossen. D.h. ihr primärer Einsatzzweck orientiert sich an die Erweiterung der NetBeans IDE.<br /><br />Nur ist die IDE ja auch eine Plattform Applikation, warum sollte man Suites nicht auch für die eigene Plattform verwenden?<br /><br />Als grundlegende Ordnerstruktur habe ich folgendes vorbereitet:<br /><br /></p>
<pre>&#9500;&#9472;&#9472;&#9472;platforms<br />&#9474;&nbsp;&nbsp; &#9492;&#9472;&#9472;&#9472;sXbase<br />&#9500;&#9472;&#9472;&#9472;suites<br /><br /></pre>
<p class="bodytext">Das Projekt sXbase ist die RCP Anwendung, für die ich eine Suite anlegen möchte.</p>
<p class="bodytext">Unter dem Ordner suites wird nun per Assistent ein Maven NetBeans Module Suite angelegt. In diesem Fall suite-demo. Artifact ID ist de.sepix.demos, Paket wird zu de.sepix.demos.suitedemo.</p>
<p class="bodytext">Im weiteren Schritt des Assistenten lass ich mir gleich ein Modul mit dem Namen module-sample erzeugen.</p>
<p class="bodytext">Das Ergebnis&nbsp;ist überschaubar:</p>
<pre>suites<br />&#9500;&#9472;&#9472;&#9472;suite-demo<br />&#9474;   &#9492;&#9472;&#9472;&#9472;module-sample<br />&#9474;       &#9492;&#9472;&#9472;&#9472;src<br />&#9474;           &#9500;&#9472;&#9472;&#9472;main<br />&#9474;           &#9474;   &#9500;&#9472;&#9472;&#9472;java<br />&#9474;           &#9474;   &#9474;   &#9492;&#9472;&#9472;&#9472;de<br />&#9474;           &#9474;   &#9474;       &#9492;&#9472;&#9472;&#9472;sepix<br />&#9474;           &#9474;   &#9474;           &#9492;&#9472;&#9472;&#9472;demos<br />&#9474;           &#9474;   &#9474;               &#9492;&#9472;&#9472;&#9472;suitedemo<br />&#9474;           &#9474;   &#9500;&#9472;&#9472;&#9472;nbm<br />&#9474;           &#9474;   &#9492;&#9472;&#9472;&#9472;resources<br />&#9474;           &#9474;       &#9492;&#9472;&#9472;&#9472;de<br />&#9474;           &#9474;           &#9492;&#9472;&#9472;&#9472;sepix<br />&#9474;           &#9474;               &#9492;&#9472;&#9472;&#9472;demos<br />&#9474;           &#9474;                   &#9492;&#9472;&#9472;&#9472;suitedemo<br />&#9474;           &#9492;&#9472;&#9472;&#9472;test<br />&#9474;               &#9492;&#9472;&#9472;&#9472;java<br />&#9474;                   &#9492;&#9472;&#9472;&#9472;de<br />&#9474;                       &#9492;&#9472;&#9472;&#9472;sepix<br />&#9474;                           &#9492;&#9472;&#9472;&#9472;demos<br />&#9474;                               &#9492;&#9472;&#9472;&#9472;suitedemo</pre>
<p class="bodytext">Spannender ist, wie die pom.xml erzeugt wurde. Es gibt zum Beispiel kein &lt;parent&gt;-Eintrag für eine übergeordnete Projektdatei. Woher soll auch diese kommen? Der Assistent hat diese nicht abgefragt. Damit tauchen auch Repositories, Dependencies und Properties auf, die für die Zukunft hier nichts mehr zu suchen haben.&nbsp;</p>
<p class="bodytext">Die pom.xml der Suite hat aber noch einen zusätzlichen &lt;profiles&gt; Abschnitt erhalten:</p>
<pre>    &lt;profiles&gt;<br />        &lt;profile&gt;<br />            &lt;id&gt;updatesite&lt;/id&gt;<br />            &lt;build&gt;<br />                &lt;plugins&gt;<br />                    &lt;plugin&gt;<br />                        &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;<br />                        &lt;artifactId&gt;nbm-maven-plugin&lt;/artifactId&gt;<br />                        &lt;executions&gt;<br />                            &lt;execution&gt;<br />                                &lt;id&gt;site&lt;/id&gt;<br />                                &lt;phase&gt;package&lt;/phase&gt;<br />                                &lt;goals&gt;<br />                                    &lt;goal&gt;autoupdate&lt;/goal&gt;<br />                                &lt;/goals&gt;<br />                                &lt;configuration&gt;<br />                                    &lt;!-- &lt;distBase&gt;url where your nbm files are located, if not defined within the nbm files&lt;/distBase&gt;<br />                                     --&gt;<br />                                &lt;/configuration&gt;<br />                            &lt;/execution&gt;<br />                        &lt;/executions&gt;<br />                    &lt;/plugin&gt;<br />                &lt;/plugins&gt;<br />            &lt;/build&gt;<br />        &lt;/profile&gt;<br />    &lt;/profiles&gt;</pre>
<p class="bodytext">Das Profile mit der Id &quot;updatesite&quot; ist für die Erzeugung der XML-Updatecenter Datei zuständig.&nbsp;</p>
<p class="bodytext">Wenn man so ein erzeugte Projekt startet, hat man recht schnell die Ernüchterung:</p>
<p class="bodytext">Es startet nichts und im Ausgabefenster findet man folgende Zeilen (Windows):</p>
<pre>[nbm:run]<br />Additional arguments=null<br />      --userdir<br />      C:\Entw\Work\svn\4.2\suites\suite-demo\target\userdir<br />      -J-Dnetbeans.logger.console=true<br />      -J-ea<br />Executing: cmd.exe /X /C &quot;C:\Entw\Work\svn\4.2\suites\suite-demo\path-to-associated-netbeans-install\bin\netbeans.exe --userdir C:\Entw\Work\svn\4.2\suites\suite-demo\target\userdir -J-Dnetbeans.logger.console=true -J-ea&quot;<br />Das System kann den angegebenen Pfad nicht finden.<br /><br /></pre>
<p class="bodytext">Nun ja, path-to-associated-netbeans-install sieht nicht wirklich vernünftig aus.</p>
<p class="bodytext">Neben der pom.xml Datei gibt es noch eine profiles.xml Datei, in der sich genau diese Zeichenkette wiederfindet. Das dortige Profil &quot;netbeans-ide&quot; definiert die Eigenschaft &lt;netbeans.installation&gt; mit dem Platzhalter. Das Profil wird in der selben Datei aktiviert. </p>
<p class="bodytext">Mit der Änderung auf die IDE, bekommt man das Projekt zum laufen. Als userdir wird ein Ordner im target der Suite verwendet: ...\suites\suite-demo\target\userdir.</p>
<p class="bodytext">Schaut man in der gestarteten IDE unter Plugins nach, findet man unter &quot;Installiert&quot; auch das &quot;modules-sample NetBeans Module&quot;.</p>
<p class="bodytext">Wie sich die Anwendung zusammensetzt findet man im IDE Protokoll heraus:</p>
<pre>  Current Directory       = C:\Entw\Work\svn\4.2\suites\suite-demo<br />  User Directory          = C:\Entw\Work\svn\4.2\suites\suite-demo\target\userdir<br />  Installation            = C:\Entw\NetBeans69beta\nb<br />                            C:\Entw\NetBeans69beta\ide<br />                            C:\Entw\NetBeans69beta\java<br />                            C:\Entw\NetBeans69beta\apisupport<br />                            C:\Entw\NetBeans69beta\websvccommon<br />                            C:\Entw\NetBeans69beta\profiler<br />                            C:\Entw\NetBeans69beta\harness<br />                            C:\Entw\Work\svn\4.2\suites\suite-demo\target\netbeans_clusters\foobar<br />                            C:\Entw\NetBeans69beta\platform</pre>
<p class="bodytext">Die neue Suite tanzt mit seinem Ordner deutlich aus der Reihe.</p>
<p class="bodytext">Aber nun muss die Suite endlich mit der echten RCP-Anwendung verknüpft werden. Ausgehend von der vorgegebenen Ordnerstruktur:</p>
<pre>&#9500;&#9472;&#9472;&#9472;platforms<br />&#9474;&nbsp;&nbsp; &#9492;&#9472;&#9472;&#9472;sXbase<br />&#9500;&#9472;&#9472;&#9472;suites</pre>
<p class="bodytext">wird der Pfad relativ auf die RCP Plattform sXbase verbogen (Ausschnitt in der profiles.xml):</p>
<pre>           &lt;properties&gt;<br />               &lt;netbeans.installation&gt;../../platforms/sXbase/application/target/s3&lt;/netbeans.installation&gt;<br />           &lt;/properties&gt;</pre>
<p class="bodytext">Dabei ist application das Application-Projekt.Der Ordner target ist das erzeugte Build. Und &quot;s3&quot; der brandingToken der Applikation.</p>
<p class="bodytext">Damit ist die Verknüpfung erfolgreich. Mit dem Run der Suite wird nun endlich die passende RCP Applikation gestartet.</p>
<p class="bodytext">Das Protokoll gibt wieder die gewünschten Informationen:</p>
<pre>  Current Directory       = C:\Entw\Work\svn\4.2\platforms\sXbase\application\target\s3<br />  User Directory          = C:\Entw\Work\svn\4.2\suites\suite-demo\target\userdir<br />  Installation            = C:\Entw\Work\svn\4.2\platforms\sXbase\application\target\s3\bin<br />                            C:\Entw\Work\svn\4.2\platforms\sXbase\application\target\s3\etc<br />                            C:\Entw\Work\svn\4.2\platforms\sXbase\application\target\s3\platform<br />                            C:\Entw\Work\svn\4.2\platforms\sXbase\application\target\s3\sxbase<br />                            C:\Entw\Work\svn\4.2\suites\suite-demo\target\netbeans_clusters\foobar<br />                            C:\Entw\Work\svn\4.2\platforms\sXbase\application\target\s3\platform</pre>
<p class="bodytext">Man müsste nur noch den cluster in der pom.xml der Suite anpassen, damit man foobar los wird.</p>
<p class="bodytext">Außerdem würde ich den &lt;profile&gt; Namen in der profiles.xml der Suite von &quot;netbeans-ide&quot; ändern (auch &lt;activeProfile&gt; anpassen!).</p>
<p class="bodytext">Die pom.xml der Suite muss auch geändert werden. Da die Suite direkt abhängig von der Applikation ist, sollte man auch eine &lt;parent&gt; Verknüpfung durchführen. </p>
<p class="bodytext">Die Mavenkoordinate der Applikation findet sich in seinem pom.xml:</p>
<pre>    &lt;groupId&gt;de.sepix&lt;/groupId&gt;<br />    &lt;artifactId&gt;sXbase&lt;/artifactId&gt;<br />    &lt;version&gt;4.2-SNAPSHOT&lt;/version&gt;</pre>
<p class="bodytext">Diese Koordinate kommt in &lt;parent&gt; Tags eingeschlossen in die pom.xml Datei der Suite:</p>
<pre>    &lt;parent&gt;<br />        &lt;groupId&gt;de.sepix&lt;/groupId&gt;<br />        &lt;artifactId&gt;sXbase&lt;/artifactId&gt;<br />        &lt;version&gt;4.2-SNAPSHOT&lt;/version&gt;<br />    &lt;/parent&gt;</pre>
<p class="bodytext">Jetzt kann man gefahrlos erst mal &lt;repositories&gt;...&lt;/repositories&gt;, &lt;dependencies&gt;...&lt;/dependencies&gt; und &lt;properties&gt;...&lt;/properties&gt; entfernen. </p>
<p class="bodytext">Sollte das jetzt auszuführende Build nicht klappen, muss man zunächst die RCP Applikation erstellen, weil das lokale Repository kein installiertes pom zur Parent-Koordinate enthält. Ansonsten gibt es keine Schwierigkeiten und Run sollte weiterhin klappen.&nbsp;</p>
<p class="bodytext">Mit diesen wenigen Handgriffen hat man eine neue Suite der Applikation hinzugefügt. Weitere Schritte wären Lokalisierungen, Updatecenter-URL eintragen (&lt;distBase&gt; in der pom.xml der Suite) und mit dem Update-Center Assistenten im Sample-Modul die URL registrieren.</p>
<pre>&nbsp;</pre>
<p class="bodytext">Beste Grüße,<br />&nbsp; Josch.</p>]]></content:encoded>
			<category>Maven</category>
			<category>NetBeans Plattform</category>
			
			<author>rittner@sepix.de</author>
			<pubDate>Tue, 11 May 2010 14:25:00 +0200</pubDate>
		</item>
		
	</channel>
</rss>
<!-- Cached page generated 30-07-10 17:26. Expires 31-07-10 17:26 -->
<!-- Parsetime: 136 ms-->