Java 8 SBT JDKpackager调用方法时出错 总结
我在运行和调试使用SBT Native Packager构建的CLI应用程序时遇到了困难—浏览类似的问题并没有产生什么洞察,因为它们要么直接指向JDK Packager(通过JavaFX),要么根本不完整/没有答案。运行应用程序会抛出一条错误消息,该消息很难解释和/或跟踪(无日志)的根本原因 堆栈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安装软件包-该软件包似乎构建正确(我可以将其安装到另一台机器上) 错误详细信息
- jdk8u60
- SBT 0.13.9
- sbt本机打包机1.0.6
- Inno设置5.5.8
- 在没有任何命令参数的情况下运行应用程序不会产生任何效果(没有错误打印到控制台,死寂)
- 使用参数
(在打印帮助文件的主方法中点击一个代码路径)运行应用程序会产生“错误调用方法”,后跟“未能启动JVM”错误。我找不到任何错误日志或进一步的精确提示。应用程序的引导实际上是一个单独的类(包含--help
main()
- 产生了两个引导jar,我们将它们称为
和bootstrap.jar
bootstrap-launcher.jar
- 两者都包含正确填充了
元素的Main Class
MANIFEST.MF
- 前者不包含
元素,但包含类路径
等元素。它在预期的包中包含已编译的引导类。其清单文件中的实现标题
指向该包主类
- 后者与前者正好相反:其清单文件包含
和类路径
元素,而不包含其他元素。此外,它不包含任何编译代码主类
- 两者都包含正确填充了
- 删除
或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
一起使用过,所以可能会有一些干扰,特别是当存在依赖冲突或逐出时。我建议运行(taskdependencyBrowseGraph
)来可视化版本冲突可能出现的位置。我建议在部署为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")
)