← all posts · java

Getting the latest snapshot from Sonatype Nexus

A Ruby script to parse the Nexus REST API and reliably fetch the latest snapshot artifact, sidestepping the timestamped filename problem.

15 Jan 2013 · 7 min read · Stephen Masters javadevops

Sonatype Nexus is a repository for build artifacts, which is particularly handy if you have a Maven project. Once you have your Maven project configured, every time you run mvn deploy Maven will do a bit of building and then upload the resulting artifacts (.jar, .war, …) to the repository. If you browse Nexus you will then be able to find those artifacts with a unique name and download them.

This is all great, but if your project is running on a snapshot version, then every time you deploy to Nexus, the artifact file name will be appended with date and an ever-incrementing number. For my purposes, I wanted to be able to go on to a Linux test server where I have Apache Tomcat installed and grab the latest .war file. Maybe I need to relax more, but I was getting a bit irritated with having to manually find the snapshot in Nexus, copy the link and then fire off a curl -O -L http://… command every time I updated the project.

Fortunately it turns out that Nexus provides a REST API for searching. Unfortunately, it only returns the name of an artifact without the time-stamp. I think that this is intended to be a ‘good thing’ with Nexus automatically resolving the latest snapshot based on requesting the snapshot with no time-stamp. Unfortunately, requesting that artifact from the location indicated by the API results in a ‘not found’ response.

Therefore I knocked up a little Ruby script, which will go to the URI at which a full artifact list can be found, which includes resources such as poms, jars, sha1 and md5 hashes. It then parses the response XML to narrow down the results and selects the most recent artifact that matches the search criteria. Finally it will download the artifact.

The latest version of the script can be found as a gist on GitHub:

get_latest_snapshot.rb
gist · stephen-masters/1852106 rb
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
#---------------------------------------------------------------------
#
#  Parse the response from Sonatype Nexus in order to determine the
#  correct URI for the most recent snapshot of an artifact.
#
#  Usage:
#      ruby get_latest_snapshot.rb \
#        -n http://localhost:8080/nexus \
#        -g uk.co.scattercode \
#        -a  my-artifact \
#        -v 1.0.0 \
#        -c jar-with-dependencies \
#        -p jar
#
#  Raison d'etre: Sonatype Nexus provides an API for searching for artifacts.
#  Maven snapshot builds are generated with a time-stamp on them. The API
#  returns the name of the artifact without the time-stamp. I think that this
#  is intended to be a 'good thing' with Nexus automatically resolving the
#  latest snapshot based on requesting the snapshot with no time-stamp.
#  Unfortunately, requesting that artifact from the location indicated by the
#  API results in a 'not found' response. Therefore this script is intended
#  to go to the URI at which the full artifact list can be found, which
#  includes resources such as poms, jars, sha1 and md5 hashes. It narrows
#  down the results and selects the most recent artifact that matches the
#  search criteria.
#
#  Find the latest version of this script here:
#    https://gist.github.com/1852106
#
#---------------------------------------------------------------------

require 'getoptlong'
require 'net/http'
require 'rexml/document'
require 'open-uri'

#
# Let folks know what args they could use.
#
def show_help
  puts <<-EOF
Usage:
  ruby get_latest_snapshot.rb [OPTION] ...

  -h, --help:
     show help

  --file [file], -f [file]:
     File to get API response from instead of URL.

  --nexus [host], -n [host]:
     The base URL of the Nexus server.

  --artifact, -a:
    The name of the artifact.

  --version, -v:
    The version of the artifact (1.0.0, 1.0.0-SNAPSHOT, ...).

  --classifier, -c:
    The classifier, which gets appended to the name. As defined by 'descriptorRef' in Maven assembly plugin.

  --package, -p:
    The package type (jar, war, ear, ...).
   EOF
end


#
# Download the artifact.
#
def download(uri, filename)
  puts "Downloading \n  from uri: #{uri} \n  to file: #{filename}"

  open(filename, 'wb') do |fo|
    fo.print open(uri).read
  end

  puts "I think I just downloaded: #{filename}"
end


#
# Determine the appropriate filename.
#
def filename(artifact, version, classifier, package)

  if /-SNAPSHOT/.match(version)
    vnum = /.+(?=-SNAPSHOT)/.match(version).to_s
  else
    vnum = version
  end

  if classifier == nil
    filename = "#{artifact}-#{vnum}.#{package}"
  else
    filename = "#{artifact}-#{vnum}-#{classifier}.#{package}"
  end
  return filename
end


opts = GetoptLong.new(
  ['--help', '-h', GetoptLong::NO_ARGUMENT],
  ['--file', '-f', GetoptLong::OPTIONAL_ARGUMENT],
  ['--nexus', '-n', GetoptLong::OPTIONAL_ARGUMENT],
  ['--group', '-g', GetoptLong::REQUIRED_ARGUMENT],
  ['--artifact', '-a', GetoptLong::REQUIRED_ARGUMENT],
  ['--version', '-v', GetoptLong::REQUIRED_ARGUMENT],
  ['--classifier', '-c', GetoptLong::OPTIONAL_ARGUMENT],
  ['--package', '-p', GetoptLong::REQUIRED_ARGUMENT]
)

