Search code examples
maven-2

Can I use the path to a Maven dependency as a property?


I have a maven dependency in my pom.xml as such:

<dependency>
    <groupId>com.foo</groupId>
    <artifactId>Bar</artifactId>
    <version>1.2.3</version>
</dependency>

And I would like to use the system path to the binary as a property (so I can pass it to an external process that is kicked off by maven). I can do this in an awkward way:

<properties>
    <my.lib>${settings.localRepository}/com/foo/Bar/1.2.3/Bar.jar</my.lib>
</properties>

But I would really like to use a more standard mechanism, such as:

<properties>
    <my.lib>${com.foo:Bar:1.2.3}</my.lib>
</properties>

I something like that possible?


Solution

  • Assuming that the com.foo:Bar:jar:1.2.3 artifact is declared as dependency in your POM, the following property returns the path to the jar in the local repository:

    ${maven.dependency.com.foo.Bar.jar.path}
    

    Update: Here is a simple POM demonstrating this:

    <?xml version="1.0" encoding="UTF-8"?>
    <project>
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.stackoverflow</groupId>
      <artifactId>q2359872</artifactId>
      <version>1.0-SNAPSHOT</version>
      <name>q2359872</name>
      <properties>
        <my.lib>${maven.dependency.junit.junit.jar.path}</my.lib>
      </properties>
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
              <execution>
                <phase>process-resources</phase>
                <configuration>
                  <tasks>
                    <echo>${my.lib}</echo>
                  </tasks>
                </configuration>
                <goals>
                  <goal>run</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </project>
    

    Running mvn process-resources produces the following output:

    $ mvn process-resources
    [INFO] Scanning for projects...
    [INFO] ------------------------------------------------------------------------
    [INFO] Building q2359872
    [INFO]    task-segment: [process-resources]
    [INFO] ------------------------------------------------------------------------
    [INFO] [resources:resources {execution: default-resources}]
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] skip non existing resourceDirectory /home/pascal/Projects/stackoverflow/q2359872/src/main/resources
    [INFO] [antrun:run {execution: default}]
    [INFO] Executing tasks
         [echo] /home/pascal/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar
    [INFO] Executed tasks
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESSFUL
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 7 seconds
    [INFO] Finished at: Tue Mar 02 14:41:32 CET 2010
    [INFO] Final Memory: 7M/68M
    [INFO] ------------------------------------------------------------------------