You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@maven.apache.org by Will Gwaltney <Wi...@sas.com> on 2005/04/19 20:49:16 UTC

[m2] wrapping in a M2 plugin an Ant task that accesses a resource in a jar

Hi all,

  I'm writing a maven plugin in java to wrap an Ant taskdef that we use in our build process.  I'm having some trouble accessing a resource in the jar that contains the taskdef.  The taskdef uses the following code to read the file:

-------------------------------- (snip) ----------------------------------------

   private static final String DEFAULT_TEMPLATE_FILE_NAME = "RB.template";

	.
	.
	.

        BufferedInputStream bis = new BufferedInputStream(getClass().getResourceAsStream(DEFAULT_TEMPLATE_FILE_NAME));
        if (bis == null)
          throw new BuildException(MessageFormat.format("CreateResourceBundleClasses task could not open RB template \"{0}\".",
                                                        new Object[] { DEFAULT_TEMPLATE_FILE_NAME }));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
        byte bytes[] = new byte[Math.max(2048, bis.available())];

-------------------------------- (snip) ----------------------------------------

This works just great when the taskdef is run from Ant, but when I try to run it from my maven plugin, the taskdef code throws in the bis.available() method.  Here's stack trace:

-------------------------------- (snip) ----------------------------------------

org.apache.maven.plugin.PluginExecutionException: Error generating Resource Bundle code
        at org.apache.maven.plugin.rb.RBMojo.execute(RBMojo.java:142)
        at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:432)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeMojo(DefaultLifecycleExecutor.java:448)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:144)
        at org.apache.maven.DefaultMaven.processProject(DefaultMaven.java:212)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:136)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:233)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:324)
        at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:303)
        at org.codehaus.classworlds.Launcher.launch(Launcher.java:243)
        at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:416)
        at org.codehaus.classworlds.Launcher.main(Launcher.java:363)
Caused by: java.io.IOException: Stream closed
        at com.sas.tools.ant.CreateResourceBundleClasses.createResourceBundles(CreateResourceBundleClasses.java:652)
        at com.sas.tools.ant.CreateResourceBundleClasses.execute(CreateResourceBundleClasses.java:503)
        at org.apache.maven.plugin.rb.RBMojo.execute(RBMojo.java:129)
        ... 14 more
Caused by: java.io.IOException: Stream closed
        at com.sas.tools.ant.CreateResourceBundleClasses.getDefaultTemplate(CreateResourceBundleClasses.java:460)
        at com.sas.tools.ant.CreateResourceBundleClasses.getTemplate(CreateResourceBundleClasses.java:426)
        at com.sas.tools.ant.CreateResourceBundleClasses.createResourceBundles(CreateResourceBundleClasses.java:580)
        ... 16 more
Caused by: java.io.IOException: Stream closed
        at java.io.BufferedInputStream.ensureOpen(BufferedInputStream.java:120)
        at java.io.BufferedInputStream.available(BufferedInputStream.java:336)
        at com.sas.tools.ant.CreateResourceBundleClasses.getDefaultTemplate(CreateResourceBundleClasses.java:449)
        ... 18 more
-------------------------------- (snip) ----------------------------------------

Note the IOException at the bottom that says "Stream closed".  I assume that the getResourceAsStream() method can't find the file, but I can't figure out why it doesn't find it in maven but does find it in ant.

BTW, here's the pertinent plugin code that wraps the ant taskdef:

-------------------------------- (snip) ----------------------------------------

			// create a dummy ant project and target to wrap the task we're invoking
			final class Creator extends CreateResourceBundleClasses {
				public Creator() {
					project = new Project();
					project.init();
					taskType = "create";
					taskName = "create";
					target = new Target();
				}	
			}
			
			Creator creator = new Creator();
			creator.execute();

-------------------------------- (snip) ----------------------------------------

Could this be a difference in classloaders between Ant and Maven? A security issue? I'm kind of stumped right now, so any help would be much appreciated!

Will

-----------------------------------------
Will Gwaltney
SAS Institute
Will.Gwaltney@sas.com
919-531-9025
"Nothing is more impossible than to write a book that wins every reader's approval." - Miguel de Cervantes
-----------------------------------------



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org