Fabrizio Giudici is a Senior Java Architect with a long Java experience in the industrial field. He runs Tidalwave, his own consultancy company, and has contributed to Java success stories in a number of fields, including Formula One. Fabrizio often appears as a speaker at international Java conferences such as JavaOne and Devoxx and is member of JUG Milano and the NetBeans Dream Team. Fabrizio is a DZone MVB and is not an employee of DZone and has posted 67 posts at DZone. You can read more from them at their website. View Full User Profile

Using the NetBeans Platform on the Server with Wicket on the Client

01.07.2009
| 35174 views |
  • submit to reddit
Step 5: Patch Tomcat's Common Classloader

Some "boot" libraries of the NetBeans Platform need to be placed in Tomcat's common class loader. They are:

-rw-rw----  1 fritz  staff  255877 Jan  2 17:35 boot.jar
-rw-rw---- 1 fritz staff 619165 Jan 2 17:35 core.jar
-rw-rw---- 1 fritz staff 563443 Jan 2 17:35 org-openide-filesystems.jar
-rw-rw---- 1 fritz staff 23335 Jan 2 17:35 org-openide-modules.jar
-rw-rw---- 1 fritz staff 625986 Jan 2 17:35 org-openide-util.jar

For instance, you can put them in a tomcat-libs directory; in this case, modify the conf/catalina.properties file so there is this line:

common.loader=${catalina.home}/lib,${catalina.home}/lib/*.jar,some/path/to/tomcat-libs/*.jar

This is an annoyance - could be also a problem in some cases (e.g. providers with virtualized hosts don't give you access to the Tomcat configuration). For sure it would be better if you could place these libraries under WEB-INF/lib, but trying that leads to very strange errors. Still investigating on this.

 

A Final Word of Wisdom

The thing works, and at least for the Wicket part I'm having it in production since a couple of months (the WebDAV and REST part are still in development). As usual, you must be very careful when dealing with class loaders, since they can lead to obscure errors when you don't expect (for instance, it suffices that a part of the frameworks you're using does a Class.forName(...) - see how I had to patch Milton, for instance). So, before going that way, prototype and test toroughly. Of course, if you only deal with FLOSS software, problems should be always trackable and fixable in some way. 

One should also investigate how the thing scales - for instance, being the NetBeans Platform designed primarlily for the Desktop (= single user applications), it could contain bottlenecks when used with concurrent users. Only testing can tell - so far, so good, but I'm not running yet with a high number of concurrent customers. In my scenario, I think that I know quite well the NetBeans Platform so I could tweak it if necessary, and this little risk is worth while since I'm getting a huge code reuse (in any case, I've got a "backup plan" for my customer in case I find some blocking issue). In other scenarios, one might want to be more careful. For sure, using the NetBeans Platform in this way is an architectural choice that needs to be explored.

It is also to be said that the NetBeans Platform contains some unnecessary hardwired dependencies on Swing, for instance if you use the DataObjects. In this case, you will need to bring into your application some Swing-related modules to resolve that dependencies, even though they will be not used. Also in this case, I didn't experience problems, but you have to test it in our scenario.

Last but not least, it would be interesting to see how many parts of the NetBeans Platform can be effectively used in a server-side application. For instance, I'm not using Nodes - but they can be useful as well, as they associate actions (menus) to objects and could be used together with Wicket's AJAX capabilities to generate dynamic context menus. On the other hands I fear that they, being related to the single-thread model of Swing, could be a serious bottleneck. I guess this is matter for further investigation (and a further article).

For the record, I've proposed that the small adapter library is added to the PlatformX project. Also, I've submitted a speech proposal about these topics at JavaOne 2009 - so, if you like this article, please speak loud. ;-)

Published at DZone with permission of Fabrizio Giudici, author and DZone MVB.

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)

Comments

Harris Goldstone replied on Fri, 2009/01/09 - 3:25pm

In a Wicket application, what is some of the typical functionality that I could let the NetBeans Platform handle?

Fabrizio Giudici replied on Sun, 2009/01/11 - 7:12am

Hi Harris.

At the moment, the great advantage is for what concerns the tier of services and models, that is the business tier. It is something that can be best clarified by examples, and I'll post some in future here on DZone (also with other two "series" of posts about NetBeans Platform Idioms etc...); for the moment, take this small one: I have a Metadata infrastructure that allow to extract metadata from media (e.g. photos), eventually store them in a database, where they can be searched for. Every kind of metadata (EXIF, IPTC, whatever) is implemented by separate modules, as well as persistence in the database is enabled by just adding specific modules, without requiring any configuration. This means that I can easily satisfy different needs (blueMarine itself, blueOcean base, blueOcean as used by my customer, and hopefully other future customers) by just assembling different set of modules in specific custom platforms. This has been achieved mostly by means of the Lookup API (and in future I could use more the layer.xml facility). Most of this stuff could be used also by taking simple .jars as libraries out of the NetBeans Platform; but as the number of configurations increases, it is really important to have the capability of checking compatibilities and dependencies among modules. You could be always safe with a good testing, but in any case I appreciate when a static tool finds / prevents problems as early as possible. Furthermore, having the very same process for two different projects is a big time saver for me.

There are two different uses of the Platform that I'll evaluate soon. First is the "Event Bus" (based on "Central Lookup" by Wade Chandler) that I've talked about a few months ago; in blueMarine it introduces another great deal of decoupling that in the customer's project based on blueOcean I don't have yet. While the Event Bus as is works fine with a single user (it is a singleton), it must be adapted in the case of concurrency (it should be enough to write a variant based on ThreadLocal). Second is about the use of Nodes for a number of things, including dynamic generation of menus based on the functions that you have dynamically included in the current configuration. This is more sensible because of the cited potential problem with the AWT Thread, which would be a serious bottleneck on the server side.

Aldo Brucale replied on Mon, 2009/01/19 - 8:49am

How can I access org.netbeans.Main from my module? It belongs to the Bootstrap module, but when I add this dependency and try to compile, the build system says that the module containing NetBeansPlatformUtils "is not a friend of <nb-platform-dir>/nbbuild/netbeans/platform9/lib/boot.jar".

Fabrizio Giudici replied on Mon, 2009/01/19 - 9:08am

Actually I've never used the o.n.Main from a Platform module - since it's boot code, I've used it from plain JSE code, and of course I've just included the relevant .jar in the path. For what reason do you need to access o.n.Main from a _Platform_ module? Before searching for you a solution to your question, maybe we can find another, better way to do the thing you're trying.

Aldo Brucale replied on Mon, 2009/01/19 - 11:22am in response to: Fabrizio Giudici

Thank you Fabrizio, of course a module cannot boot the application that is supposed to load it!

I placed the servlet in a regular web project, now it works perfectly. Very interesting, thank you.

Matthew Dempesy replied on Sat, 2011/01/08 - 9:30pm

The module which I was planning to work was purely based on server side application only. I would prefer to use netbeans on my Cloud Hosting server platforms. I have not tried it fully. I would hope that things go cool, without creating much of problems to my head. This writeup which is concerned with the server side process would certainly help me in achieving my goals. If any help I would need I would be here to clear that.

Matt Coleman replied on Thu, 2013/02/21 - 1:09am in response to: Fabrizio Giudici

thanks for explaining this issue Fabrizio..I now understand why

buffalo freelance web designer 

Cata Nic replied on Tue, 2013/09/03 - 3:17am

 Is it possible to use a CDN solution for that. I mean... it will be useful to offer a part of the data via a CDN.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.