file = nil
nexus = nil
group = nil
artifact = nil
version = nil
classifier = nil
package = nil


opts.each do |opt, arg|
  case opt

    when '--help'
      show_help
    when '--file'
      file = arg
    when '--nexus'
      nexus = arg
    when '--group'
      group = arg
    when '--artifact'
      artifact = arg
    when '--version'
      version = arg
    when '--classifier'
      classifier = arg
    when '--package'
      package = arg

  end
end

puts <<-EOF
  Args as follows:
    file = #{file}
    nexus = #{nexus}
    group = #{group}
    artifact = #{artifact}
    version = #{version}
    classifier = #{classifier}
    package = #{package}
EOF

#
# Now we get to the meat of the script.
#
# I'm going to ignore the search API and just query the 'directory'
# in which Nexus should be holding the artifacts.

if file != nil

  # We have been given a file with the directory contents XML.
  # Most likely for test purposes...
  puts "Getting directory XML from file: #{file}"
  xml = File.open(file)

else

  url="#{nexus}/service/local/repositories/snapshots/content/#{group}/#{artifact}/#{version}/"
  puts "Gettting directory XML from URL: #{url}"
  xml = Net::HTTP.get_response( URI.parse( url ) ).body

end

doc = REXML::Document.new(xml)


most_recent_uri = nil
most_recent_snapshot_id = nil

