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 가 짠 코드입니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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의 코드를 아래처럼 만들어 줍니다.

1
2
3
4
5
6
7
8
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"같인 라이브러리가 사용처(?)를 지정해주는 부분이나 호환성을 위해서 %대신 %%를 추가하는 등의 작업은 따로 해주어야 합니다.

Valid HTML5 Valid CSS WCAG 2.1 AA tested