9

I want to do something like this in a chef recipe:

maven_artifact "/opt/foo/my.jar" do
  source "com.foo:my:0.1:jar"
end

But I can't find a cookbook which provides this. I've written something which basically does this but it doesn't handle snapshots, which requires parsing maven-metadata.xml. Before I plunge into this, I wanted to be sure I wasn't missing something obvious since this seems like a basic usecase.

recampbell
  • 245
  • 1
  • 3
  • 6

3 Answers3

4

Based on Apache Buildr code : http://svn.apache.org/repos/asf/buildr/trunk/lib/buildr/packaging/artifact.rb

You can do something like this:

def snapshot?
  version =~ /-SNAPSHOT$/
end

if snapshot?
    metadata_path = "#{group_path}/#{id}/#{version}/maven-metadata.xml"
    metadata_xml = StringIO.new
    URI.download repo_url + metadata_path, metadata_xml
    metadata = REXML::Document.new(metadata_xml.string).root
    timestamp = REXML::XPath.first(metadata, '//timestamp')
    build_number = REXML::XPath.first(metadata, '//buildNumber')
    snapshot_of = version[0, version.size - 9]
    classifier_snippet = (classifier != nil) ? "-#{classifier}" : ""
    repo_url + "#{group_path}/#{id}/#{version}/#{id}-#{snapshot_of}-#{timestamp.text}-#{build_number.text}#{classifier_snippet}.#{type}"
end
Skyhawk
  • 14,149
  • 3
  • 52
  • 95
4

RiotGames has something you might find useful.

HopelessN00b
  • 53,385
  • 32
  • 133
  • 208
John T Dyer
  • 81
  • 1
  • 3
3

If you use Artifactory as your Maven repository, a more elegant solution is at hand.

Starting from version 2.6.0 a request for a non-unique artifact can return the latest available snapshot.

To utilize this feature, first make sure that the target repository is defined with a unique snapshot policy, then request the desired artifact using a non-unique snapshot version such as:

org/artifact/1.0-SNAPSHOT/artifact-1.0-SNAPSHOT.jar

And the latest unique snapshot of artifact with a base revision of 1.0 will be returned.

noamt
  • 186
  • 1
  • 6