我在运行和调试使用SBT Native Packager构建的CLI应用程序时遇到困难 - 浏览类似的问题几乎没有什么洞察力,因为它们要么直接引用JDK打包器(通过JavaFX),要么只是不完整/未应答。运行应用程序会抛出一条难以推理的错误消息和/或追踪(无日志)的根本原因。
目的是构建Windows安装包 - 这似乎是正确构建的(我可以将它安装到另一台机器上)。
安装打包的应用程序后,会发生以下两种情况之一:
--help
运行应用程序(在主方法中命中打印出帮助文件的代码路径)会产生“错误调用方法”,然后出现“无法启动JVM”错误。我找不到任何错误日志或进一步的精确提示。应用程序的引导程序实际上是一个包含在其自己的SBT模块中的单个类(包含main()
),后者又生成自己的JAR。 如果没有任何想法从哪里开始,我开始研究以下结果:
bootstrap.jar
和bootstrap-launcher.jar
MANIFEST.MF
,且Main-Class
元素已正确填充Class-Path
元素,但包含Implementation-Title
等元素。它包含预期包中的已编译引导类。其清单文件中的Main-Class
指向该包。Class-Path
和Main-Class
元素,没有别的。此外,它不包含任何已编译的代码我使用bootstrap JAR进行了以下实验:
bootstrap.jar
或bootstrap-launcher.jar
bootstrap-launcher.jar
- > bootstrap.jar
bootstrap.jar
- > bootstrap-launcher.jar
Class-Path
清单文件中手动添加bootstrap.jar
条目到bootstrap-launcher.jar
的清单文件(a.k.a.绝望模式)此时此刻我没有其他想法,所以我很感激任何见解。
此外,我在lib
目录中看到了库依赖项的正确实现,所以至少我猜测这是正常的。
build.sbt
最后,为了完成,我附上了我当前的build.sbt
文件。它的结构原因是因为我曾经使用sbt-assembly
生成一个胖JAR - 它工作得非常好但是要求新的包装。通过追踪问题,我从构建中删除了sbt-assembly
的所有痕迹,但plugins.sbt
除外(如果需要,只是为了更容易回退)。
lazy val root: Project = (project in file("."))
.aggregate(common, commonTest, core, bootstrapCli)
lazy val common: Project = (project in file("common"))
.settings(
libraryDependencies := ...
lazy val commonTest: Project = (project in file("commonTest"))
.dependsOn(common % "compile -> test")
.settings(
libraryDependencies := ...
)
lazy val core: Project = (project in file ("core"))
.dependsOn(common, commonTest % "test -> test")
.settings(
libraryDependencies := ...,
javacOptions in (Compile, compile) ++= Seq("-parameters"),
javacOptions in doc ++= Seq.empty,
)
lazy val bootstrapCli: Project = (project in file("bootstrapCli"))
.dependsOn(core % "compile -> compile;test -> test")
.enablePlugins(JDKPackagerPlugin)
.settings(
jdkPackagerType := "exe",
mainClass in Compile := Some("com._3esi.load.bootstrap.cli.Bootstrap")
)
同样,我非常感谢任何见解。