ant-ivy-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Kirby Files" <>
Subject RE: how to import artifacts
Date Fri, 19 Dec 2008 05:32:28 GMT
I cannot defeat our mail server's virus-scanning attachment-killer, so
here's the script inline:
# Looks for jars in the incoming directory, attemps to parse the
# needed ivy info from the filename, and if successful, publishes
# the jar to the Masergy ivrep repository.

# If using linux with package mgmt, dependencies are:
# perl-libwww-perl
# perl-XML-Xpath
# perl-Archive-Zip
use LWP::UserAgent;
use XML::XPath;
use XML::XPath::XMLParser;
use Archive::Zip;
use strict qw(vars);

use vars qw($indir $ant $rep $pre $post);

$indir = "lib";
$ant = "/usr/local/ant/bin/ant";
$rep = "newjars";
$pre="<ivy:install settingsRef=\"masergy.settings\" organisation=\"";
$post=" from=\"\${from.resolver}\" to=\"\${to.resolver}\" />";

open (DIR, "ls -1 $indir|") || die "could not open $indir\n";
while (<DIR>) {
  my ($org, $module, $jar, $ver);
  next unless /jar/;
  my $file = $indir . "/" . $_;
  $ver="unknown" unless $ver =~ /\d/;
  ## Figure out the org
  ## Ask the user, if there's ambiguity
  $org = &maven_search_org( $module );
  if (-1 == $org) {
    $org = &guess_org($module);
    print "Org guessed from module name:\n  $org\n";
    $org = &classes_org($file);
    print "Org guessed from jar package naming:\n  $org\n"
      unless (-1 == $org);
    do {
      $org = &get_user_org();
    } while ($org =~ /^$/);
  if ($ver eq "unknown" || ($module !~ /^\w+$/) || $org !~ /\w+/) {
    print "Skipping jar $jar:\n";
    print "  $org / $module / $ver\n";
  } else {
    &publish_jar($jar, $org, $module, $ver);
  #&write_ivy_conf($jar, $org, $module, $ver);

## Use ivy::install to publish the jar via sftp to ivyrep
sub publish_jar
  my ($jar, $org, $module, $ver) = @_;
  print "Uploading $org / $module / $jar ... ";
  my $resp = `$ant -Dorg=$org -Dmodule=$module -Drev=$ver
-Dinstall.path=./$indir 2>&1`;
  if ($resp =~ /failed/i) {
    print STDERR "Error uploading $jar:\n", $resp;
    print "\n";
  } else {
    print "Done.\n";

## Find a directory in the jar to propose as the org
## searches for any dirs with two path elements
sub classes_org
  my ($file) = @_;
  my $somezip = Archive::Zip->new();
  unless ( $somezip->read( $file ) == AZ_OK ) {
       die "Error reading jarfile $file";
  my @members = $somezip->members();
  my @dirnames = ();
  foreach (@members) {
    if ($_->isDirectory()) {
      my $fname = $_->fileName();
      if ($fname =~ /^\w+\/\w+\/$/) {
        $fname =~ s/^(\w+)\/(\w+)\/$/$1.$2/;
        return $fname;
  return -1;

## Ask the user for the best org name
sub get_user_org
  print "Enter preferred org:> ";
  my $line = <STDIN>;
  return $line;

## Make a guess about the org name from the module name
sub guess_org
  my ($module) = @_;
  my $org = $module;
  return $org;

## Search the maven repo for a module matching this jar
## If found, return the module's organization
## if none, or more than one, are found, ask the user
sub maven_search_org
  my ($module) = @_;

  my $ua = LWP::UserAgent->new;
  $ua->agent('Maven Repo Search');

  my $service=
  my $url=URI->new($service . $module);
  my $req=HTTP::Request->new;
  my $resp = $ua->request($req)->content;

  my $org = &parse_resp( $module, $resp );
  return $org;
## Parse the XML response from the Maven search service
sub parse_resp
  my ($module, $data) = @_;

  my $xp = XML::XPath->new(xml => $data);

  my $nodeset = $xp->find('//groupId'); # find all paragraphs

  # Get rid of duplicates
  my %uniq=();
  foreach my $node ($nodeset->get_nodelist) {
     $uniq{ $xp->getNodeText( $node ) } = 1;
  my @keys = (sort keys %uniq);

  if ($#keys == 0) {
    return ($keys[0]);
  } elsif ($#keys == -1) {
    print "Found no module matching $module in Maven repo\n";
    return -1;
  } else {
    print "Found multiple possible orgs for $module in Maven repo:\n";
    foreach (@keys) {
      print "  $_\n";
    return -1;
-----Original Message-----
From: Kirby Files [] 
Sent: Thursday, December 18, 2008 11:27 PM
Subject: RE: how to import artifacts

I use this script:


if ($1 == "") then
    echo "Usage: installjar <org> <module> <revision> <path-to-file>"
    /usr/local/ant/bin/ant -Dorg="$1" -Dmodule="$2" -Drev="$3"
-Dinstall.path="$4" $5 $6 $7 $8 $9

With the following build target:

  <target name="installjar"
          description="--> install jar to masrep">
    <ivy:install settingsRef="masergy.settings" organisation="${org}"
module="${module}" revision="${rev}" type="jar"
from="${localjar.resolver}" to="${to.resolver}" />

Where my defines these variables:


And my ivysettings.xml includes:
    <filesystem name="localjars">
      <artifact pattern="${install.path}/[artifact]-[revision].[ext]" />
      <artifact pattern="${install.path}/[artifact].[ext]" />

This script allows me to specify a jar on the local filesystem by its
name and the directory in which it resides (install.path), add the org,
and rev metadata, and publish it to one of my resolvers (I use SFTP with
a keyfile to push files up to our webserver; you may use a filesystem
resolver or webdav as a destination).

I also have a bigger hack of a perl script which attempts to read a
directory of jars and guess the org, modul, and rev (validating against
maven2), or prompt the user when it's unclear. See the attachment.

Kirby Files
Software Architect
Masergy Communications

-----Original Message-----
From: Jim Newsham []
Sent: Thu 12/18/2008 9:24 PM
Subject: how to import artifacts

I'd like to integrate ivy into our development process.  In order to do
I would need to import all the existing dependencies (typically jars)
our project currently uses, into a shared repository.  I couldn't find
anywhere in the documentation, so. what is the magical incantation to
add a
single artifact into the repository?  I would expect there to be a
command-line invocation where you pass a few parameters (org, module,
version, filename), and the file is added to the repository.


This seems to me a fundamental requirement to set up a repository, so
rather surprised that it's not documented in some obvious place, and
no tutorial that explains it.  I saw a tutorial that shows how to copy
artifacts from one repository to another, but that's worthless if what
have doesn't live in any repository yet.


Thanks in advance,





View raw message