<?xml version="1.0" encoding="utf-8"?>
<!-- 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
-->
<?xml-stylesheet type="text/xsl" href="https://mbien.dev/roller-ui/styles/rss.xsl" media="screen"?><rss version="2.0" 
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:atom="http://www.w3.org/2005/Atom" >
<channel>
  <title>Michael Bien&apos;s Weblog</title>
  <link>https://mbien.dev/blog/</link>
    <atom:link rel="self" type="application/rss+xml" href="https://mbien.dev/blog/feed/entries/rss?tags=modules" />
  <description>don&apos;t panic</description>
  <language>en-us</language>
  <copyright>Copyright 2026</copyright>
  <lastBuildDate>Wed, 10 Jun 2026 23:05:58 +0000</lastBuildDate>
  <generator>Apache Roller 6.1.4</generator>
  <item>
    <guid isPermaLink="true">https://mbien.dev/blog/entry/custom-java-runtimes-with-jlink</guid>
    <title>Custom Java Runtimes with jlink [and jdeps for classpath applications]</title>
    <dc:creator>mbien</dc:creator>
    <link>https://mbien.dev/blog/entry/custom-java-runtimes-with-jlink</link>
    <pubDate>Sun, 20 Jun 2021 18:05:34 +0000</pubDate>
    <category>Java</category>
    <category>containers</category>
    <category>java</category>
    <category>jvm</category>
    <category>modules</category>
    <category>tools</category>
<description>&lt;p&gt;
The &lt;code&gt;jlink&lt;/code&gt; command line tool can be used to create custom java runtimes, which only include the functionality required by the (modular) java application. However, what if the application isn&apos;t modular and still uses the classpath? In this case an extra step is needed to determine which JDK modules are required by the application before &lt;code&gt;jlink&lt;/code&gt; can be used.
&lt;/p&gt;

