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
Naohiro Hasegawa
December 27, 2016
Programming
1.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
Next.js: The final boss of Web Performance
guaca
0
380
Zero-Tap Sign-In対応、結局何をすればいいの?
mitohato14
0
1.5k
AIがコードを書いてくれる時代、我々は何を確かめるのか
yosuke_furukawa
PRO
13
5.6k
ActionController meets Protocol Buffers
sorah
1
780
Web Framework Benchmark Battle 2026, Any%
a_matsuda
3
3.1k
Apple Intelligenceとオンデバイス時代の到来
yahir0
0
200
Kotlinize Is Not Just Converting to Kotlin
chigichan24
1
220
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
130
Seven New Principles of Software Engineering
yegor256
0
440
Engineering Biometric UX Across Android Versions | DroidKnights 2026
ryunen344
1
170
React Native経験者が Flutterを30⽇間触って驚いたこと
3saito
0
140
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
4
1.4k
Featured
See All Featured
The Curse of the Amulet
leimatthew05
3
16k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Mobile First: as difficult as doing things right
swwweet
225
10k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.7k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
340
Designing for humans not robots
tammielis
254
26k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
20k
Marketing to machines
jonoalderson
1
6k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3.1k
Prompt Engineering for Job Search
mfonobong
0
570
Building Flexible Design Systems
yeseniaperezcruz
330
41k
We Are The Robots
honzajavorek
0
430
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 ライフを!