その後、いろいろ試してみたのですが、play.Play.application().getFileではsbt runで実行したときとsbt dist後に生成されるバッチから実行したときとでパスの差があり、そもそも思った挙動ではなかったです。
調べてみるとPlay 2.6ではplay.api.Environmentのresourceから取得するのが良さげなようです。
で、次のように@Injectを効かせたクラスにしてみました。(confにlibフォルダがある想定で書いてます。)
scala
1import java.io._
2import javax.inject._
3
4case class MyEnv @Inject() (env: play.api.Environment) {
5 def resource_lib_path: Option[String] = {
6 env.resource("lib") match {
7 case Some(url) => {
8 Option(new File(url.toURI()).getPath())
9 }
10 case None => None
11 }
12 }
13}
sbt runしてる状態でenv.resourceを実行すると「プロジェクトルート\target\scala-2.12\classes」というパスを返しますが、confに入ってるファイルもそこにコピーされているようなので、問題ないようです。
コントローラで使うときは下記のような感じでうまく動いたので、とりあえずこれで行こうかと思います。
scala
1@Singleton
2class HomeController @Inject()(cc: ControllerComponents, myenv: MyEnv)
3 (implicit assetsFinder: AssetsFinder)
4 extends AbstractController(cc) {
5
6 def index = Action {
7 myenv.resource_lib_path match {
8 case Some(path) => Ok(path)
9 case None => InternalServerError
10 }
11 }
12}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。