pom.xml から classpath を生成するやつ(cache 機能つき)
pom.xml で指定した依存関係を読み込んだ状態で、いい感じに起動させたい、みたいなことがよくある。しかし、都度 maven から起動するのもめんどくさいし、mvn exec:java
はさまるのもだるい。groovy を起動するときにも、-cp を細かく指定するのはだるい。
というわけで、そういうのを解決するソリューションとして mvngencp と mvnsavecp という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