63402


# sbt-assembly を用いてビルドした jar ファイルを起動できない

* * *

## 環境

[code]

    $ sw_vers 
    ProductName:    Mac OS X
    ProductVersion: 10.15.3
    
[/code]

[code]

    $ java --version
    openjdk 13.0.2 2020-01-14
    OpenJDK Runtime Environment AdoptOpenJDK (build 13.0.2+8)
    OpenJDK 64-Bit Server VM AdoptOpenJDK (build 13.0.2+8, mixed mode, sharing)
    
[/code]

[code]

    $ scala --version
    Scala code runner version 2.13.1 -- Copyright 2002-2019, LAMP/EPFL and Lightbend, Inc.
    
[/code]

[code]

    $ sbt --version
    sbt version in this project: 1.3.7
    sbt script version: 1.3.8
    
[/code]

* * *

# 状況

sbt は以下の表示

[code]

    sbt:scala-gui> assembly
    [info] Strategy 'discard' was applied to a file (Run the task at debug level to see details)
    [info] Strategy 'first' was applied to a file (Run the task at debug level to see details)
    [info] Strategy 'rename' was applied to a file (Run the task at debug level to see details)
    [info] Assembly up to date: /Users/tsubasa/Documents/scala-gui/target/scala-2.13/scala-gui-assembly-0.1.0-SNAPSHOT.jar
    [success] Total time: 1 s, completed Feb 26, 2020, 6:48:08 PM
    
[/code]

いくつか出ている [info] が気になりますが、何のことか分かりません。とりあえず [success]
ということなので、`target/scala-2.13/scala-gui-assembly-0.1.0-SNAPSHOT.jar` を Finder
(Jar launcher.app) から開くことにしました。

以下のダイアログが表示され、開けません。

[![Check the Console for possible error
messages.](https://i.stack.imgur.com/FShVe.png)](https://i.stack.imgur.com/FShVe.png)

[code]

    The Java JAR file “scala-gui-assembly-0.1.0-SNAPSHOT.jar” could not be launched.
    
    Check the Console for possible error messages.
    
[/code]

* * *

# コード

./src/main/scala/Main.scala

[code]

    import javafx.application.Application
    import javafx.event.{ActionEvent, EventHandler}
    import javafx.scene.Scene
    import javafx.scene.control.Button
    import javafx.scene.layout.StackPane
    import javafx.stage.Stage
    
    object Main extends App {
      Application.launch(classOf[Main], args: _*)
    }
    
    class Main extends Application {
      override def start(primaryStage: Stage): Unit = {
        val btn = new Button()
        btn.setText("押してね")
    
        btn.setOnAction(new EventHandler[ActionEvent] {
          override def handle(event: ActionEvent): Unit = {
            println("こんにちは")
          }
        })
    
        val root = new StackPane()
        root.getChildren.add(btn)
    
        val scene = new Scene(root, 300, 250)
        primaryStage.setTitle("コンソールにこんにちはを出力")
        primaryStage.setScene(scene)
        primaryStage.show()
      }
    }
    
[/code]

./build.sbt

[code]

    scalaVersion := "2.13.1"
    
    scalacOptions ++= Seq("-deprecation", "-feature", "-unchecked", "-Xlint")
    
    val osName: SettingKey[String] = SettingKey[String]("osName")
    
    osName := (System.getProperty("os.name") match {
        case name if name.startsWith("Linux") => "linux"
        case name if name.startsWith("Mac") => "mac"
        case name if name.startsWith("Windows") => "win"
        case _ => throw new Exception("Unknown platform!")
    })
    
    libraryDependencies += "org.openjfx" % "javafx-base" % "11-ea+25" classifier osName.value
    libraryDependencies += "org.openjfx" % "javafx-controls" % "11-ea+25" classifier osName.value
    libraryDependencies += "org.openjfx" % "javafx-fxml" % "11-ea+25" classifier osName.value
    libraryDependencies += "org.openjfx" % "javafx-graphics" % "11-ea+25" classifier osName.value
    libraryDependencies += "org.openjfx" % "javafx-web" % "11-ea+25" classifier osName.value
    
    assemblyMergeStrategy in assembly := {
      case PathList("module-info.class") => MergeStrategy.first
      case x => (assemblyMergeStrategy in assembly).value(x)
    }
    
    
[/code]

./project/assembly.sbt

[code]

    addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.8")
    
[/code]

これはドワンゴの N 予備校プログラミングコースにある Scala 基礎編の内容です。Scala どころか、私は Java
すら知らずに入門しましたが、指導と同じようにはなかなかいきません。

# 試行錯誤

JavaFX をインポートしていますが、OpenJDK 11 以降は同梱されないようなので、別途 OpenJFX
をインストールしました。パスも設定したのですが、何かが正しくないらしく、ここでもまたエラーです。

配置場所と設定パス

[code]

    $ echo $PATH_TO_FX
    /Library/Java/JavaVirtualMachines/javafx-sdk-13.0.2/lib
    
[/code]

[code]

    $ java -jar ./target/scala-2.13/scala-gui-assembly-0.1.0-SNAPSHOT.jar
    Error: JavaFX runtime components are missing, and are required to run this application
    
[/code]

[code]

    $ java --module-path $PATH_TO_FX --add-modules javafx.controls,javafx.fxml -jar ./target/scala-2.13/scala-gui-assembly-0.1.0-SNAPSHOT.jar 
    Error occurred during initialization of boot layer
    java.lang.module.FindException: Module javafx.controls not found
    
[/code]

何をどのようにすればこの問題は解決できますか。  
どうかご教示いただければと思います。


CC BY-SA 4.0
2020-02-26T10:51:38.877
63376
2020-02-27T06:34:31.640
question
java scala sbt
jar ファイルを起動する方法


<https://gluonhq.com/products/javafx/> からダウンロードした JavaFX Mac OS X SDK(13.0.2)
を用いて

[code]

    $ java --module-path $PATH_TO_FX --add-modules javafx.controls,javafx.fxml -jar ./target/scala-2.13/scala-gui-assembly-0.1.0-SNAPSHOT.jar
    
[/code]

を実行してみましたが、正しく起動しました。

> Error occurred during initialization of boot layer  
>  java.lang.module.FindException: Module javafx.controls not found

のエラーメッセージは、 `--module-path` 指定が誤っている場合に出力されるようなので、環境変数 `PATH_TO_FX`
の設定値が正しいインストール先を指していないことが原因として考えられます。

* * *

取り敢えず起動したい、ということであれば、

[code]

    $ sbt run
    
[/code]

コマンド実行、あるいはsbtシェル上で [`run`](https://www.scala-
sbt.org/1.x/docs/ja/Running.html) と入力すれば画面が開くと思います。  
(こちらの場合、JavaFX SDKのインストールなど事前準備は不要です。)


CC BY-SA 4.0
2020-02-27T06:34:31.640
63402
2020-02-27T06:34:31.640
2808
63376
answer