2009-04-21 5 views
9

Je souhaite définir une propriété dans mon pom sur un chemin de classe contenant toutes les dépendances du projet. Le plugin ant fait quelque chose comme ça, donc je sais que c'est vraiment possible.Définition d'une propriété sur ce que maven.compile.classpath contient WITHOUT Ant

Je veux fondamentalement utiliser $ {maven.compile.classpath} partout où je veux dans mon pom et le faire 'juste travailler'. Cela ne me dérange pas d'utiliser des plugins ou quoi que ce soit d'autre pour y parvenir.

Un grand merci,

Nick

Répondre

5

Je ne pense pas qu'il ya une façon de le faire sans écrire votre propre plugin Maven. Cela dit, vous pouvez obtenir au classpath en utilisant dependency:build-classpath. Est-ce utile?

2

Je seconde la dépendance: suggestion de construction-classpath. Il ne sera pas mis dans une propriété actuellement, mais pourrait facilement être modifié pour le faire. (Patches acceptés)

+0

http://stackoverflow.com/questions/849389/how-to-read-an-external-properties-file -in-maven explique comment charger le résultat en tant que propriété Maven. Une pièce jointe dans http://jira.codehaus.org/browse/MCOMPILER-97 offre un exemple complet. –

6

Voilà comment cela fonctionne:

<plugin> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <version>1.7</version> 
    <executions> 
    <execution> 
     <id>define-classpath</id> 
     <phase>process-resources</phase> 
     <goals> 
     <goal>run</goal> 
     </goals> 
     <configuration> 
     <exportAntProperties>true</exportAntProperties> 
     <target> 
      <property name="maven.classpath" refid="maven.runtime.classpath"/> 
     </target> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

Après il est exécuté, vous pouvez utiliser la propriété ${maven.classpath}.

+0

J'aime beaucoup cette solution, mais comme il n'y a pas de connecteur antrun m2e, je suis incapable de l'utiliser. – Ring

+0

Cela ne semble pas fonctionner sur la déclaration pom parent à être utilisé par les enfants poms .... – momomo

5

Depuis la version 2.7, le plugin maven-dependency-plugin peut maintenant définir une propriété pour le chemin de classe. Voici un exemple:

<plugin> 
     <artifactId>maven-dependency-plugin</artifactId> 
     <version>2.8</version> 
     <executions> 
      <execution> 
       <phase>generate-sources</phase> 
       <goals> 
        <goal>build-classpath</goal> 
       </goals> 
       <configuration> 
       <outputProperty>maven.compile.classpath</outputProperty> 
       <pathSeparator>;</pathSeparator> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 

Si vous voulez le support Eclipse est ici mon site de mise à jour:

http://terraframe.github.io/m2e-maven-dependency-plugin/snapshots/

0

Si vous avez besoin pour générer le chemin de classe comme une simple liste des bocaux (sans le chemin complet), vous pouvez implémenter un plugin comme celui de l'exemple ci-dessous. Mon besoin est d'ajouter le classpath dans le manifeste en utilisant une propriété autre que "Class-Path" parce que j'utilise un outil comme Eclipse "JarRsrcLoader" (c'est similaire à One-JAR) et je veux créer un Manifest.MF comme ceci:

Manifest-Version: 1.0 
Rsrc-Class-Path: ./ ssm-core-0.0.1-SNAPSHOT.jar commons-codec-1.9.jar 
commons-io-2.4.jar ehcache-2.8.3.jar spring-beans-4.0.5.RELEASE.jar s 
sm-standalone-cryptlayer-0.0.1-SNAPSHOT.jar shiro-core-1.2.3.jar comm 
ons-beanutils-1.8.3.jar bcprov-jdk15on-1.50.jar javacsv-2.0.jar ssm-f 
ile-persistence-0.0.1-SNAPSHOT.jar spring-context-4.0.5.RELEASE.jar s 
pring-aop-4.0.5.RELEASE.jar aopalliance-1.0.jar spring-core-4.0.5.REL 
EASE.jar commons-logging-1.1.3.jar spring-expression-4.0.5.RELEASE.ja 
r slf4j-log4j12-1.7.7.jar slf4j-api-1.7.7.jar log4j-1.2.17.jar 
Built-By: ctasso 
Build-Jdk: 1.7.0_10 
Class-Path: . 

Alors, je définissais un plugin Maven comme ceci:

public void execute() throws MojoExecutionException, MojoFailureException { 
     try { 


      MavenArchiver mavenArchiver = new MavenArchiver(); 

      ManifestConfiguration config = new ManifestConfiguration(); 
      config.setAddClasspath(true); 
      Manifest manifest = mavenArchiver.getManifest(project, config); 


      String classPath = manifest.getMainAttributes().getValue("Class-Path"); 

      getLog().debug(String.format("Setting the classpath property %s to %s",classpathVarName,classPath)); 

      project.getProperties().put(classpathVarName, classPath); 

     } catch (DependencyResolutionRequiredException e) { 
      throw new MojoFailureException(e.getMessage()); 
     } catch (ManifestException e) { 
      throw new MojoFailureException(e.getMessage()); 
     } 

    } 

Grâce à ce plugin, vous pouvez définir une propriété qui contient la liste des bocaux en verre de classpath:

<plugin> 
    <groupId>it.cineca.plugins</groupId> 
    <artifactId>classpath-maven-plugin</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <executions> 
     <execution> 
      <id>set-classpath</id> 
      <phase>package</phase> 
      <goals> 
       <goal>setcp</goal> 
      </goals> 
      <configuration> 
       <classpathVarName>cineca.classpath</classpathVarName> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

et utiliser cette propriété où vous voulez, par exemple pour la création de votre Manifest.mf personnalisé:

<archive> 
    <manifestEntries> 
     <Rsrc-Class-Path>./ ${cineca.classpath}</Rsrc-Class-Path> 
     <Class-Path>.</Class-Path> 
     <Rsrc-Main-Class>it.cineca.cpd.starter.TestStarter</Rsrc-Main-Class> 
     <Main-Class>org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader</Main-Class> 
    </manifestEntries> 
</archive> 
Questions connexes