【Scala】Scala ~ Resources ~

■ はじめに

業務で、Scala の Resources を動的に切り替える必要があるので
Scala の Resources について、色々調べたことをまとめる

目次

【1】Scala の Resources ディレクトリ
 1)デフォルトのResources パス
【2】Resources 関連のAPI
【3】Resources あれこれ
 0)使用上の注意
 1)Resources のパス変更
 2)Resources ディレクトリの追加
 3)Resources の追加・除外
【4】サンプル
 例1:TOMLファイル取得

【1】Scala の Resources ディレクト

* ソースコード以外のリソース置き場
 + 例えば、設定ファイルなど置く等

ディレクトリ構成例

project-root
 + src
   + main
     + scala
     + resources << ★ここに設定ファイルなどを置く

1)デフォルトのResources パス

https://www.scala-sbt.org/1.x/docs/Howto-Customizing-Paths.html#Change+the+default+resource+directory

より抜粋

[1] Normal

src/main/resources

[2] Test

src/test/resources

【2】Resources 関連のAPI

* getClass.getResource("【ファイル】") でパス取得
* getClass.getResourceAsStream("【ファイル】") だとストリームとして取得

【3】Resources あれこれ

0)使用上の注意

* 下記1)以降を実行する前に「sbt clean」を行っておいた方が無難
 => っというのも「2)Resources ディレクトリの追加」を行った時に
  意図した動きにならずに、1日中ハマったため、、、

1)Resources のパス変更

* 以下の公式ドキュメントに記載

https://www.scala-sbt.org/1.x/docs/Howto-Customizing-Paths.html#Change+the+default+resource+directory

Compile / resourceDirectory := baseDirectory.value / "aws-resources"

Test / resourceDirectory := baseDirectory.value / "test-resources"

2)Resources ディレクトリの追加

https://www.scala-sbt.org/1.x/docs/Howto-Customizing-Paths.html#Add+an+additional+resource+directory

Compile / unmanagedResourceDirectories += baseDirectory.value / "extra-resources"

Test / unmanagedResourceDirectories ++= {
  Seq(baseDirectory.value / "extra-test-resources")
}

3)Resources の追加・除外

https://www.scala-sbt.org/1.x/docs/Howto-Customizing-Paths.html#Include%2Fexclude+files+in+the+resource+directory

# 除外
unmanagedResources / excludeFilter := HiddenFileFilter || "*impl*"

# 追加
Compile / unmanagedResources / includeFilter := "*.txt"
Test / unmanagedResources / includeFilter := "*.html"

【4】サンプル

例1:TOMLファイル取得

以下の関連記事のコードをベースに実装してみた

Scala ~ TOML ~
https://dk521123.hatenablog.com/entry/2023/10/08/232146

import com.electronwill.nightconfig.core.file.FileConfig

import java.io.File

object Main {
  def main(args: Array[String]): Unit = {
    // WindowsだとFileでワンクッション置く必要がある
    val configPath = new File(getClass.getResource("config.toml").getPath)
    val config = FileConfig.of(configPath)
    config.load()
    println("Config: " + config)
    println("title: " + config.get("title"))
    val server = config.getOptional("database.server")
    println("server: " + server.get())
    val data = config.getOptional("clients.data")
    println("data: " + data.get())
    config.close()
    println("Done!")
  }
}

src/main/resources/config.toml

# This is a comment

title = "TOML Example"

[owner]
name = "Tom Preston-Werner"
dob = 1979-05-27T07:32:00-08:00 # date type

[database]
server = "127.0.0.1"
ports = [ 8080, 8081, 8082 ]
connection_max = 5000
enabled = true

[servers]

[servers.alpha]
ip = "10.0.0.1"
dc = "eqdc10"

[servers.beta]
ip = "10.0.0.2"
dc = "eqdc10"

[clients]
data = [ ["gamma", "delta"], [1, 2] ]

hosts = [
    "alpha",
    "omega"
]

# テーブルの配列
#
[[table_array]]
key1 = "value1"

build.sbt

ThisBuild / version := "0.1.0-SNAPSHOT"

ThisBuild / scalaVersion := "2.13.14"

libraryDependencies ++= Seq(
  "com.electronwill.night-config" % "toml" % "3.6.6",
)

lazy val root = (project in file("."))
  .settings(
    name := "sample"
  )

関連記事

Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
Scala ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/12/184331
Scala ~ TOML ~
https://dk521123.hatenablog.com/entry/2023/10/08/232146
SBT ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/22/000000
SBT ~ 基本編 / build.sbt ~
https://dk521123.hatenablog.com/entry/2023/01/27/000000
SBT ~ JAR作成/実行 ~
https://dk521123.hatenablog.com/entry/2023/10/12/200450
SBT ~ 引数設定の仕方 ~
https://dk521123.hatenablog.com/entry/2023/08/21/000000
SBT ~ 設定の切替 ~
https://dk521123.hatenablog.com/entry/2023/08/28/165323