I am writing some code-gen maven-plugin.
I need my project classpath be injected in to my plugin execution classpath.
I found this article. The solution there works but is quite long. Maybe someone of you know an out of the box solution.
Maven Archiver can add the classpath of your project to the manifest.
The exec plugin provides another way to display the Maven generated classpath: $ mvn exec:exec -Dexec. executable=echo -Dexec. args="%classpath" [INFO] Scanning for projects...
Description: This goal outputs a classpath string of dependencies from the local repository to a file or log.
Found the answer!
OK , Pascal is right , here it is for the foundation!!
So here is the cleanest way ( as far as i know ) to add the compile classpath to the execution of you plugin.
Here are some code samples from my code-gen plugin, that is actually generating some template code based on the code compiled. So I needed first the code compiled, then analyzed, generate some code, and then compiled again.
Use @configurator
in the Mojo class:
/** * @goal generate * @phase process-classes * @configurator include-project-dependencies * @requiresDependencyResolution compile+runtime */ public class CodeGenMojo extends AbstractMojo { public void execute() throws MojoExecutionException { // do work.... } }
Please pay attention to the @configurator
line in the javadoc header, it is essetial for the plexus IOC container and is not just another comment line.
The implementation of the include-project-dependencies
configurator. There is this very nice class that I took from some Brian Jackson, add it to the source of your plugin.
/** * A custom ComponentConfigurator which adds the project's runtime classpath elements * to the * * @author Brian Jackson * @since Aug 1, 2008 3:04:17 PM * * @plexus.component role="org.codehaus.plexus.component.configurator.ComponentConfigurator" * role-hint="include-project-dependencies" * @plexus.requirement role="org.codehaus.plexus.component.configurator.converters.lookup.ConverterLookup" * role-hint="default" */ public class IncludeProjectDependenciesComponentConfigurator extends AbstractComponentConfigurator { private static final Logger LOGGER = Logger.getLogger(IncludeProjectDependenciesComponentConfigurator.class); public void configureComponent( Object component, PlexusConfiguration configuration, ExpressionEvaluator expressionEvaluator, ClassRealm containerRealm, ConfigurationListener listener ) throws ComponentConfigurationException { addProjectDependenciesToClassRealm(expressionEvaluator, containerRealm); converterLookup.registerConverter( new ClassRealmConverter( containerRealm ) ); ObjectWithFieldsConverter converter = new ObjectWithFieldsConverter(); converter.processConfiguration( converterLookup, component, containerRealm.getClassLoader(), configuration, expressionEvaluator, listener ); } private void addProjectDependenciesToClassRealm(ExpressionEvaluator expressionEvaluator, ClassRealm containerRealm) throws ComponentConfigurationException { List<String> runtimeClasspathElements; try { //noinspection unchecked runtimeClasspathElements = (List<String>) expressionEvaluator.evaluate("${project.runtimeClasspathElements}"); } catch (ExpressionEvaluationException e) { throw new ComponentConfigurationException("There was a problem evaluating: ${project.runtimeClasspathElements}", e); } // Add the project dependencies to the ClassRealm final URL[] urls = buildURLs(runtimeClasspathElements); for (URL url : urls) { containerRealm.addConstituent(url); } } private URL[] buildURLs(List<String> runtimeClasspathElements) throws ComponentConfigurationException { // Add the projects classes and dependencies List<URL> urls = new ArrayList<URL>(runtimeClasspathElements.size()); for (String element : runtimeClasspathElements) { try { final URL url = new File(element).toURI().toURL(); urls.add(url); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Added to project class loader: " + url); } } catch (MalformedURLException e) { throw new ComponentConfigurationException("Unable to access project dependency: " + element, e); } } // Add the plugin's dependencies (so Trove stuff works if Trove isn't on return urls.toArray(new URL[urls.size()]); } }
Here is the build part of my plugin that you will have to add.
<modelVersion>4.0.0</modelVersion> <groupId>com.delver</groupId> <artifactId>reference-gen-plugin</artifactId> <name>Reference Code Genration Maven Plugin</name> <packaging>maven-plugin</packaging> <version>1.2</version> <url>http://maven.apache.org</url> <properties> <maven.version>2.2.1</maven.version> </properties> <build> <plugins> <plugin> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-maven-plugin</artifactId> <executions> <execution> <goals> <goal>descriptor</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-artifact</artifactId> <version>${maven.version}</version> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-plugin-api</artifactId> <version>${maven.version}</version> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-project</artifactId> <version>${maven.version}</version> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-model</artifactId> <version>${maven.version}</version> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-core</artifactId> <version>2.0.9</version> </dependency> </dependencies>
Here is the pom.xml of the plugin for these who need it. Should compile wihtout a problem now. ( something wrong with the header, so ignore it )
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With