2009-04-21 4 views
9

Ich möchte eine Eigenschaft in meinem Pom auf einen Klassenpfad festlegen, der alle Abhängigkeiten des Projekts enthält. Das Ameisen-Plugin macht so etwas, also weiß ich, dass es definitiv möglich ist.Festlegen einer Eigenschaft auf was maven.compile.classpath Enthält OHNE Ant

Ich möchte im Grunde $ {maven.compile.classpath} verwenden, wo immer ich in meinem Pom möchte und es 'einfach funktionieren'. Es macht mir nichts aus, Plugins oder irgendetwas anderes zu benutzen, um dies zu erreichen.

Vielen Dank,

Nick

Antwort

5

Ich glaube nicht, dass es ein Weg, dies zu tun, ohne Ihr eigenes Maven Plugin zu schreiben. Das heißt, Sie können den Klassenpfad mit dependency:build-classpath erreichen. Ist das von Nutzen?

2

Ich zweite die Abhängigkeit: Build-Classpath-Vorschlag. Es wird derzeit nicht in eine Eigenschaft geschrieben, könnte aber leicht geändert werden. (Patches akzeptiert)

+0

http://stackoverflow.com/questions/849389/how-to-read-an-external-properties-file -in-maven erläutert, wie das Ergebnis als Maven-Eigenschaft geladen wird. Ein Anhang in http://jira.codehaus.org/browse/MCOMPILER-97 bietet ein vollständiges Beispiel. –

6

Dies ist, wie es funktioniert:

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

Nach Aufruf der Datei ist Sie ${maven.classpath} Eigenschaft nutzen können.

+0

Ich mag diese Lösung sehr, aber weil es keinen antrun m2e Connector gibt, kann ich ihn nicht benutzen. – Ring

+0

Dies scheint nicht zu funktionieren, um Eltern Pom-Deklaration von Kindern Poms verwendet werden .... – momomo

5

Seit Version 2.7 kann das maven-dependency-plugin nun eine Eigenschaft auf den Klassenpfad setzen. Hier ein Beispiel:

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

Wenn Sie Eclipse-wollen Unterstützung hier ist meine Update-Site:

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

0

Wenn Sie den Classpath als einfache Liste der Gläser (ohne den vollständigen Pfad) erzeugen müssen, Sie können ein Plugin wie das im Beispiel unten implementieren. Ich brauche den Klassenpfad im Manifest mit einer anderen Eigenschaft als "Class-Path", weil ich ein Tool wie Eclipse "JarRsrcLoader" verwende (ähnlich wie One-JAR) und ich möchte eine Manifest.MF wie folgt erstellen:

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

So definiert ich ein Maven Plugin wie folgt aus:

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()); 
     } 

    } 

dieses Plugin verwenden, können Sie eine Eigenschaft definieren, die die Liste der Gläser des classpath enthält:

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

und diese Eigenschaft verwenden, wo immer Sie, zum Beispiel für die Erstellung Ihrer benutzerdefinierte MANIFEST.MF wollen:

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