【发布时间】:2021-12-27 00:23:11
【问题描述】:
我有一个项目,我正在尝试使用 sbt-assembly 插件创建一个胖 jar。当我尝试使用 java -jar 命令从 jar 中运行我的主类时,我收到错误消息:Error: Could not find or load main class com.gordon.timeshare.apps.TimeShareLauncher。
我的项目中只有一个主类(我使用extends App 语法来完成此操作),因此我没有明确指定主类的路径,尽管我已经尝试过但没有帮助。
以下是我在build.sbt 文件中的所有设置。
ThisBuild / version := "0.1.0-SNAPSHOT"
ThisBuild / organization := "com.gordon.timeshare.apps"
ThisBuild / scalaVersion := "2.13.5"
lazy val app = (project in file("app"))
.settings(
assembly / mainClass := Some("com.gordon.timeshare.apps.TimeShareLauncher"),
assembly / assemblyJarName := "TimeShareLauncher.jar"
)
assemblyMergeStrategy in assembly := {
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case x => MergeStrategy.first
}
我也尝试过其他策略,例如 deduplicate,但在尝试制作 .jar 时会出错。
此外,在制作 .jar 时,我会收到警告:
[warn] Could not create directory C:\Users\dgord\workspace\new-timeshare\timeshare\target\streams\_global\assembly\_global\streams\assembly\88fbe735ce5abc6987fbc59b072404628cdc94b4_a99f2fe2a42747ed9809d4f62f51a9e1b336dde8_da39a3ee5e6b4b0d3255bfef95601890afd80709\META-INF\versions\9: java.nio.file.FileAlreadyExistsException: C:\Users\dgord\workspace\new-timeshare\timeshare\target\streams\_global\assembly\_global\streams\assembly\88fbe735ce5abc6987fbc59b072404628cdc94b4_a99f2fe2a42747ed9809d4f62f51a9e1b336dde8_da39a3ee5e6b4b0d3255bfef95601890afd80709\META-INF\versions\9
如果你想知道我的主课是什么样子的:
package com.gordon.timeshare.apps
object TimeShareLauncher extends App
- sbt: 1.4.7(也试过 1.5.5)
- sbt 程序集:1.1.0
- scala 2.13.5
我也在 WSL 上试过这个,结果是一样的。
【问题讨论】:
-
你的错误说它正在寻找
com.gordon.apps.TimeShareLauncher,但你的班级是com.gordon.timeshare.apps.TimeShareLauncher -
@GaëlJ 解决了这个问题,我仍然有同样的问题。我已经更新了我的构建文件的样子。
-
@DanGordon 您能否解压缩 fat jar 的内容并确保以下内容成立。 1.有文件
com/gordon/timeshare/apps/TimeShareLauncher.class。 2.有一个文件META-INF/Manifest.txt,内容为Main-Class: com.gordon.timeshare.apps.TimeShareLauncher -
修改后的build.sbt文件别忘了
reload -
@IvanStanislavciuc 清单文件有
Main-Class: com.gordon.timeshare.apps.TimeShareLauncher,但是该类似乎不在 .jar 中,这说明它没有找到它。我只是不明白为什么它没有被添加到 .jar 中。
标签: scala sbt sbt-assembly sbt-native-packager