1.6 运行JAR文件

问题

你想使用scala或java命令来运行一个从Scala应用程序创建的JAR文件。

解决方案

首先,像我在17.1节演示的那样,创建一个最基础的sbt项目目录结构。然后在project/plugins.sbt文件中加入下面这行代码来将sbt-assembly(https://oreil.ly/Q6CUr)加入项目配置中:

然后将下面的Hello.scala源代码文件放到该项目的根目录中:

下一步,在sbt shell中使用assembly或者show assembly来创建一个JAR文件:

如上所示,show assembly命令输出了生成JAR文件的位置。这个文件名之所以以RunJarFile开头,是因为我创建的build.sbt文件中name字段的值就是RunJarFile。同样,文件名中的0.1.0部分来自该文件的version字段:

接下来,创建一个名为Example的子目录,并将JAR文件复制到该目录:

因为sbt-assembly会将所需要的所有东西全部打包到JAR文件中,所以可以使用下面的scala命令来运行名为hello的main方法:

注意,如果JAR包中存在多个@main方法,可以通过在命令的末尾指定方法的完整路径的方式来运行它们:

讨论

如果试图使用java命令来运行JAR文件或者用sbt package而非sbt assembly来打包JAR文件,就需要手动将JAR文件的依赖添加到classpath中。比如,当使用java命令运行一个JAR文件时,需要这样做:

注意,整个java命令应该在一行,包括行末的foo.bar.Hello部分。

要使用这种方式,你需要找到scala-library.jar文件。在我的例子中,因为Scala 3发行版是手动管理的,所以它被放在了如上所示的目录中。如果使用像Coursier(https://get-coursier.io)这样的工具来管理Scala安装,那么它下载的文件可以在下面的目录里找到:

·macOS:~/Library/Caches/Coursier/v1

·Linux:~/.cache/coursier/v1

·Windows:%LOCALAPPDATA%\Coursier\Cache\v1。假设用户名是Alvin,通常这个路径对应的是C:\Users\Alvin\AppData\Local\Coursier\Cache\v1

有关这些目录的最新细节,请参阅Coursier Cache网页(https://oreil.ly/Rs4dV)。

为什么要使用sbt-assembly

注意,如果应用程序使用了托管依赖或非托管依赖,并且你使用的是sbt package而非sbt assembly,就必须了解并找到所有有依赖以及有传递依赖的JAR文件,并将其包含在classpath中。这就是为什么强烈建议使用sbt assembly或类似的工具来打包。

另见

·请参阅17.11节以了解更多关于如何配置和使用sbt-assembly的细节。