2009-04-21 8 views
9

Me gustaría establecer una propiedad en mi pom para un classpath que contenga todas las dependencias del proyecto. El plugin de ant hace algo como esto, así que sé que definitivamente es posible.Establecer la propiedad de lo que maven.compile.classpath contiene SIN Ant

Básicamente quiero usar $ {maven.compile.classpath} donde me gusta en mi pom y decir que 'solo funciona'. No me importa usar complementos o cualquier otra cosa para lograr esto.

Muchas gracias,

Nick

Respuesta

5

No creo que hay una manera de hacer esto sin tener que escribir su propio plugin de Maven. Dicho eso, puedes obtener el classpath usando dependency:build-classpath. ¿Es eso de uso?

2

En segundo lugar la sugerencia de dependency: build-classpath. No lo colocará en una propiedad actualmente, pero podría modificarse fácilmente para hacerlo. (Parches aceptados)

+0

http://stackoverflow.com/questions/849389/how-to-read-an-external-properties-file -in-maven discute cómo cargar el resultado como una propiedad de Maven. Un archivo adjunto en http://jira.codehaus.org/browse/MCOMPILER-97 ofrece un ejemplo completo. –

6

Así es como funciona:

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

Después de que se ejecuta puede utilizar ${maven.classpath} propiedad.

+0

Me gusta mucho esta solución, pero como no hay un conector antrun m2e, no puedo usarlo. – Ring

+0

Esto no parece funcionar en la declaración de padres pom para ser utilizado por poms de niños .... – momomo

5

Desde la versión 2.7, maven-dependency-plugin ahora puede establecer una propiedad para el classpath. He aquí un ejemplo:

<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 desea soporte Eclipse aquí está mi sitio de actualización:

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

0

Si necesita generar la ruta de clases como una simple lista de los tarros (sin la ruta completa), puede implementar un complemento como el del ejemplo a continuación. Mi necesidad es agregar el classpath en el Manifiesto usando una propiedad que no sea "Class-Path" porque estoy usando una herramienta como Eclipse "JarRsrcLoader" (es similar al One-JAR) y quiero crear un Manifest.MF como este:

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

Por lo tanto, he definido un plugin Maven como esto:

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

    } 

el uso de este plugin, puede definir una propiedad que contiene la lista de los frascos de la ruta de clase:

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

y utilizar esta propiedad donde quiera que desee, por ejemplo para la creación de su Manifest.MF de encargo:

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