Java 8 SBT JDKpackager调用方法时出错 总结

Java 8 SBT JDKpackager调用方法时出错 总结,java-8,sbt,packaging,sbt-native-packager,Java 8,Sbt,Packaging,Sbt Native Packager,我在运行和调试使用SBT Native Packager构建的CLI应用程序时遇到了困难—浏览类似的问题并没有产生什么洞察,因为它们要么直接指向JDK Packager(通过JavaFX),要么根本不完整/没有答案。运行应用程序会抛出一条错误消息,该消息很难解释和/或跟踪(无日志)的根本原因 堆栈 jdk8u60 SBT 0.13.9 sbt本机打包机1.0.6 Inno设置5.5.8 其目的是构建Windows安装软件包-该软件包似乎构建正确(我可以将其安装到另一台机器上) 错误详细信息

我在运行和调试使用SBT Native Packager构建的CLI应用程序时遇到了困难—浏览类似的问题并没有产生什么洞察,因为它们要么直接指向JDK Packager(通过JavaFX),要么根本不完整/没有答案。运行应用程序会抛出一条错误消息,该消息很难解释和/或跟踪(无日志)的根本原因

堆栈
  • jdk8u60
  • SBT 0.13.9
  • sbt本机打包机1.0.6
  • Inno设置5.5.8
其目的是构建Windows安装软件包-该软件包似乎构建正确(我可以将其安装到另一台机器上)

错误详细信息 安装打包应用程序后,会发生以下两种情况之一:

  • 在没有任何命令参数的情况下运行应用程序不会产生任何效果(没有错误打印到控制台,死寂)
  • 使用参数
    --help
    (在打印帮助文件的主方法中点击一个代码路径)运行应用程序会产生“错误调用方法”,后跟“未能启动JVM”错误。我找不到任何错误日志或进一步的精确提示。应用程序的引导实际上是一个单独的类(包含
    main()
调查 在不知从何处着手的情况下,我开始对此进行调查,结果如下:

  • 产生了两个引导jar,我们将它们称为
    bootstrap.jar
    bootstrap-launcher.jar
    • 两者都包含正确填充了
      Main Class
      元素的
      MANIFEST.MF
    • 前者不包含
      类路径
      元素,但包含
      实现标题
      等元素。它在预期的包中包含已编译的引导类。其清单文件中的
      主类
      指向该包
    • 后者与前者正好相反:其清单文件包含
      类路径
      主类
      元素,而不包含其他元素。此外,它不包含任何编译代码
实验 我使用引导jar执行了以下实验:

  • 删除
    bootstrap.jar
    bootstrap launcher.jar
  • 重命名和覆盖
    bootstrap launcher.jar
    ->
    bootstrap.jar
  • 重命名和覆盖
    bootstrap.jar
    ->
    bootstrap launcher.jar
  • 手动将
    类路径
    条目从
    bootstrap.jar
    清单文件添加到
    bootstrap launcher.jar
    的清单文件(又称绝望模式)
  • 这些实验的最终结果总是一样的:“Class com…Bootstrap not found”异常在GUI窗口中抛出;没有进一步的解释或跟踪
此时此刻,我没有其他想法,因此我希望能有任何见解

此外,我看到库依赖项在
lib
目录中正确地具体化,所以至少我推测这是正确的

build.sbt
最后,为了完成,我附加了当前的
build.sbt
文件。它的结构之所以如此,是因为我曾经使用
sbt assembly
来制作一个胖罐子——它工作得很好,但需要新的包装。追踪这个问题,我从构建中删除了所有
sbt汇编的痕迹,除了
plugins.sbt
(只是为了方便在需要时更容易地回退)


同样,我非常感谢您提供的见解。

您是否尝试过使用sbt native packager提供的startscript脚本直接运行应用程序?是一种处理长类路径的方法。可以找到原始问题@Muki-我已经总结了我在链接上的发现……但是我已经没有办法去哪里找了。有什么想法吗?通常启动问题与某些类路径/依赖性问题有关。在windows上获取控制台输出是一个很大的麻烦,但是如果您从命令行启动程序并将输出重定向到文件中,就可以完成。查看如果执行
myprog.exe>output.txt
会发生什么。我有大约6个多模块应用程序使用这个插件,没有问题,所以我确信它很小,但是隐藏起来了。PS:我从来没有将这个插件与
sbt assembly
一起使用过,所以可能会有一些干扰,特别是当存在依赖冲突或逐出时。我建议运行(task
dependencyBrowseGraph
)来可视化版本冲突可能出现的位置。我建议在部署为bundle.PSS时不要使用
sbt assembly
:加快调试速度的一种方法是直接针对
build.xml
文件运行
ant
,该文件在
target/jdkpackager
中生成,而
jdkpackager:packageBin
运行一次之后。它将列出将在启动器中定义的类路径。如果有帮助,您可以手动调整它。同样,我怀疑
sbt assembly
导致了问题。您是否尝试过使用sbt native packager提供的startscript脚本直接运行应用程序?是一种处理长类路径的方法。可以找到原始问题@Muki-我已经总结了我在链接上的发现……但是我已经没有办法去哪里找了。有什么想法吗?通常启动问题与某些类路径/依赖性问题有关。在windows上获取控制台输出是一个很大的麻烦,但是如果您从命令行启动程序并将输出重定向到文件中,就可以完成。查看如果执行
myprog.exe>output.txt
会发生什么。我有大约6个多模块应用程序使用这个插件,没有问题,所以我确信它很小,但是隐藏起来了。PS:我从来没有将这个插件与
sbt assembly
一起使用过,所以可能会有一些干扰,特别是当存在依赖冲突或逐出时。我建议运行(任务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") )