Eddie
Eddie

Reputation: 10138

Generate the maven artifact path

Maven install knows all the artifacts generated by a build, and will push them locally.

Installs the project's main artifact, and any other artifacts attached by other plugins in the lifecycle, to the local repository.

the help plugin probably supports this, but not sure of right expression

# has all the pieces (artifact, version, type) but is it fair to assume filename will always be that combo?
mvn help:evaluate -Dexpression=project.artifact

Is there any way to get that list of paths from a maven command?

I want to generate a list of specific artifacts to persist as artifact results in a build process, without publishing to a maven repo.

Upvotes: 2

Views: 3890

Answers (1)

t0mppa
t0mppa

Reputation: 4078

Artifact paths in Maven repository will follow the following formula by default:

  • groupId is broken into folders using the full stops as delimiter, then artifactId and version form the last two folders
  • filename of the artifact consists of artifactId and version, type is defined by packaging

So, let's say you have a multi-module project with main pom.xml:

<groupId>com.foobar.my.business</group>
<artifactId>myApp</artifactId>
<version>1.0-SNAPSHOT</version>

And it has two submodules, first is web module that creates a REST endpoint:

<parent>
  <groupId>com.foobar.my.business</group>
  <artifactId>myApp</artifactId>
  <version>1.0-SNAPSHOT</version>
</parent>

<artifactId>myApp-web</artifactId>
<packaging>war</packaging>

Second one is persistence layer:

<parent>
  <groupId>com.foobar.my.business</group>
  <artifactId>myApp</artifactId>
  <version>1.0-SNAPSHOT</version>
</parent>

<artifactId>myApp-persistence</artifactId>
<packaging>jar</packaging>

Let's say your local repository is found from ~/.m2/repository. Then your artifacts will be saved in local repository at:

  • ~/.m2/repository/com/foobar/my/business/myapp/1.0-SNAPSHOT/myapp-1.0-SNAPSHOT.pom
  • ~/.m2/repository/com/foobar/my/business/myapp-web/1.0-SNAPSHOT/myapp-web-1.0-SNAPSHOT.pom
  • ~/.m2/repository/com/foobar/my/business/myapp-web/1.0-SNAPSHOT/myapp-web-1.0-SNAPSHOT.war
  • ~/.m2/repository/com/foobar/my/business/myapp-persistence/1.0-SNAPSHOT/myapp-persistence-1.0-SNAPSHOT.pom
  • ~/.m2/repository/com/foobar/my/business/myapp-persistence/1.0-SNAPSHOT/myapp-persistence-1.0-SNAPSHOT.jar

An artifact's final build name and the local repository location can be tinkered with. But you can use the following expressions to check those:

  • ${settings.localRepository} will return path to local repository.
  • ${project.build.finalName} will return final build artifact name.

To get this list in almost the correct format, you can run:

  • On Windows mvn -q exec:exec -Dexec.executable="cmd" -Dexec.args="/C echo ${settings.localRepository}\${project.groupId}\${project.artifactId}\${project.version}\${project.build.finalName}.${project.packaging}"
  • On POSIX mvn -q exec:exec -Dexec.executable='echo' -Dexec.args='${settings.localRepository}/${project.groupId}/${project.artifactId}/${project.version}/${project.build.finalName}.${project.packaging}'

Then you just have to fix the full stops in groupId.

There is also a mvn dependency:build-classpath command which will show the location of each dependency on the file system that can come in handy sometimes.

Upvotes: 5

Related Questions