Hi,

Claudio Ranieri schrieb:
Hi,

Why the maven plugins doesn´t load all libraries declared in pom.xml?

You have to distinguish between the plugin project and the project you are using the plugin with. All libraries (with a proper scope) declared in the pom of the plugin project are available (on the classpath) to the plugin during execution. This includes libraries you are specifying in the <plugin><dependencies> section of the project using your plugin.

The libraries declared in the pom of the project you are using your plugin in however, are not available. And for a good reason, just think abaout the bad things that could happen when both, the plugin and your project use the same library for example, but a different version of it.

The conclusion in one sentence: You don't ever want the dependencies (classpathes) of your project and the dependencies of a plugin used during the build of your project mixed.

I tried to use the initClassLoader because this code works in 
jaxws-maven-plugin.
In the code of jaxws-maven-plugin there is:

" Need to build a URLClassloader since Maven removed it form the chain "

Why?

I don't know the jaxws-maven-plugin, so I can't really tell anything about its design and implementation. You will have to ask the developers of the plugin about such specific questions.

All advice I can give you is that you should read and learn about the different kinds of classloaders (and classloaders in generel) in Java and how to properly use them.

So far, all plugins I've seen the source code of construct a new classloader with the classes the external tool needs and then use the loadClass() method of that classloader to get an instance of the class they need. Examples of this can be seen in the compiler-plugin or fit-maven-plugin (as someone on the dev list already wrote).

Thanks

-Tim

-----Mensagem original-----
De: Tim Kettler [mailto:[EMAIL PROTECTED]
Enviada em: quarta-feira, 21 de maio de 2008 10:57
Para: Maven Users List
Assunto: Re: Problem with classloader in maven plugin

Hi,

you've missunderstood the concept of a context classloader.

A documentation bug [1] is open since a long time. Setting the context
classloader doesn't mean that all classes created from that point on are
created through this classloader. See here [2] and [3] for more information.

[1] http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4868493
[2] http://www.javaworld.com/javaqa/2003-06/01-qa-0606-load.html
[3] http://www.javageeks.com/Papers/ClassForName/index.html

-Tim

Claudio Ranieri schrieb:
Hi

I am trying to create a maven plugin to jboss wsconsume, but I have a problem 
with classloader in plugin.
My plugin is based in an ant task (WSConsumeTask).
I am using maven 2.0.8 on Windows machine.
When I created a simple Java project with libraries necessary, my code works.
How shown below:

public static void main(String[] args) {
  WSConsumeTask t = new WSConsumeTask();
  t.setWsdl("https://xxx/crypto?wsdl";);
  t.setVerbose(true);
  t.setKeep(true);
  t.execute();
}

But when I am using into maven plugin, I got problem with classloader.
I got this exception:

C:\eclipse\workspace\TestePluginMaven\output\com\buscape\bean\CryptoService.java:7:
 cannot find symbol
symbol  : class Service
location: package javax.xml.ws
import javax.xml.ws.Service;
                    ^
C:\eclipse\workspace\TestePluginMaven\output\com\buscape\bean\CryptoService.java:8:
 cannot find symbol
symbol  : class WebEndpoint
location: package javax.xml.ws
import javax.xml.ws.WebEndpoint;
                    ^
C:\eclipse\workspace\TestePluginMaven\output\com\buscape\bean\CryptoService.java:9:
 cannot find symbol
symbol  : class WebServiceClient
location: package javax.xml.ws
import javax.xml.ws.WebServiceClient;

The plugin classloader doesn´t load the jaxws libraries. But this libraries was 
added in pom.xml of plugin.
I tried to add dependencies tag in my plugin config, but didn´t works. How 
shown below:

<plugin>
  <groupId>jboss</groupId>
  <artifactId>maven-jbossws-plugin</artifactId>
  <version>1.0.0</version>
  <configuration>
    <verbose>true</verbose>
    <keep>true</keep>
    <wsdl>https://xxx/crypto?wsdl</wsdl>
  </configuration>
  <dependencies>
    <dependency>
      <groupId>jboss.jbossws</groupId>
      <artifactId>jaxws-tools</artifactId>
      <version>3.0.1-native-2.0.4.GA</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>jboss.jbossws</groupId>
      <artifactId>jboss-jaxws</artifactId>
      <version>3.0.1-native-2.0.4.GA</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</plugin>

I tried too to use an initClassLoader based in jaxws-maven-plugin source, how 
shown below:

   private String initClassLoader(ClassLoader parent) throws 
MojoExecutionException {
                    try {
                                List classpathFiles = 
project.getCompileClasspathElements();
                        URL[] urls = new URL[classpathFiles.size() + 4];
                        StringBuffer classPath = new StringBuffer();
                        for (int i = 0; i < classpathFiles.size(); ++i) {
                            getLog().debug((String)classpathFiles.get(i));
                            urls[i] = new 
File((String)classpathFiles.get(i)).toURL();
                            classPath.append((String)classpathFiles.get(i));
                            classPath.append(File.pathSeparatorChar);
                        }
                        urls[classpathFiles.size()] = new 
File(project.getBuild().getOutputDirectory()).toURL();

                        urls[classpathFiles.size() + 1] = 
getArtifact("jboss.jbossws:jboss-jaxws");

                        urls[classpathFiles.size() + 2] = 
getArtifact("jboss.jbossws:jaxws-tools");

                        File toolsJar = new 
File(System.getProperty("java.home"),"../lib/tools.jar");
                        if (!toolsJar.exists()) {
                                toolsJar = new 
File(System.getProperty("java.home"),"lib/tools.jar");
                        }
                        urls[classpathFiles.size() + 3] = toolsJar.toURL();

                        System.out.println("urls: "+Arrays.toString(urls));

                        URLClassLoader cl = new URLClassLoader(urls,parent);
                        // Set the new classloader
                        Thread.currentThread().setContextClassLoader(cl);
                        
System.setProperty("java.class.path",classPath.toString());
                        String sysCp = System.getProperty("java.class.path");
                        return sysCp;
                    }
                    catch (MalformedURLException e) {
                        throw new MojoExecutionException(e.getMessage(),e);
                    }
                    catch (DependencyResolutionRequiredException e) {
                        throw new MojoExecutionException(e.getMessage(),e);
                    }

    }

    public void execute() throws MojoExecutionException {
                  // Need to build a URLClassloader since Maven removed it form 
the chain
        ClassLoader parent = this.getClass().getClassLoader();
        String originalSystemClasspath = this.initClassLoader( parent );

        try {

                        // Execute WSConsumeTask
                        WSConsumeTask t = new WSConsumeTask();
                                  t.setWsdl(wsdl);
                                  t.setVerbose(verbose);
                                  t.setKeep(keep);
                                  t.execute();
        }
        finally {
                // Set back the old classloader
          Thread.currentThread().setContextClassLoader(parent);
          System.setProperty("java.class.path",originalSystemClasspath);
        }
    }

But, it doesn´t works.
Please, can someone help me?
Thanks



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to