CLOVER🍀

That was when it all began.

sbtでpom.xmlを作る

ちょっと気になったことがあって、調べてみたのでメモ。

sbtでMavenのpom.xmlを生成するには、

> makePom

というコマンドを実行すればよいそうです。

Publishing(Version 0.13.5)
http://www.scala-sbt.org/0.13.5/docs/Detailed-Topics/Publishing.html

pomを作成してみる

例えば、こんなbuild.sbtを用意。

name := "sbt-maven-pom"

version := "0.0.1-SNAPSHOT"

scalaVersion := "2.11.2"

organization := "org.littlewings"

scalacOptions ++= Seq("-Xlint", "-deprecation", "-unchecked", "-feature")

incOptions := incOptions.value.withNameHashing(true)

resolvers += Resolver.sonatypeRepo("public")

val log4j2Version = "2.0.1"

libraryDependencies ++= Seq(
  "net.databinder.dispatch" %% "dispatch-jsoup" % "0.11.2",
  "com.jsuereth" %% "scala-arm" % "1.4",
  "com.github.scopt" %% "scopt" % "3.2.0",
  "org.apache.logging.log4j" % "log4j-api" % log4j2Version,
  "org.apache.logging.log4j" % "log4j-core" % log4j2Version,
  "org.apache.logging.log4j" % "log4j-slf4j-impl" % log4j2Version,
  "org.scalatest" %% "scalatest" % "2.2.1" % "test"
)

*依存関係の定義は、適当に自分の作っているものから持ってきました…

これを置いたプロジェクトでsbtを起動して、以下のコマンドを実行すると

> makePom

下記のようにtarget配下にpomが出力されます。

[info] Wrote /xxxxx/sbt-maven-pom/target/scala-2.11/sbt-maven-pom_2.11-0.0.1-SNAPSHOT.pom
[success] Total time: 0 s, completed 2014/08/17 19:07:40

できあがったpomは、こんな感じ。
target/scala-2.11/sbt-maven-pom_2.11-0.0.1-SNAPSHOT.pom

<?xml version='1.0' encoding='UTF-8'?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.littlewings</groupId>
    <artifactId>sbt-maven-pom_2.11</artifactId>
    <packaging>jar</packaging>
    <description>sbt-maven-pom</description>
    <version>0.0.1-SNAPSHOT</version>
    <name>sbt-maven-pom</name>
    <organization>
        <name>org.littlewings</name>
    </organization>
    <dependencies>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>2.11.2</version>
        </dependency>
        <dependency>
            <groupId>net.databinder.dispatch</groupId>
            <artifactId>dispatch-jsoup_2.11</artifactId>
            <version>0.11.2</version>
        </dependency>
        <dependency>
            <groupId>com.jsuereth</groupId>
            <artifactId>scala-arm_2.11</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>com.github.scopt</groupId>
            <artifactId>scopt_2.11</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.scalatest</groupId>
            <artifactId>scalatest_2.11</artifactId>
            <version>2.2.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <repositories>
        <repository>
            <id>sonatypepublic</id>
            <name>sonatype-public</name>
            <url>https://oss.sonatype.org/content/repositories/public/</url>
            <layout>default</layout>
        </repository>
    </repositories>
</project>

プロジェクトのルートディレクトリに「pom.xml」という名前でファイルを作成する

この場合は、build.sbtに以下のような設定を加えます。

makePomConfiguration := makePomConfiguration.value.copy(file = new File("pom.xml"))

reload後、makePomで出力されるpomの位置が変わります。

> makePom
[info] Wrote /xxxxx/sbt-maven-pom/pom.xml
[success] Total time: 0 s, completed 2014/08/17 19:10:39

publishで書かれている内容なので、自分で生成したpom.xmlを利用する場合以外で変にいじるのは良くないと思いますが。

その他

ちなみに、こういう設定を加えたら、少し頑張ってくれるのかなと思ったのですが、出力されるpom.xmlには特に何も反映されませんでした。

javacOptions ++= Seq("-source", "1.8", "-target", "1.8")

まあ、個人的には依存関係を出力してくれるだけで十分なので、特に困らないと思いますが。