SBT JDKpackager错误调用方法

时间:2016-01-14 19:55:09

标签: java-8 sbt packaging sbt-native-packager

摘要

我在运行和调试使用SBT Native Packager构建的CLI应用程序时遇到困难 - 浏览类似的问题几乎没有什么洞察力,因为它们要么直接引用JDK打包器(通过JavaFX),要么只是不完整/未应答。运行应用程序会抛出一条难以推理的错误消息和/或追踪(无日志)的根本原因。

堆栈

  • JDK 8u60
  • SBT 0.13.9
  • sbt-native-packager 1.0.6
  • Inno Setup 5.5.8

目的是构建Windows安装包 - 这似乎是正确构建的(我可以将它安装到另一台机器上)。

错误详情

安装打包的应用程序后,会发生以下两种情况之一:

  • 在没有任何命令参数的情况下运行应用程序什么都不做(没有错误打印到控制台,无声无息)
  • 使用参数--help运行应用程序(在主方法中命中打印出帮助文件的代码路径)会产生“错误调用方法”,然后出现“无法启动JVM”错误。我找不到任何错误日志或进一步的精确提示。应用程序的引导程序实际上是一个包含在其自己的SBT模块中的单个类(包含main()),后者又生成自己的JAR。

研究

如果没有任何想法从哪里开始,我开始研究以下结果:

  • 生成了两个引导程序JAR,我们称之为bootstrap.jarbootstrap-launcher.jar
    • 都包含MANIFEST.MF,且Main-Class元素已正确填充
    • 前者不包含Class-Path元素,但包含Implementation-Title等元素。它包含预期包中的已编译引导类。其清单文件中的Main-Class指向该包。
    • 后者与前者直接相反:其清单文件包含Class-PathMain-Class元素,没有别的。此外,它不包含任何已编译的代码

实验

我使用bootstrap JAR进行了以下实验:

  • 删除bootstrap.jarbootstrap-launcher.jar
  • 重命名和覆盖bootstrap-launcher.jar - > bootstrap.jar
  • 重命名和覆盖bootstrap.jar - > bootstrap-launcher.jar
  • Class-Path清单文件中手动添加bootstrap.jar条目到bootstrap-launcher.jar的清单文件(a.k.a.绝望模式)
  • 这些实验的最终结果总是相同的:在GUI窗口中抛出'class com ... Bootstrap not found'异常;没有进一步的解释或堆栈跟踪

此时此刻我没有其他想法,所以我很感激任何见解。

此外,我在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")
  )

同样,我非常感谢任何见解。

0 个答案:

没有答案