diff --git a/polyglot-maven-plugin/src/main/java/org/sonatype/maven/polyglot/plugin/ExecuteMojo.java b/polyglot-maven-plugin/src/main/java/org/sonatype/maven/polyglot/plugin/ExecuteMojo.java index 4edc5740..7bbc019a 100644 --- a/polyglot-maven-plugin/src/main/java/org/sonatype/maven/polyglot/plugin/ExecuteMojo.java +++ b/polyglot-maven-plugin/src/main/java/org/sonatype/maven/polyglot/plugin/ExecuteMojo.java @@ -28,6 +28,7 @@ import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; import org.apache.maven.project.MavenProject; +import org.codehaus.plexus.PlexusContainer; import org.sonatype.maven.polyglot.PolyglotModelManager; import org.sonatype.maven.polyglot.execute.ExecuteContext; import org.sonatype.maven.polyglot.execute.ExecuteManager; @@ -59,6 +60,9 @@ public class ExecuteMojo extends AbstractMojo { @Component(role = PolyglotModelManager.class) private PolyglotModelManager modelManager; + @javax.inject.Inject + private PlexusContainer container; + @Override public void execute() throws MojoExecutionException, MojoFailureException { Log log = getLog(); @@ -97,6 +101,13 @@ public File getBasedir() { public Log getLog() { return ExecuteMojo.this.getLog(); } + + public T lookup(Class clazz) { + return container.lookup(clazz); + } + public Object lookup(String className) { + return container.lookup(Thread.currentThread().getContextClassLoader().loadClass(className)); + } }; for (ExecuteTask task : tasks) { diff --git a/polyglot-ruby/src/main/java/org/sonatype/maven/polyglot/ruby/DualClassLoader.java b/polyglot-ruby/src/main/java/org/sonatype/maven/polyglot/ruby/DualClassLoader.java new file mode 100644 index 00000000..a51baa78 --- /dev/null +++ b/polyglot-ruby/src/main/java/org/sonatype/maven/polyglot/ruby/DualClassLoader.java @@ -0,0 +1,59 @@ + +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; + +public class DualClassLoader extends ClassLoader { + + // not our real parents, but we try them too + List fosterParents = new ArrayList<>(); + + public DualClassLoader(ClassLoader parent) { + super("DualClassLoader",parent); + } + + @Override + public Class loadClass(String name) throws ClassNotFoundException { + for (ClassLoader cl : fosterParents) { + try { + return cl.loadClass(name); + } catch (ClassNotFoundException e) { + // ignore + } + } + return getParent().loadClass(name); + } + + public void append(ClassLoader additional){ + fosterParents.add(additional); + } + + //? + //protected String findLibrary(String libname) {} + + @Override + protected URL findResource(String name) { + + URL result = null; + for (ClassLoader cl : fosterParents) { + result = cl.getResource(name); + if (result != null) + return result; + } + return getParent().getResource(name); + } + + @Override + protected Enumeration findResources(String name) throws IOException { + List results = new ArrayList<>(); + + for (ClassLoader cl : fosterParents) { + results.addAll(Collections.list(cl.getResources(name))); + } + return Collections.enumeration(results); + } + +} diff --git a/polyglot-ruby/src/main/java/org/sonatype/maven/polyglot/ruby/RubyParser.java b/polyglot-ruby/src/main/java/org/sonatype/maven/polyglot/ruby/RubyParser.java index 4a03240c..acfe1b94 100644 --- a/polyglot-ruby/src/main/java/org/sonatype/maven/polyglot/ruby/RubyParser.java +++ b/polyglot-ruby/src/main/java/org/sonatype/maven/polyglot/ruby/RubyParser.java @@ -39,8 +39,10 @@ public RubyParser( ExecuteManager executeManager ) throws IOException { this.executeManager = executeManager; this.jruby = new IsolatedScriptingContainer(); + DualClassLoader loader = new DualClassLoader(jruby.getClassLoader()) + jruby.setClassLoader(loader); this.parser = jruby.runScriptlet( PathType.CLASSPATH, "parser.rb" ); - this.factory = new RubyExecuteTaskFactory( jruby ); + this.factory = new RubyExecuteTaskFactory( jruby, loader ); } // synchronize it since it is not clear how threadsafe everything is diff --git a/polyglot-ruby/src/main/java/org/sonatype/maven/polyglot/ruby/execute/RubyExecuteTask.java b/polyglot-ruby/src/main/java/org/sonatype/maven/polyglot/ruby/execute/RubyExecuteTask.java index ae0452ba..59875b88 100644 --- a/polyglot-ruby/src/main/java/org/sonatype/maven/polyglot/ruby/execute/RubyExecuteTask.java +++ b/polyglot-ruby/src/main/java/org/sonatype/maven/polyglot/ruby/execute/RubyExecuteTask.java @@ -24,7 +24,7 @@ public class RubyExecuteTask extends ExecuteTaskSupport { private ScriptingContainer jruby; private Object script; - public RubyExecuteTask(ScriptingContainer jruby) { + public RubyExecuteTask(ScriptingContainer jruby, DualClassLoader loader) { this.jruby = jruby; } @@ -37,6 +37,7 @@ public void setScript(Object script) { } public void execute(final ExecuteContext context) throws Exception { + loader.append(jruby.getProvider().getRubyInstanceConfig().getCurrentThreadClassLoader()) jruby.callMethod(script, "call", context); } diff --git a/polyglot-ruby/src/main/java/org/sonatype/maven/polyglot/ruby/execute/RubyExecuteTaskFactory.java b/polyglot-ruby/src/main/java/org/sonatype/maven/polyglot/ruby/execute/RubyExecuteTaskFactory.java index 8b504f9d..8243bec5 100644 --- a/polyglot-ruby/src/main/java/org/sonatype/maven/polyglot/ruby/execute/RubyExecuteTaskFactory.java +++ b/polyglot-ruby/src/main/java/org/sonatype/maven/polyglot/ruby/execute/RubyExecuteTaskFactory.java @@ -20,12 +20,12 @@ public class RubyExecuteTaskFactory { private ScriptingContainer jruby; private List tasks = new LinkedList(); - public RubyExecuteTaskFactory( ScriptingContainer jruby ) { + public RubyExecuteTaskFactory( ScriptingContainer jruby, DualClassLoader loader ) { this.jruby = jruby; } public void addExecuteTask( String id, String phase, String profileId, Object script ){ - RubyExecuteTask task = new RubyExecuteTask( jruby ); + RubyExecuteTask task = new RubyExecuteTask( jruby, loader ); task.setId( id ); task.setPhase( phase ); task.setProfileId( profileId );