»
November 04, 2009
»

Creating Classpath From Compile Scope Elements in Maven Mojo

Lets suppose we have the pom with following (shortened) structure:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
  http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  
  <groupId>com.ampatspell.skeleton</groupId>
  <artifactId>frontend</artifactId>
  <version>0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <dependencies>
    <dependency>
      <groupId>com.google.webtoolkit</groupId>
      <artifactId>gwt-user</artifactId>
      <version>${gwt-version}</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.google.webtoolkit</groupId>
      <artifactId>gwt-dev</artifactId>
      <version>${gwt-version}</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
  
  <build>
    <plugins>
      <plugin>
        <groupId>com.ampatspell.maven.plugins</groupId>
        <artifactId>something</artifactId>
        <version>1.0-SNAPSHOT</version>
      </plugin>
    </plugins>
  </build>

</project>

To create ClassPath from both dependencies and compiled project classes (what can be filtered out of course):

/**
 * The maven project.
 *
 * @parameter expression="${project}"
 * @required
 */
protected MavenProject project;

protected ClassLoader getClassLoader() throws FewNastyExceptions {
  synchronized (SomethingMojo.class) {
    if (classLoader != null)
      return classLoader;
  }
  synchronized (SomethingMojo.class) {
    List<URL> urls = new ArrayList<URL>();
    for (Object object : project.getCompileClasspathElements()) {
      String path = (String) object;
      urls.add(new File(path).toURL());
    }
    classLoader = new URLClassLoader(urls.toArray(new URL[] {}) /*, parentClassLoader */);
    // Thread.currentThread().setContextClassLoader(classLoader); // if needed
    return classLoader;
  }
}

This created ClassLoader includes:

  • target/classes/
  • ~/.m2/repository/[..]/gwt-user-2.0.0-ms2.jar
  • ~/.m2/repository/[..]/gwt-dev-2.0.0-ms2.jar

To get class from given ClassLoader:

protected Class<?> getClass(String className) {
  return getClassLoader().loadClass(className);
}
 
Internet Explorer 6
Are you serious?