# Maven rules - transform Maven dependencies and plugins
# Format of this file is:
# [group] [artifact] [type] [version] [classifier] [scope]
# where each element can be either
# - the exact string, for example org.apache for the group, or 3.1
#   for the version. In this case, the element is simply matched
#   and left as it is
# - * (the star character, alone). In this case, anything will
#   match and be left as it is. For example, using * on the
#  position of the artifact field will match any artifact id
# - a regular expression of the form s/match/replace/
#   in this case, elements that match are transformed using
#   the regex rule.
# All elements much match before a rule can be applied
# Example rule: match jar with groupid= junit, artifactid= junit
# and version starting with 3., replacing the version with 3.x
#   junit junit jar s/3\..*/3.x/

com.google.i18n.phonenumbers data-tools jar s/1\..*/1.x/ * *
com.google.i18n.phonenumbers libphonenumber-build-parent pom s/1\..*/1.x/ * *
com.google.i18n.phonenumbers tools pom s/1\..*/1.x/ * *
com.google.i18n.phonenumbers.tools common-build jar s/1\..*/1.x/ * *
com.google.i18n.phonenumbers.tools cpp-build jar s/1\..*/1.x/ * *
com.google.i18n.phonenumbers.tools java-build jar s/1\..*/1.x/ * *
com.googlecode.libphonenumber carrier jar s/1\..*/1.x/ * *
com.googlecode.libphonenumber geocoder jar s/2\..*/2.x/ * *
com.googlecode.libphonenumber libphonenumber-parent pom s/6\..*/6.x/ * *
com.googlecode.libphonenumber libphonenumber jar s/6\..*/6.x/ * *
com.googlecode.libphonenumber prefixmapper jar s/2\..*/2.x/ * *
junit junit jar s/4\..*/4.x/ * *
s/org.apache.tomcat/javax.servlet/ servlet-api jar s/.*/2.5/ * *
