89
votes

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.

9
just submit a patch for the dependency plugin and i'll apply it to the next release. The build classpath is the closest thing to what you want, we just need to tweak the options to get the desired output.Brian Fox
Great. looks for the same!!!anand krish

9 Answers

108
votes

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

$ mvn dependency:tree

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

20
votes

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

18
votes

Here's the command you're asking for

$ mvn dependency:tree

For large projects it can output a lot of text. I assume that you want to check that dependency tree contains a certain dependency, so you don't need a full list.

Here's how you can filter output on Windows:

$ mvn dependency:tree | findstr javax.persistence

And here's how you can do it on Linux:

$ mvn dependency:tree | grep javax.persistence

Maven way to filter the dependency tree (works in Windows cmd, MacOS and Linux shell):

$ mvn dependency:tree -Dincludes=javax.persistence:*

Maven way (Windows PowerShell):

$ mvn dependency:tree '-Dincludes=javax.persistence:*'
18
votes

Actually, for just the final list of jars, simply use

mvn dependency:list

Which is lot more simple than dependency:tree which is an overkill to simply get the final list as it shows detailed transitive tree and conflict resolution (with verbose).

Here's the doc for additional parameters

4
votes

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

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.

2
votes

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.

1
votes

To add a notch to the existing answers, the current maven-dependency-plugin allows saving the classpath to a property with the outputProperty parameter.

1
votes

Here is an awk script to pipe mvn dependency:list:

mvn dependency:list | awk -f mvnfmt.awk

You can | sort if you want to sort by name, or | tr '\n' ':' to format it to a classpath.

mvnfmt.awk is:

BEGIN {
    found = 0
}

/The following files have been resolved/ {
    found = 1
    next
}

/^\[INFO\] \$/ {
    print "Empty " found
    if (found != 0) found = 0
}

{
    if (!found) next
    n = split($0, a, " ")
    if (n != 2) {
        found = 0
        next
    }
    split(a[2], a, ":")
    print a[2] "-" a[4] "." a[3]
}