Hello,

For the javascript maven plugin I have a classloader issue to address :

The plugin itself requires Rhino javascript engine as a dependency.
To support javascript compression, I'd like to provides support for various
compressors : JSMin, Dojo Shrinksafe, Yahoo compressor...

The 2 later use some customized Rhino engine. I can't set them as dependency
as this creates a classpath conflict.

I'd like to setup some custom "parent-last" classloader to load and run the
compressor :

plugin classloader [mozilla unmodified Rhino engine]
  |_ shrinksafe compresor classloader [dojo custom rhino]
  |_ yui compressor classloader [custom rhino]

The plugin could then invoke the compressor by reflection on the Class
object obtained form the compressor-dedicated classloader.

<pseudo-code>
  // Create a parent-last classloader
  ParentLastClassLoader cl = new ParentLastClassloader(
this.getClass().getClassLoader()
);

  // Add the required dependencies artifacts
  Artifact customRhino = pluginArtifactMap.get( "
org.dojotoolkit:custom_rhino" );
  cl.addPath( customRhino.getFile().toUrl() );

  // Add the plugin itself
   Artifact plugin = project.getPlugin( "
org.codeahus.mojo:maven-javascript-plugin" );
  cl.addPath( plugin.getFile().toUrl() );

  // Load the taret compressor class from isolated classloader
  Class compressor = cl.getClass( ShrinkSafeCompressor.class.getName() );

  // Invoke by reflection compress( File source, File dest );
  Method compress = compressor.getMethod( "compress", ... );
  compress.invoke( compressor.newInstance(), source, dest );
</pseudo-code>

Is there allready some code that use same strategy ? I've looked at
classworld but hardly understand how to configure it for such use case.

Any suggestion would be welcome !

Nico.

Reply via email to