【问题标题】:sbt-assembly - can not find main class in jarsbt-assembly - 在 jar 中找不到主类
【发布时间】: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


【解决方案1】:

问题在于lazy val app = (project in file("app"))。假设单个模块项目没有名为 app 的模块,sbt-assembly 将创建一个名为 app 的目录并尝试将构建内容填充到其中。但是,由于主类不在app 包中,因此该类不会添加到jar 文件中。

正确的做法是:

lazy val app = (project in file(".")),指定当前目录为查找主类的目录。所以这并不是知道如何使用sbt-assembly 插件的真正问题,而是在 sbt 构建中指定项目的更普遍的问题。

【讨论】:

  • 但是项目的结构需要改变
猜你喜欢
  • 2016-01-18
  • 2018-11-17
  • 2013-08-21
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
相关资源
最近更新 更多