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]