&lt;h3&gt;classic classpaths: finding module dependencies with jdeps&lt;/h3&gt;
&lt;p&gt;
&lt;code&gt;jdeps&lt;/code&gt; is excellent for porting classic classpath based applications to java modules. It analyzes jars and list all their dependencies, which can be other jars, or modules, with package granularity. Although we don&apos;t want to port the dusty application to the module system for this blog post, listing all the module dependencies is exactly what we need for &lt;code&gt;jlink&lt;/code&gt;, to be able to create a custom java runtime.
&lt;/p&gt;
&lt;p&gt;
&lt;code&gt;jdeps&lt;/code&gt; produces the following output:
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;
# foo.jar depends on bar.jar
foo.jar -&gt; bar.jar
...
# or foo.jar depends on a module
foo.jar -&gt; module.name
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;
Since the tool is intended to assist with porting applications to java modules, the default output will be fairly detailed down to package dependencies. The summary (&lt;code&gt;-s&lt;/code&gt;) omits all that and only lists jars or modules.
&lt;/p&gt;
&lt;p&gt;
All we have to do is to go recursively through all jars and remember the module names they depend on.
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;
# -s omit detailed package dependencies
# -R analyze recursively through all found dependencies
# --multi-release 16 for the case that there are multi release jars involved
$JDK/bin/jdeps -s -R --multi-release 16 --class-path &apos;lib/*&apos; dusty-application.jar
jakarta.persistence-2.2.3.jar -&gt; java.base
jakarta.persistence-2.2.3.jar -&gt; java.instrument
jakarta.persistence-2.2.3.jar -&gt; java.logging
jakarta.persistence-2.2.3.jar -&gt; java.sql
foo.jar -&gt; bar.jar
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;
Some greping and deduplication and we have a short list of JDK modules our application depends on.
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;
$JDK/bin/jdeps -s -R --multi-release 16 --class-path &apos;lib/*&apos; dusty-application.jar\
 | grep -Ev &apos;\.jar$&apos; | cut -d &quot; &quot; -f 3 | sort -u
java.base
java.desktop
java.instrument
java.logging
java.naming
java.net.http
java.security.jgss
java.sql
java.xml
jdk.unsupported
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;
Thats it? Not quite. Analyzing an application like that won&apos;t show dependencies which are caused via reflection. So you will have to take a good look at the resulting modules and probably add some manually. A good candidate are &lt;i&gt;jdk.crypto.*&lt;/i&gt; modules. &lt;code&gt;jlink&lt;/code&gt; can assist with that task too by listing service providers.
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;
$JDK/bin/jlink --suggest-providers java.security.Provider
Suggested providers:
  java.naming provides java.security.Provider used by java.base
  java.security.jgss provides java.security.Provider used by java.base
  jdk.crypto.ec provides java.security.Provider used by java.base
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
You might also want to add modules like &lt;i&gt;jdk.jfr&lt;/i&gt;, &lt;i&gt;java.management&lt;/i&gt; or &lt;i&gt;jdk.localedata&lt;/i&gt; even when the application isn&apos;t direclty depending on them. You can experiment with options like &lt;code&gt;--compile-time&lt;/code&gt; which will usually list more dependencies (default is runtime analysis). &lt;code&gt;jlink&lt;/code&gt; adds transitive dependencies automatically.
&lt;/p&gt;
&lt;p&gt;
Any missing modules should be quickly noticed during integration tests.
&lt;/p&gt;

&lt;h3&gt;custom runtimes with jlink&lt;/h3&gt;
&lt;p&gt;
Once we have the module list we can give it to &lt;code&gt;jlink&lt;/code&gt; for the actual heavy lifting. 
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;
MODS=...
JDK=/home/mbien/dev/java/jdk-16.0.1+9
DIST=custom-$(basename $JDK)

$JDK/bin/jlink -v --add-modules $MODS\
 --compress=2 --no-header-files --no-man-pages\
 --vendor-version=&quot;[mbien.dev pod REv1]&quot;\
 --output $DIST

du -s $DIST
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;
&lt;code&gt;jlink&lt;/code&gt; is automatically using the modules of the JDK which contains the tool, which means that the example above will create a runtime based on jdk-16.0.1+9. The flag &lt;code&gt;--module-path&lt;/code&gt; would set a path to a alternative module folder. If the application is already modular, the path could also include the application modules, if they should be part of the runtime too.
&lt;/p&gt;

&lt;p&gt;
some noteworthy flags:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--strip-debug&lt;/code&gt; this is going to strip debug symbols from both the native binaries and bytecode, you probably don&apos;t want to use this since this will remove all line numbers from stack traces. Its likely that the binaries of the JDK distribution you are using have most of their symbols already stripped.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--strip-native-debug-symbols=objcopy=/usr/bin/objcopy&lt;/code&gt; Same as above, but only for native binaries&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--compress=0|1|2&lt;/code&gt; 0 for no compression, 1 for string deduplication, 2 for  zip compressed modules. This might influence startup time slightly; see CDS section below&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--include-locales=langtag[,langtag]*&lt;/code&gt; include only a subset of locales instead of the full module&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--vendor-version=&quot;i made this&quot;&lt;/code&gt; this looks uninteresting at first glance but it is very useful if you want to recognize your custom runtime again once you have multiple variants in containers. Adding domain name/project name or purpose of the base image helps. &lt;br/&gt; It will appear on the second line of the output of &lt;code&gt;java -version&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;full JDK as baseline&lt;/h3&gt;

&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;
MODS=ALL-MODULE-PATH

# --compress=1
138372 (151812 with CDS)

# --compress=2
102988 (116428 with CDS)

# --compress=2 --strip-debug
90848 (102904 with CDS)
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;custom runtime example&lt;/h3&gt;

&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;
MODS=java.base,java.instrument,java.logging,java.naming,java.net.http,\
java.security.jgss,java.sql,java.xml,jdk.jfr,jdk.unsupported,java.rmi,\
java.management,java.datatransfer,java.transaction.xa,\
jdk.crypto.cryptoki,jdk.crypto.ec

# --compress=1
55996 (69036 with CDS)

# --compress=2
45304 (58344 with CDS)

# --compress=2 --strip-debug
40592 (52240 with CDS)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(this a aarch64 build of OpenJDK, x64 binaries are slightly larger)&lt;/p&gt;

&lt;p&gt;
Most modules are actually fairly small, the 5 largest modules are &lt;i&gt;java.base, java.desktop, jdk.localedata, jdk.compiler&lt;/i&gt; and &lt;i&gt;jdk.internal.vm.compiler&lt;/i&gt;. Since java.base is mandatory anyway, adding more modules won&apos;t significantly influence the runtime size unless you can&apos;t avoid some of the big ones.
&lt;/p&gt;
&lt;p&gt;
Once you are happy with the custom runtime you should add it to your test environment of the project and IDE.
&lt;/p&gt;

&lt;h3&gt;CDS - to share or not to share?&lt;/h3&gt;
&lt;p&gt;
I wrote about &lt;a href=&quot;https://mbien.dev/blog/entry/dynamic-application-class-data-sharing&quot;&gt;class data sharing&lt;/a&gt; before so I keep this short. A CDS archive is a file which is mapped into memory by the JVM on startup and is shared between JVM instances. This even works for co-located containers, sharing the same image layer which includes the CDS archive.
&lt;/p&gt;
&lt;p&gt;
Although it adds to the image size, zip compression + CDS seems to be always smaller than uncompressed without CDS. The CDS file should also eliminate the need to decompress modules during startup since it should contain the most important classes already. So the decision seems to be made easy: compact size + improved startup time and potential (small) memory footprint savings as bonus.
&lt;/p&gt;
&lt;p&gt;
Leaving the CDS out frees up ~10 MB of image size. If this matters to your project, benchmark it to see if it makes a difference. It is also possible to put application classes into the shared archive or create a separate archive for the application which extends the runtime archive (dynamic class data sharing). Or go a step further and bundle the application and runtime in a single, AOT compiled, compact, native image with GraalVM (although this might reduce peak throughput due to lack of JIT and have a smaller choice of GCs beside other restrictions) - but this probably won&apos;t happen for dusty applications.
&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;
# create CDS archive for the custom runtime
$DIST/bin/java -Xshare:dump

# check if it worked, this will fail if it can&apos;t map the archive
$DIST/bin/java -Xshare:on -version

# list all modules included in the custom java runtime
$DIST/bin/java --list-modules
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;summary&lt;/h3&gt;
&lt;p&gt;
Only a single extra step is needed to determine most of the dependencies of an application, even if it hasn&apos;t been ported to java modules yet. Maintaining a module list won&apos;t be difficult since it should be fairly static (backend services won&apos;t suddenly start using swing packages when they are updated). Make sure that the custom runtime is used in your automated tests and IDE.
&lt;/p&gt;
&lt;p&gt;
Stop using java 8, time to move on - even without a modular application :)
&lt;/p&gt;

&lt;br/&gt;
&lt;p&gt;- - - sidenotes - - -&lt;/p&gt;
&lt;p&gt;
If you want to create a runtime which can compile and run &lt;a href=&quot;https://mbien.dev/blog/entry/cleaning-bash-history-using-a&quot;&gt;single-file-sourcode-programs&lt;/a&gt; adding just jdk.compiler isn&apos;t enough. This will result in a a little bit misleading &quot;IllegalArgumentException: error: release version 16 not supported&quot; exception. Solution is to add jdk.zipfs too - I haven&apos;t investigated it any further.
&lt;/p&gt;
&lt;p&gt;
If jlink has to be run from within a container (can be useful for building for foreign archs, e.g aarch64 on x64), you might have to change the process fork mechanism if you run into trouble (java.io.IOException: Cannot run program &quot;objcopy&quot;: error=0, Failed to exec spawn helper: pid: 934, exit value: 1).
(export JAVA_TOOL_OPTIONS=&quot;-Djdk.lang.Process.launchMechanism=vfork&quot; worked for me)
&lt;/p&gt;</description>  </item>
  <item>
    <guid isPermaLink="true">https://mbien.dev/blog/entry/netbeans_git_plugin</guid>
    <title>NetBeans GIT support</title>
    <dc:creator>mbien</dc:creator>
    <link>https://mbien.dev/blog/entry/netbeans_git_plugin</link>
    <pubDate>Sun, 6 Sep 2009 17:15:41 +0000</pubDate>
    <category>NetBeans</category>
    <category>git</category>
    <category>java</category>
    <category>modules</category>
    <category>netbeans</category>
    <category>versioning</category>
<description>&lt;p&gt;
If you are using &lt;a href=&quot;http://git-scm.com/&quot;&gt;GIT&lt;/a&gt; as SCM and NetBeans as IDE you should probably check out &lt;a href=&quot;http://nbgit.org/&quot;&gt;NBGit&lt;/a&gt;. The plugin integrates GIT in NetBeans in the same way as the out of the box Mercurial support does it. In fact both modules have the same origin since nbgit is a fork of the mercurial integration project and incrementally adds features to catch up.
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://code.google.com/p/nbgit/wiki/News&quot;&gt;NBGit Version 0.3&lt;/a&gt; is already fairly stable and provides the basic set of features you would expect from distributed versioning system IDE integration.
&lt;/p&gt;
&lt;h3&gt;Features&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Graph visualization of parallel branches (Browser similar to giggle)&lt;/li&gt;
&lt;li&gt;Versioning History (git log)&lt;/li&gt;
&lt;li&gt;Show changes (git status)&lt;/li&gt;
&lt;li&gt;update/commit/reset&lt;/li&gt;
&lt;li&gt;clone/clone other/git init&lt;/li&gt;
&lt;li&gt;custom actions (custom git commands)&lt;/li&gt;
&lt;li&gt;diff&lt;/li&gt;
&lt;li&gt;in-editor annotation of code changes&lt;/li&gt;
&lt;li&gt;ignore files (parsing &apos;.gitignore&apos; files)&lt;/li&gt;
&lt;li&gt;git properties (username, email etc via options)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The project is developed by volunteers outside Sun, if you like to see GIT integration as out-of-the-box feature in a future version of NetBeans &lt;a href=&quot;http://www.netbeans.org/issues/show_bug.cgi?id=131531&quot;&gt;please vote for this RFE&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
I use the plugin for most of my open source projects and haven&apos;t experience any serious issues so far. I would say its already safe to use since you can&apos;t do anything wrong if you do a &apos;git status&apos; -&gt; &apos;git push&apos; via command line as last step anyway.
&lt;/p&gt;

&lt;!--
&lt;h3&gt;Screenshots&lt;/h3&gt;
&lt;p&gt;
&lt;img src=&quot;http://people.fh-landshut.de/~mbien/weblog/nbgit/gitshowcase_sm.png&quot; alt=&quot;showcase shot&quot;/&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img src=&quot;http://people.fh-landshut.de/~mbien/weblog/nbgit/clone.png&quot; alt=&quot;clone shot&quot;/&gt;
&lt;img src=&quot;http://people.fh-landshut.de/~mbien/weblog/nbgit/in-editor.png&quot; alt=&quot;editor shot&quot;/&gt;
&lt;/p&gt;
--&gt;</description>  </item>
  <item>
    <guid isPermaLink="true">https://mbien.dev/blog/entry/xpath_plugin_now_available_via</guid>
    <title>XPath plugin now available via NetBeans plugin portal</title>
    <dc:creator>mbien</dc:creator>
    <link>https://mbien.dev/blog/entry/xpath_plugin_now_available_via</link>
    <pubDate>Fri, 7 Aug 2009 00:18:03 +0000</pubDate>
    <category>NetBeans</category>
    <category>java</category>
    <category>modules</category>
    <category>netbeans</category>
    <category>xml</category>
    <category>xpath</category>
<description>&lt;p&gt;
The &lt;a href=&quot;//mbien.dev/blog/entry/xpath_netbeans_plugin&quot;&gt;XPath Utility&lt;/a&gt; I submitted to the NetBeans &lt;a href=&quot;http://plugins.netbeans.org/plugin/18522/?show=true&quot;&gt;Plugin Portal&lt;/a&gt; over two months ago has been recently verified against NetBeans 6.7. This makes the plugin now directly available from within the IDE over the Plugin manager (Tools -&amp;gt; Plugins).
&lt;/p&gt;

&lt;p&gt;
One .nbm less to carry with me ;)&lt;br /&gt;
&lt;/p&gt;</description>  </item>
  <item>
    <guid isPermaLink="true">https://mbien.dev/blog/entry/xpath_netbeans_plugin</guid>
    <title>XPath NetBeans plugin</title>
    <dc:creator>mbien</dc:creator>
    <link>https://mbien.dev/blog/entry/xpath_netbeans_plugin</link>
    <pubDate>Tue, 26 May 2009 22:21:56 +0000</pubDate>
    <category>NetBeans</category>
    <category>java</category>
    <category>modules</category>
    <category>netbeans</category>
    <category>xml</category>
    <category>xpath</category>
<description>&lt;p&gt;
I built some time ago a NetBeans plugin which simplifies browsing through large xml documents a bit. Just start typing a XPath expression in the text field of the TopComponent and the result of the (last) xml editor in focus are computed and printed in the textarea below. (You can open the XPath window either by using the context menu on xml files or directly via the window menu)
&lt;/p&gt;

&lt;p&gt;
It uses the JDK&apos;s javax.xml.xpath package which means XPath 1.0 support.&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;img alt=&quot;xpath plugin image&quot; src=&quot;https://raw.githubusercontent.com/mbien/xpath-util/master/xpath-util.png&quot;/&gt;
&lt;/p&gt;

&lt;p&gt;
it also supports basic auto completion and localized error messages (in other words: XPathExpressionException.getCause().getLocalizedMessage()).
&lt;/p&gt;

&lt;p&gt;
Github project can be found &lt;a href=&quot;https://github.com/mbien/xpath-util&quot;&gt;here&lt;/a&gt;. Feel free to use it ;)&lt;br /&gt;
&lt;/p&gt;
</description>  </item>
  <item>
    <guid isPermaLink="true">https://mbien.dev/blog/entry/how_to_reuse_modules_across</guid>
    <title>How to reuse modules across different NetBeans applications</title>
    <dc:creator>mbien</dc:creator>
    <link>https://mbien.dev/blog/entry/how_to_reuse_modules_across</link>
    <pubDate>Mon, 7 Apr 2008 14:34:55 +0000</pubDate>
    <category>NetBeans</category>
    <category>java</category>
    <category>modules</category>
    <category>netbeans</category>
<description>&lt;p&gt;If you develop NetBeans modules you probably also wondered how to add a pre-packaged .nbm file as dependency to your module or how to use modules in multiple suites.&lt;/p&gt;&lt;p&gt;After some search I found that there is currently no official supported way for doing this. The reason is the bidirectional dependency between the suite and each module in the suite. This makes it hard to reuse modules across suites but it is still possible. In this entry I will describe different techniques/hacks to workaround this issue. (Note: technique, hack and workaround in the same sentence ;) )&lt;br /&gt;&lt;/p&gt;&lt;p&gt;In general, you can add a dependency to a module when the module you like to depend on is in:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt; a) your suite&lt;/p&gt;&lt;p&gt;b) the target NetBeans platform (default target platform is the installed IDE)&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;As mentioned above a) works only for one suite -&amp;gt; only b) is left&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;option 1. Assemble your own target platform:&lt;/h4&gt;&lt;p&gt;&lt;b&gt;point and click &lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Either make a copy of NetBeans, or if there&apos;s a lot of stuff you don&apos;t want, create an empty suite. Then build it and create a zip distribution and unpack that&lt;/li&gt;&lt;li&gt;Launch the result&lt;/li&gt;&lt;li&gt;In Tools | Plugins, install the module(s) you want globally (check the &amp;quot;Force install into shared directories&amp;quot; checkbox)
&lt;/li&gt;&lt;li&gt;Shut it down
&lt;/li&gt;&lt;li&gt;In your real IDE, use Tools | NetBeans Platforms to point at the copy of the platform that now has the module you want in it
&lt;/li&gt;&lt;li&gt;Set your suite to build against that. It should pick up the module you installed and all classes in it&apos;s public packages
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;or put it in a &lt;a href=&quot;http://www.nabble.com/Re%3A-adding-a-nbm-to-a-suite---possible--p16363161.html&quot;&gt;build script&lt;br /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;h4&gt;option 2. Install the module into your IDE:&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;&lt;h4&gt;&lt;b&gt; point and click&lt;/b&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;enable &amp;quot;Force install into shared directories&amp;quot; in Tools | Plugins | Settings&lt;/li&gt;&lt;li&gt;install your module(s)&lt;/li&gt;&lt;li&gt;restart NetBeans&lt;br /&gt;&lt;/li&gt;&lt;li&gt;your module is now in the extra cluster and part of your IDE&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;or declarative&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;edit &lt;i&gt;Info/index.xml&lt;/i&gt; inside your .nbm file&lt;br /&gt;&lt;/p&gt;&lt;pre class=&quot;alt2&quot; dir=&quot;ltr&quot; style=&quot;border: 1px inset ; margin: 0px; padding: 3px; overflow: auto; text-align: left;&quot;&gt;&lt;span class=&quot;t&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE module PUBLIC &amp;quot;-//NetBeans//DTD Autoupdate Module Info 2.5//EN&amp;quot; &amp;quot;http://www.netbeans.org/dtds/autoupdate-info-2_5.dtd&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;module codenamebase=&amp;quot;org.yourorghere.module4&amp;quot; distribution=&amp;quot;&amp;quot; downloadsize=&amp;quot;0&amp;quot; &lt;font color=&quot;#ff0000&quot;&gt;&lt;b&gt;global=&amp;quot;true&amp;quot;&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;span class=&quot;t&quot;&gt; homepage=&amp;quot;&amp;quot; license=&amp;quot;AD9FBBC9&amp;quot; moduleauthor=&amp;quot;Michael Bien&amp;quot; needsrestart=&amp;quot;false&amp;quot; releasedate=&amp;quot;2008/04/07&amp;quot; &lt;b&gt;&lt;font color=&quot;#ff0000&quot;&gt;targetcluster=&amp;quot;milkyway&amp;quot;&lt;/font&gt;&lt;/b&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;manifest AutoUpdate-Show-In-Client=&amp;quot;true&amp;quot; OpenIDE-Module=&amp;quot;org.yourorghere.module4&amp;quot; OpenIDE-Module-Implementation-Version=&amp;quot;080407&amp;quot;&lt;/span&gt;&lt;span class=&quot;t&quot;&gt; OpenIDE-Module-Java-Dependencies=&amp;quot;Java &amp;amp;gt; 1.5&amp;quot; OpenIDE-Module-Name=&amp;quot;module4&amp;quot; OpenIDE-Module-Requires=&amp;quot;org.openide.modules.ModuleFormat1&amp;quot; OpenIDE-Module-Specification-Version=&amp;quot;1.1&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;license name=&amp;quot;AD9FBBC9&amp;quot;&amp;gt;[NO LICENSE SPECIFIED]&lt;br /&gt;&amp;lt;/license&amp;gt;&lt;br /&gt;&amp;lt;/module&amp;gt;&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;alternatively you can add the flags to &lt;i&gt;module/nbproject/project.properties&lt;/i&gt; and rebuild/create NBM (if source available)&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;nbm.is.global=true&lt;br /&gt;nbm.target.cluster=milkyway&lt;/pre&gt;&lt;p&gt;Now when you install the module with Tools | Plugins, NetBeans will place the module directly into the installation folder in the new created &amp;quot;milkyway&amp;quot; cluster. With this trick you should be able to use the same library wrapper module in as many suites you want.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Thanks to all on the mailing lists for the help on that topic. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;------&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I am already looking forward to &lt;a href=&quot;http://jcp.org/en/jsr/detail?id=277&quot;&gt;JSR 277&lt;/a&gt; which will hopefully replace the current implementation of the NetBeans module system. (no there was nothing anounced but this would make defenetive sense)&lt;br /&gt;&lt;/p&gt;</description>  </item>
</channel>
</rss>