views:

5567

answers:

5

Using Maven 2, is there a way I can list out the jar dependencies as just the file names?

mvn dependency:build-classpath

can list the jar files, but that will include the full path to their location in my local repository. What I need is essentially just a list of the file names (or the file names that the copy-dependencies goal copied).

So the list I need would be something like

activation-1.1.jar,antlr-2.7.6.jar,aopalliance-1.0.jar etc...

ideally as a maven property, but I guess, a file such as build-classpath can generate will do.

What I am trying to achieve is writing a Bundle-ClassPath to an otherwise manually maintained MANIFEST.MF file for a OSGi bundle. (You shouldn't need to understand this bit to answer the question.)

To clarify: The question is not about how to write manifest headers into the MANIFEST.MF file in a jar (that is easily googleble). I am asking about how to get the data I want to write, namely the list shown above.

+1  A: 

Maven can build the classpath in your manifest automatically: http://maven.apache.org/guides/mini/guide-manifest.html

It's a configuration of the Maven archive plugin.

Davide Gualano
+3  A: 

Have you looked at the Apache Felix project? It has a whole mess of plugins, including a bundle plugin that should do what you want.

Also, have you tried the <addClasspath> tag with <manifestFile>? That should have the desired effect of merging the classpath into your manifest.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  ...
  <configuration>
    <archive>
      <addClasspath>true</addClasspath>
      <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
    </archive>
  </configuration>
  ...
</plugin>
sblundy
I'm aware of Apache Felix, but that's not doing what I need, which is the reason I'm doing this manually.
Sindri Traustason
addClasspath will add a list of jar's to the Class-Path manifest header, I don't see maven-jar-plugin docs mention being able to put the class path into other headers. Also the Bundle-Classpath needs more than just a list of jars.
Sindri Traustason
+2  A: 

As best as I can tell, you can't get exactly that output, with the commas and no spaces. Both via the command line and via the pom.xml file, the maven-dependency-plugin or the CLI freaks out if you specify spaces or the '' (empty string) as a substitute with either pathSeparator or fileSeparator. So, you may be forced to reach something of a compromise. You can

    mvn dependency:build-classpath -Dmdep.pathSeparator=":" -Dmdep.prefix='' -Dmdep.fileSeparator=":" -Dmdep.outputFile=classpath

However, that should get you a full list, separated by '::' instead of just ',', but it works. If you run:

    mvn dependency:build-classpath -Dmdep.pathSeparator="@REPLACEWITHCOMMA" -Dmdep.prefix='' -Dmdep.fileSeparator="@" -Dmdep.outputFile=classpath

and attach this to the generate-resources phase and filter that resource later by setting the correct property in the process-resources phase of the lifecycle, you should be able to get just the comma.

You can see the full list of options at: http://maven.apache.org/plugins/maven-dependency-plugin/build-classpath-mojo.html

Gabe Mc
+1  A: 

I may be missing something here, but as you've already used copy-dependencies it sounds like what you're really after is just a list of files in a specified directory.

Ant can do this for you without any problems, as can a shell script.

Kevin Wright
A: 

This command will generate the dependencies tree of your maven project:

$ mvn dependency:tree

I am sure that you will like the result :-)

Anis