Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Gradleからsbtへの移行
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Naohiro Hasegawa
December 27, 2016
Programming
1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Gradleからsbtへの移行
Naohiro Hasegawa
December 27, 2016
Other Decks in Programming
See All in Programming
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
740
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.2k
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
390
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
1
260
カツオ、ご期待ください
suneo3476
0
180
Are APIs Still Relevant in the AI Era?
soyuka
0
460
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
170
Verilogで学ぶCPU自作入門
uyuki234
8
4.1k
Event is what happens
moro
2
440
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
4.8k
Featured
See All Featured
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
410
Evolving SEO for Evolving Search Engines
ryanjones
0
320
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Site-Speed That Sticks
csswizardry
13
1.6k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
810
The Pragmatic Product Professional
lauravandoore
37
7.5k
How to make the Groovebox
asonas
2
2.5k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
410
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
4
4.4k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
Paper Plane (Part 1)
katiecoart
PRO
2
11k
Transcript
Gradle から sbt への移行 Smalgo 長谷川直広
移行するにあたって検証したことを 紹介していきます
目次 step1 - init step2 - fatjar step3 - tomcat
step4 - multi-project step5 - docker step6 - custom plugin
step1 - init
build.sbt name := "chiken" version := "1.0" scalaVersion := "2.11.8"
Chiken.scala package chiken object Chiken extends App { println(" 知見です")
}
ディレクトリ構成 app/ ├ src/main/scala/chiken/Chiken.scala └ build.sbt
実行 $ sbt run 知見です
step2 - fatjar
sbt-assembly https://github.com/sbt/sbt-assembly
plugins.sbt 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 知見です
step3 - tomcat
xsbt-web-plugin https://github.com/earldouglas/xsbt-web-plugin
plugins.sbt addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "2.1.0")
build.sbt name := "chiken" version := "1.0" scalaVersion := "2.11.8"
libraryDependencies += "javax.servlet" % "javax.servlet-api" % "3.0.1" % "provided" enablePlugins(TomcatPlugin)
ChikenServlet.scala 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() } }
web.xml <?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 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 getDefaultWebXmlFra 情報: No global web.xml found 12 15, 2016 9:52:48 午後 org.apache.coyote.AbstractProtocol start 情報: Starting ProtocolHandler ["http-nio-8080"]
None
war ファイル $ sbt package $ ls ./target/scala-2.11/ chiken_2.11-1.0.jar chiken_2.11-1.0.war
classes
step4 - multi-project
ディレクトリ構成 app/ ├ batch/ │ └ src/main/scala/batch/ChikenBatch.scala ├ lib/ │
└ src/main/scala/lib/Chilen.scala ├ project/plugins.sbt └ build.sbt
ChikenBatch.scala package batch import lib._ object ChikenBatch extends App {
println(Chiken.get) } Chilen.scala package lib object Chiken { def get = " 知見" }
build.sbt 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 知見
step5 - docker
sbt-native-packager https://github.com/sbt/sbt-native-packager
plugins.sbt addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.1.1")
build.sbt 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
step6 - custom plugin
docker 上で動くbatch の設定が 一発できるplugin をつくります
BatchPlugin.scala 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" ) }
build.sbt 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
苦労したこと
現在のgradle の構成とビルド設定の把握 ほぼブラックボックになっていた ひとつひとつ検証していくしかなかった integration test 移行 groovy で書かれていた sbt
でgroovy を動かすのは面倒 groovy をscala にすべて書き直した ( ダー シャに感謝)
その他、Smalgo で移行したもの
開発環境移行 docker compose CircleCI 移行 CD 高速化 chatops 移行 リリー
ス bid パラメー ター 変更 LB 登録/ 登録解除
よいsbt ライフを!