Slide 1

Slide 1 text

sbt-asemblyにハマってDB接続できず時間が溶けた話 2024/02/27 Scalaわいわい勉強会 wakye5815

Slide 2

Slide 2 text

自己紹介 普段Scala,Kotlinを書いていたりインフ ラ触っているマン 実は外部LTが今回で初めてです。。! wakye5815 所属 株式会社FLINTERS x(Twitter) @YOU40014332

Slide 3

Slide 3 text

今日話すこと META-INFを笑うものはMETA-INFに泣く

Slide 4

Slide 4 text

何が起きたか。。。? CloudSQL,CloudFunctionsで構築されたNodeのAPIサーバーを訳あってScalaに置き換える ことに。 deployするにはjarが必要そう 世間はsbt-assemblyを使ってjarを履いているらしい とりあえず書いたのでjarを吐いてみると

Slide 5

Slide 5 text

名前衝突祭り [error] Deduplicate found different file contents in the following: [error] Jar name = ... org = ... target = META-INF/... [error] Jar name = ... org = ... target = META-INF/... [error] Jar name = ... org = ... target = META-INF/... [error] Jar name = ... org = ... target = META-INF/... [error] Jar name = ... org = ... target = META-INF/... [error] Jar name = ... org = ... target = META-INF/... [error] Deduplicate found different file contents in the following: [error] Jar name = ... org = ... target = META-INF/... [error] Jar name = ... org = ... target = META-INF/...

Slide 6

Slide 6 text

META-INFを笑うもの 「META-INF?どうせ署名とかだけだし捨てても大丈夫っしょ」 build.sbt val assemblyMergeStrategySetting = assemblyMergeStrategy := { case PathList("META-INF", _*) => MergeStrategy.discard case x => val oldStrategy = (ThisBuild / assemblyMergeStrategy).value oldStrategy(x) }

Slide 7

Slide 7 text

Buildは通ったがCloudFunctions上でDB接続エラーにな る java.lang.ClassNotFoundException: org.postgresql.Driver at ............................................................ at ............................................................ 「インフラ変えていない!」 「ローカル動く!」 「なんでだ!!」

Slide 8

Slide 8 text

META-INFに泣く 原因 JDBCのドライバクラスを自動でロードするのにjarの仕様であるサービスプロバイダを使って いた DriverManager メソッド getConnection と getDrivers は、Java Standard Edition サー ビスプロバイダメカニズムをサポートするように拡張されました。JDBC 4.0 ドライバ は、ファイル META-INF/services/java.sql.Driver を含める必要があります。このファイ ルには、java.sql.Driver の JDBC ドライバ実装の名前が含まれます。たとえば my.sql.Driver クラスをロードするために、META-INF/services/java.sql.Driver ファイル に次のエントリが含まれます。 https://docs.oracle.com/javase/jp/6/api/java/sql/DriverManager.html

Slide 9

Slide 9 text

まとめ META-INFは大事にしよう、重要なファイルも入っている