バージョン番号の書式

Maven2において、artifactのバージョン番号を扱うためのインタフェースはmaven-artifactモジュールに含まれているorg.apache.maven.artifact.versioning.ArtifactVersionインタフェースである。この実装としてはorg.apache.maven.artifact.versioning.DefaultArtifactVersionが使われる。このクラスを紐解くと、artifactのバージョン番号としてどのような書式が許されるのかが分かる。以下、バージョン番号の書式について解説する。

バージョン番号の書式は次のいずれかである:

  1. majorVersion [ "." minorVersion [ "." incrementalVersion [ "-" ( buildNumber | qualifier ) ] ] ] ]
  2. qualifier
  • majorVersion、minorVersion、incrementalVersion、buildNumberは、バージョン番号文字列から抽出できなかったものについては値が0であるとみなされる。qualifierは、バージョン番号文字列から抽出できなかった場合はnullとみなされる。
  • majorVersion、minorVersion、incrementalVersion、buildNumberは0または0で始まらない正の整数である。0以外では0で始まることは許されないため、例えば「01」などは許されない。
  • majorVersion(とminorVersionとincrementalVersion)の直後に「-」buildNumberとして解釈できる数値列が指定された場合はそれはbuildNumberとみなされる。buildNumberとして解釈できない数値列や文字列が指定された場合はそれはqualifierとみなされる。
  • 最初の書式に合致しないバージョン番号文字列は全体がqualifierとみなされる。

バージョン番号同士の比較は次のように行なわれる:

  1. majorVersionが異なるなら、majorVersionが大きいほうが新しい。
    • 例:2.0.0 > 1.5.0
  2. そうでない場合、minorVersionが異なるなら、minorVersionが大きい方が新しい。
    • 例:1.2.0 > 1.1.5
  3. そうでない場合、incrementalVersionが異なるなら、incrementalVersionが大きい方が新しい。
    • 例:1.2.5 > 1.2.0
  4. そうでない場合、qualifierがnullでないである(=qualifierを持っていない)方が新しい。
    • 例:1.2.0 > 1.2.0-RC1
  5. 両方ともqualifierを持っていないなら、buildNumberが大きい方が新しい。
    • 例:1.2.0-10 > 1.2.0-5
  6. 両方ともqualifierを持っているなら、
    1. qualifierが一致するなら、等しい。
      • 例:1.2.0-RC5 = 1.2.0-RC5
    2. 片方のqualifierがもう片方のqualifierと前方一致するなら、短い方が新しい。
      • 例:1.2.0-RC > 1.2.0-RC5
    3. そうでないなら、qualifier同士を文字列比較した時の順序が大きい方が新しい。
      • 例:1.2.0-SNAPSHOT > 1.2.0-RC1

ところで、上記のことから1.2.0-RC10 < 1.2.0-RC1であることが分かる(6-2)。また1.2.0-RC10 < 1.2.0-RC2であることが分かる(6-3)。従って、RCは1から9までにしておいた方が無難である。