step1 - init
step2 - fatjar
step3 - tomcat
step4 - multi-project
step5 - docker
step6 - custom plugin
name := " chiken"
version := " 1.0"
scalaVersion := " 2.11.8"
package chiken
object Chiken extends App {
println(" 知見です" )
}
app/
├ src/main/scala/chiken/Chiken.scala
└ build.sbt
$ sbt run
知見です
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.3")
app/
├ project/plugins.sbt
├ src/main/scala/chiken/Chiken.scala
└ build.sbt
$ sbt assembly
$ java -jar ./target/scala-2.11/chiken-assembly-1.0.jar
知見です
addSbtPlugin(" com.earldouglas" % " xsbt-web-plugin" % " 2.1.0" )
name := " chiken"
version := " 1.0"
scalaVersion := " 2.11.8"
libraryDependencies += " javax.servlet" % " javax.servlet-api" % " 3.0.1" % " provided"
enablePlugins(TomcatPlugin )
package chiken
import javax .servlet .http .{HttpServlet , HttpServletRequest , HttpServletResponse }
class ChikenServlet extends HttpServlet {
override def doGet (request : HttpServletRequest , response : HttpServletResponse ) = {
val s = response.getOutputStream
s.print(" CHIKEN DESU" )
s.flush()
}
}
<?xml version =" 1.0" encoding =" UTF-8" ?>
<web-app xmlns =" http://java.sun.com/xml/ns/javaee"
xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
xsi : schemaLocation =" http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id =" serv" version =" 3.0" >
<servlet >
<servlet-name >ChikenServlet</servlet-name >
<servlet-class >chiken.ChikenServlet</servlet-class >
</servlet >
<servlet-mapping >
<servlet-name >ChikenServlet</servlet-name >
<url-pattern >/*</url-pattern >
</servlet-mapping >
</web-app >
app/
├ project/plugins.sbt
├ src/main/
│ ├ scala/chiken/ChikenServlet.scala
│ └ webapp/WEB-INF/web.xml
└ build.sbt
$ sbt ~tomcat:start
1. Waiting for source changes... (press enter to interrupt)
Adding Context for /Users/a14344/dev/sbt-chiken/target/webapp
12 15, 2016 9:52:45 午後 org.apache.coyote.AbstractProtocol init
情報: Initializing ProtocolHandler ["http-nio-8080"]
12 15, 2016 9:52:46 午後 org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
情報: Using a shared selector for servlet write/read
12 15, 2016 9:52:46 午後 org.apache.catalina.core.StandardService startInternal
情報: Starting service Tomcat
12 15, 2016 9:52:46 午後 org.apache.catalina.core.StandardEngine startInternal
情報: Starting Servlet Engine: Apache Tomcat/7.0.34
12 15, 2016 9:52:46 午後 org.apache.catalina.startup.ContextConfig getDefaultWebXmlFragment
情報: No global web.xml found
12 15, 2016 9:52:48 午後 org.apache.coyote.AbstractProtocol start
情報: Starting ProtocolHandler ["http-nio-8080"]
$ sbt package
$ ls ./target/scala-2.11/
chiken_2.11-1.0.jar
chiken_2.11-1.0.war
classes
app/
├ batch/
│ └ src/main/scala/batch/ChikenBatch.scala
├ lib/
│ └ src/main/scala/lib/Chilen.scala
├ project/plugins.sbt
└ build.sbt
package batch
import lib ._
object ChikenBatch extends App {
println(Chiken .get)
}
package lib
object Chiken {
def get = " 知見"
}
lazy val root = (project in file(" ." ))
.aggregate(batch, lib)
lazy val batch = (project in file(" batch" ))
.dependsOn(lib)
lazy val lib = (project in file(" lib" ))
$ sbt batch/run
知見
addSbtPlugin(" com.typesafe.sbt" % " sbt-native-packager" % " 1.1.1" )
lazy val root = (project in file(" ." ))
.aggregate(batch, lib)
lazy val batch = (project in file(" batch" ))
.dependsOn(lib)
.enablePlugins(AshScriptPlugin , DockerPlugin )
.settings(
dockerRepository := Some (" smalgo-docker.cyberagent.io" ),
dockerBaseImage := " java:8-jdk-alpine"
)
lazy val lib = (project in file(" lib" ))
$ sbt batch/docker:publishLocal # ローカルにdocker imageを作成
$ docker run smalgo-docker.cyberagent.io/chiken:1.0
知見
$ sbt batch/docker:publish # dockerリポジトリにpush
docker上で動くbatchの設定が 一発できるpluginをつくります
import com .typesafe .sbt .packager .archetypes ._
import com .typesafe .sbt .packager .docker ._
import com .typesafe .sbt .packager .docker .DockerPlugin .autoImport ._
import sbt ._
object BatchPlugin extends AutoPlugin {
// build.sbtのenablePluginsと同じ
override def requires = AshScriptPlugin && DockerPlugin
// build.sbtのsettingsと同じ
override val projectSettings = Seq (
dockerRepository := Some (" smalgo-docker.cyberagent.io" ),
dockerBaseImage := " java:8-jdk-alpine"
)
}
lazy val root = (project in file(" ." ))
.aggregate(batch, lib)
lazy val batch = (project in file(" batch" ))
.dependsOn(lib)
.enablePlugins(BatchPlugin ) // NEW!
lazy val lib = (project in file(" lib" ))
app/
├ batch/
│ └ src/main/scala/batch/ChikenBatch.scala
├ lib/
│ └ src/main/scala/lib/Chilen.scala
├ project/
│ │ BatchPlugin.scala
│ └ plugins.sbt
└ build.sbt
ほぼブラックボックになっていた
ひとつひとつ検証していくしかなかった
groovyで書かれていた
sbtでgroovyを動かすのは面倒
groovyをscalaにすべて書き直した (ダーシャに感謝)
リリース
bidパラメーター変更
LB 登録/登録解除