Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Maven의 pom.xml을 SBT 코드로 변환하기

Scala 프로젝트에 대한 관리로 SBT를 사용하기로 결정했지만 아직 별로 안써봐서 그다지 아는 건 없는 가운데 SBT에서 라이브러리를 관리하려고 보니 SBT에 디펜던시 라이브러리를 적는 문법이 꽤나 좀 헷갈렸습니다. 찾다 보니 많이 쓰는 Maven의 pom.xml의 dependencies부분을 SBT의 코드로 변환해 주는 컨버터가 있었습니다. 당연히 제가 짠 건 아니고 Jason Zaugg가 짠 코드입니다.


object scala {
     val version = "SCALA_VERSION$"
}

val xml = <dependencies>
                 </dependencies>

val data: Seq[(String, String, String)] = (xml \ "dependency") map { d =>
    val groupId = d \ "groupId" text
    val artifactId = d \ "artifactId" text
    val versionNum = d \ "version" text

    (groupId, artifactId, versionNum)
}

val CrossBuildArtifact = """([\w-]+)_\$SCALA_VERSION\$""".r

def dep(a: String, g: String, v: String, cross: Boolean) = {
    val sep = if (cross) "%%" else "%"
    val ident = a.split("-").map(_.capitalize).mkString
    """val %s = "%s" %s "%s" %% "%s" """ format (ident, g, sep, a, v)
}

val m = data map { 
    case (g, CrossBuildArtifact(a), v) => dep(a, g, v, true)
    case (g, a, v) => dep(a, g, v, false)
} mkString("\n")
println(m)

(코드는 어렵군요 ㅡㅡ;;) 위 코드에서 xml부분에 pom.xml의 dependencies부분을 붙혀넣고 터미널에서 스칼라스크립트로 실행해 주면 output으로 SBT의 코드를 아래처럼 만들어 줍니다.


val LiftMapper = "net.liftweb" % "lift-mapper" % "2.2" 
val LogbackClassic = "ch.qos.logback" % "logback-classic" % "0.9.26" 
val H2 = "com.h2database" % "h2" % "1.2.138" 
val ServletApi = "javax.servlet" % "servlet-api" % "2.5" 
val Junit = "junit" % "junit" % "4.7" 
val Specs = "org.scala-tools.testing" % "specs" % "1.6.1" 
val Jetty = "org.mortbay.jetty" % "jetty" % "6.1.25" 
val ScalaCompiler = "org.scala-lang" % "scala-compiler" % "$SCALA_VERSION$" 

기본적으로 xml을 파싱해서 스트링으로 변환만 해준 것이기 때문에 SBT에 맞추어서 변환해 주어야 할 부분은 변환해 주어야 할 것 같습니다. 예를 들면 각 라이브러리 마지막에 "compile->default"나 "test"같인 라이브러리가 사용처(?)를 지정해주는 부분이나 호환성을 위해서 %대신 %%를 추가하는 등의 작업은 따로 해주어야 합니다.
2011/02/07 00:55 2011/02/07 00:55