doc.elements.each("//resourceURI") {|r|

  uri = r.text

  # puts "Looking at uri: #{uri}"

  # Filter out hashes and irrelevant artifacts.
  if classifier == nil
    match = /\d+.#{package}$/
  else
    match = /#{classifier}.#{package}$/
  end

  if uri =~ match
    if classifier == nil
      seq = /(?<=-)\d+(?=.#{package}$)/.match(uri).to_s.to_i
    else
      seq = /(?<=-)\d+(?=-#{classifier}.#{package}$)/.match(uri).to_s.to_i
    end
    puts "Found matching uri with sequence ID: #{seq}"

    if most_recent_uri == nil || seq > most_recent_snapshot_id
      most_recent_uri = uri
      most_recent_snapshot_id = seq
    end

  end
}

if most_recent_uri == nil
  puts "Unable to find an artifact matching those criteria."
else
  puts "The most recent snapshot of that artifact is here: \n    #{most_recent_uri}"
end

download(most_recent_uri, filename(artifact, version, classifier, package))
nexus_response.xml
gist · stephen-masters/1852106 xml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
<!-- The response from Nexus will look something like this. -->
<content>
<data>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1.pom.md5
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1.pom.md5
</relativePath>
<text>
myartifact-1.0.0-20120216.162545-1.pom.md5
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:25:45.0 GMT</lastModified>
<sizeOnDisk>32</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2.jar.md5
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2.jar.md5
</relativePath>
<text>
myartifact-1.0.0-20120216.163318-2.jar.md5
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:33:18.0 GMT</lastModified>
<sizeOnDisk>32</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2.pom.md5
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2.pom.md5
</relativePath>
<text>
myartifact-1.0.0-20120216.163318-2.pom.md5
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:33:18.0 GMT</lastModified>
<sizeOnDisk>32</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1.pom
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1.pom
</relativePath>
<text>
myartifact-1.0.0-20120216.162545-1.pom
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:25:45.0 GMT</lastModified>
<sizeOnDisk>3872</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2-jar-with-dependencies.jar
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2-jar-with-dependencies.jar
</relativePath>
<text>
myartifact-1.0.0-20120216.163318-2-jar-with-dependencies.jar
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:33:20.0 GMT</lastModified>
<sizeOnDisk>26403601</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2-jar-with-dependencies.jar.sha1
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2-jar-with-dependencies.jar.sha1
</relativePath>
<text>
myartifact-1.0.0-20120216.163318-2-jar-with-dependencies.jar.sha1
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:33:23.0 GMT</lastModified>
<sizeOnDisk>40</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/maven-metadata.xml.md5
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/maven-metadata.xml.md5
</relativePath>
<text>maven-metadata.xml.md5</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:53:46.0 GMT</lastModified>
<sizeOnDisk>32</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1.jar
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1.jar
</relativePath>
<text>
myartifact-1.0.0-20120216.162545-1.jar
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:25:45.0 GMT</lastModified>
<sizeOnDisk>15900</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/maven-metadata.xml
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/maven-metadata.xml
</relativePath>
<text>maven-metadata.xml</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:53:46.0 GMT</lastModified>
<sizeOnDisk>1216</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/maven-metadata.xml.sha1
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/maven-metadata.xml.sha1
</relativePath>
<text>maven-metadata.xml.sha1</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:53:46.0 GMT</lastModified>
<sizeOnDisk>40</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2.pom.sha1
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2.pom.sha1
</relativePath>
<text>
myartifact-1.0.0-20120216.163318-2.pom.sha1
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:33:18.0 GMT</lastModified>
<sizeOnDisk>40</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2-jar-with-dependencies.jar.md5
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2-jar-with-dependencies.jar.md5
</relativePath>
<text>
myartifact-1.0.0-20120216.163318-2-jar-with-dependencies.jar.md5
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:33:23.0 GMT</lastModified>
<sizeOnDisk>32</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2-tests.jar.sha1
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2-tests.jar.sha1
</relativePath>
<text>
myartifact-1.0.0-20120216.163318-2-tests.jar.sha1
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:33:19.0 GMT</lastModified>
<sizeOnDisk>40</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2.jar.sha1
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2.jar.sha1
</relativePath>
<text>
myartifact-1.0.0-20120216.163318-2.jar.sha1
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:33:18.0 GMT</lastModified>
<sizeOnDisk>40</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2.pom
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2.pom
</relativePath>
<text>
myartifact-1.0.0-20120216.163318-2.pom
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:33:18.0 GMT</lastModified>
<sizeOnDisk>3872</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1-jar-with-dependencies.jar.sha1
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1-jar-with-dependencies.jar.sha1
</relativePath>
<text>
myartifact-1.0.0-20120216.162545-1-jar-with-dependencies.jar.sha1
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:25:48.0 GMT</lastModified>
<sizeOnDisk>40</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1-tests.jar
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1-tests.jar
</relativePath>
<text>
myartifact-1.0.0-20120216.162545-1-tests.jar
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:25:45.0 GMT</lastModified>
<sizeOnDisk>3588</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1.jar.md5
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1.jar.md5
</relativePath>
<text>
myartifact-1.0.0-20120216.162545-1.jar.md5
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:25:45.0 GMT</lastModified>
<sizeOnDisk>32</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1-tests.jar.md5
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1-tests.jar.md5
</relativePath>
<text>
myartifact-1.0.0-20120216.162545-1-tests.jar.md5
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:25:45.0 GMT</lastModified>
<sizeOnDisk>32</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1-jar-with-dependencies.jar.md5
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1-jar-with-dependencies.jar.md5
</relativePath>
<text>
myartifact-1.0.0-20120216.162545-1-jar-with-dependencies.jar.md5
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:25:49.0 GMT</lastModified>
<sizeOnDisk>32</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2-tests.jar
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2-tests.jar
</relativePath>
<text>
myartifact-1.0.0-20120216.163318-2-tests.jar
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:33:19.0 GMT</lastModified>
<sizeOnDisk>3588</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1-jar-with-dependencies.jar
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1-jar-with-dependencies.jar
</relativePath>
<text>
myartifact-1.0.0-20120216.162545-1-jar-with-dependencies.jar
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:25:46.0 GMT</lastModified>
<sizeOnDisk>26403555</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2.jar
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2.jar
</relativePath>
<text>
myartifact-1.0.0-20120216.163318-2.jar
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:33:18.0 GMT</lastModified>
<sizeOnDisk>15946</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1.jar.sha1
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1.jar.sha1
</relativePath>
<text>
myartifact-1.0.0-20120216.162545-1.jar.sha1
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:25:45.0 GMT</lastModified>
<sizeOnDisk>40</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1.pom.sha1
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1.pom.sha1
</relativePath>
<text>
myartifact-1.0.0-20120216.162545-1.pom.sha1
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:25:45.0 GMT</lastModified>
<sizeOnDisk>40</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2-tests.jar.md5
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.163318-2-tests.jar.md5
</relativePath>
<text>
myartifact-1.0.0-20120216.163318-2-tests.jar.md5
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:33:19.0 GMT</lastModified>
<sizeOnDisk>32</sizeOnDisk>
</content-item>
<content-item>
<resourceURI>
http://127.0.0.1:8080/nexus/service/local/repositories/snapshots/content/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1-tests.jar.sha1
</resourceURI>
<relativePath>
/uk/co/scattercode/myartifact/1.0.0-SNAPSHOT/myartifact-1.0.0-20120216.162545-1-tests.jar.sha1
</relativePath>
<text>
myartifact-1.0.0-20120216.162545-1-tests.jar.sha1
</text>
<leaf>true</leaf>
<lastModified>2012-02-16 16:25:45.0 GMT</lastModified>
<sizeOnDisk>40</sizeOnDisk>
</content-item>
</data>
</content>

SM
Stephen Masters

Software developer and architect. I build systems for places that move energy, commodities, and money around. I keep a bike-packing journal at velostevie.com.