tokuhirom's Blog

pom.xml から classpath を生成するやつ(cache 機能つき)

pom.xml で指定した依存関係を読み込んだ状態で、いい感じに起動させたい、みたいなことがよくある。しかし、都度 maven から起動するのもめんどくさいし、mvn exec:java はさまるのもだるい。groovy を起動するときにも、-cp を細かく指定するのはだるい。

というわけで、そういうのを解決するソリューションとして mvngencpmvnsavecp という2つのコマンドが知られている。

が、どうも mvngencp と mvnsavecp が手元の環境でうまく動かなくて、治すのもめんどくさかったので ruby でゴリゴリっと書いてやった。

http://github.com/tokuhirom/mvnclasspath/blob/master/mvnclasspath


#!/usr/bin/env ruby

require 'uri'
require 'fileutils'

class MvnClassPath
  def initialize
    cacheKey = URI.escape(File.absolute_path(Dir.pwd))
    @cachepath = "#{Dir.home}/.mvnclasspath/#{cacheKey}"
  end

  def getClassPath
    if File.exists?('pom.xml')
    # generate cache file path.
      if File.exists?(@cachepath)
        if File.mtime(@cachepath) >= File.mtime('pom.xml')
          # cache hit.
          return IO.read(@cachepath)
        else
          return generateByMaven()
        end
      else
        return generateByMaven()
      end
    else
      return '.'
    end
  end

  def generateByMaven()
    cp = `mvn dependency:build-classpath -DincludeScope=test | grep -A 1 'Dependencies classpath:'`.split(/\n/)[-1]
    FileUtils.mkdir_p(File.dirname(@cachepath))
    File.write(@cachepath, cp)
    return cp
  end
end

puts MvnClassPath.new.getClassPath()

これをパスの通ったイチにおいておけば、以下のようにして、簡単にクラスパスつきでプログラムを実行できる。

groovy -cp `mvnclasspath` hoge.groovy