2010-04-17 6 views

Répondre

17

Trouvé le answer!

OK, Pascal a raison, la voilà pour la fondation !!

Donc, voici la manière la plus propre (autant que je sache) d'ajouter le chemin de classe de compilation à l'exécution de votre plugin.

Voici quelques exemples de code de mon plugin code-gen, qui génère en fait du code de modèle basé sur le code compilé. J'ai donc d'abord besoin du code compilé, puis analysé, générer du code, puis recompilé.

  1. Utilisez @configurator dans la classe Mojo:

    /** 
    * @goal generate 
    * @phase process-classes 
    * @configurator include-project-dependencies 
    * @requiresDependencyResolution compile+runtime 
    */ 
    public class CodeGenMojo 
         extends AbstractMojo 
    { 
        public void execute() 
          throws MojoExecutionException 
        { 
         // do work.... 
        } 
    } 
    

    S'il vous plaît prêter attention à la ligne @configurator dans l'en-tête de javadoc, il est essetial pour le conteneur de la COI plexus et est non seulement une autre ligne de commentaire.

  2. L'implémentation du configurateur include-project-dependencies. Il y a cette très belle classe que j'ai empruntée à certains Brian Jackson, ajoutez-la à la source de votre 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()]); 
        } 
    
    } 
    
  3. Voici la partie de construction de mon plugin que vous devrez ajouter.

    <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> 
    

    Voici le pom.xml du plugin pour ceux qui en ont besoin. Devrait compiler wihtout un problème maintenant. (Quelque chose de mal avec l'en-tête, donc l'ignorer)

+1

+1 Oui, c'est la voie à suivre autant que je sache. Ce serait bien d'expliquer ou de résumer le lien dans votre réponse. Cela permettrait d'améliorer grandement la valeur de votre question et votre réponse pour les lecteurs à mon humble avis. –

+0

C'est la solution dont j'ai besoin - je n'arrive pas à la compiler. Je pense que j'ai la mauvaise version de certaines classes. Je me demande si vous pouvez ajouter les sections pertinentes de votre pom.xml à votre réponse s'il vous plaît. –

+3

Pour que 'project.runtimeClasspathElements' inclue toutes les dépendances transitives, vous devez l'annoter avec [' @ requiresDependencyResolution'] (http://maven.apache.org/developers/mojo-api-specification.html#The_Descriptor_and_Annotations). –

1

suivi ce lien .... ont très chose semblable pour mon code ... j'ai créé un maven-plugin-forme Je l'ai utilisé exactement même pom.xml pour mon plugin, en réutilisant le IncludeProjectDependenciesComponentConfigurator

J'utilise maven 2.2.0 si elle peut aider, voici pom encore

<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.worldcorpservices.plugins</groupId> 
<artifactId>maven-fit-plugin</artifactId> 
<packaging>maven-plugin</packaging> 
<version>1.0-SNAPSHOT</version> 
<name>maven-fit-plugin Maven Mojo</name> 
<url>http://maven.apache.org</url> 

<properties> 
    <fitlibrary.version>2.0</fitlibrary.version> 
    <maven.version>2.2.0</maven.version> 
</properties> 


<dependencies> 
    <dependency> 
     <groupId>org.apache.maven</groupId> 
     <artifactId>maven-plugin-api</artifactId> 
     <version>2.0</version> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.7</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>commons-logging</groupId> 
     <artifactId>commons-logging</artifactId> 
     <version>1.1.1</version> 
    </dependency> 

    <dependency> 
     <groupId>org.fitnesse</groupId> 
     <artifactId>fitlibrary</artifactId> 
     <version>${fitlibrary.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.12</version> 
    </dependency> 
    <dependency> 
     <groupId>poi</groupId> 
     <artifactId>poi</artifactId> 
     <version>3.7-20101029</version> 
    </dependency> 

    <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> 
<build> 

espérons que cette aide

MFG marco

<plugins> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.codehaus.plexus</groupId> 
      <artifactId>plexus-maven-plugin</artifactId> 
      <executions> 
       <execution> 
        <goals> 
         <goal>descriptor</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 


    </plugins> 

</build> 

16

J'ai pris cette approche et apparemment il travaille:

1 - un paramètre MavenProject est nécessaire DED au sein de votre classe Mojo:

@Parameter(defaultValue = "${project}", required = true, readonly = true) 
private MavenProject project; 

2 - et vous pouvez obtenir les éléments classpath de instance du projet:

try { 
    Set<URL> urls = new HashSet<>(); 
    List<String> elements = project.getTestClasspathElements(); 
            //getRuntimeClasspathElements() 
            //getCompileClasspathElements() 
            //getSystemClasspathElements() 
    for (String element : elements) { 
     urls.add(new File(element).toURI().toURL()); 
    } 

    ClassLoader contextClassLoader = URLClassLoader.newInstance(
      urls.toArray(new URL[0]), 
      Thread.currentThread().getContextClassLoader()); 

    Thread.currentThread().setContextClassLoader(contextClassLoader); 

} catch (DependencyResolutionRequiredException e) { 
    throw new RuntimeException(e); 
} catch (MalformedURLException e) { 
    throw new RuntimeException(e); 
} 
+5

+1. Au lieu d'accéder aux éléments classpath à travers le champ 'MavenProject', on peut également demander que les éléments soient injectés immédiatement, par ex. '@Parameter (property =" projet.compileClasspathElements ", required = true, readonly = true) private Liste classpath;' – Stephan202

+1

Si vous utilisez ceci pour rechercher des classes en utilisant 'org.reflections.Reflections', vous aurez besoin pour instancier 'Reflections' en utilisant:' nouveau ConfigurationBuilder(). setUrls (ClasspathHelper.forClassLoader (contextClassLoader)) ' – CorayThan

Questions connexes