【问题标题】:Java: splash screen in a jar file run with the -cp option?Java:使用 -cp 选项运行的 jar 文件中的启动画面?
【发布时间】:2013-12-12 07:56:15
【问题描述】:

是否可以将启动画面图像放在jar文件中并在命令行中使用-splash选项?

背景: 我有 3 个 jar 文件,它们有一个有趣的依赖树,我要运行的主类在“公共”jar 中(它反射性地调用其他两个 jar 的主类)。所以使用 -jar 命令行是不可能的。

是的,我知道您可以在清单中使用SplashScreen-Image 行,但是在使用 java 命令行的 -cp 选项时,所有清单似乎都被忽略了。如果可能的话,我有点想将资源自包含在罐子中,所以我希望其中一个罐子能容纳有问题的启动画面。但是“xx.jar!path”或“xx.jar/path”之后的splash 的路径似乎不起作用。有可能吗,怎么做?

编辑:好的,让我再试一次。我有三个罐子。一个里面有图形逻辑,我们称之为“UI”,一个里面有业务逻辑,我们称之为“Core”,一个有两者之间的公共类。 Core 组件和 UI 组件都可以作为自己的应用程序运行,并且它们有自己的主类,并且它们的 jar 被设置为在类路径中包含公共 jar。但是常见的 jar 有一个带有 main 方法的类,它调用两个主类。通用 jar 是两者之间的库,不应该将 UI 或 Core jar 作为依赖项,因为如果组件单独运行,它们中的任何一个都可能丢失。

我想要的只是一种在调用公共 jar 中的主类时引用 UI jar 中包装的启动画面的方法。我已经解决了使用-cp 选项调用这个普通jar 的main 的逻辑。它只是还没有适当的启动画面。有可能吗,怎么做? (我希望这个问题是通用的,不包括所有这些信息,但无论如何。)

【问题讨论】:

  • 你的问题没有多大意义。为什么不能/不会使用 -jar 选项? “其他两个罐子的主要类”是什么意思?我会将“主类”作为具有main() 方法入口点的类;所以用复数形式谈论它们是没有意义的,除非你有多个程序要运行,使用相同的依赖项。
  • 基本上,我们的程序是两个组件,它们可以分开运行(在不同的虚拟机中,在不同的机器上等),但此时在同一个虚拟机中运行,并根据不同的方式相互交谈关于他们是如何分裂的。每个组件都包含在自己的 jar 中,任何公共物品都放在公共 jar 中。公共主类简单地启动两个线程并在每个线程中反射调用 main。但所有这些都是背景信息,实际上并不需要回答这个问题,只是为了避免我已经广泛阅读过的“只使用这个东西”的答案。
  • 仍然不清楚为什么不使用-jar 选项。您是否知道即使您使用 -jar 选项,您的代码也不必位于单个 .jar 文件中。你知道如何使用 main jar manifest 的 Class-Path 属性吗?
  • 更新了问题。

标签: java command-line jar


【解决方案1】:

我认为你这样做的理由没有说服力,但这是让它发挥作用的方法。

将环境变量_JAVA_SPLASH_JAR 设置为包含初始屏幕图像的JAR 的文件系统路径,并将_JAVA_SPLASH_FILE 设置为该JAR 中的初始屏幕文件的名称。例如,在bashsh shell 中,

(export _JAVA_SPLASH_JAR=app.jar; \
 export _JAVA_SPLASH_FILE=META-INF/splash.jpg; \
 java -cp app.jar com.y.app.Main )

我认为这种方法不好,因为环境变量没有记录为java 启动器接口的一部分,并且实现更改可能会破坏启动画面或整个启动器。

使用它的解释是站不住脚的。当然,您不希望公共库和应用程序之间存在任何循环依赖关系。但这与归档结构无关。当应用程序对组合主类有很强的运行时依赖时,为什么还要麻烦从应用程序的组合主类中删除编译时依赖项?

这个“通用”主类不是通用库的一部分。这是另一个应用程序。允许它对应用程序具有静态依赖项,并将其打包在单独的存档中,使用适当的Main-ClassClass-PathSplashScreen-Image 以便可以使用-jar 启动它会更有意义选项。然后,当您的其他应用程序单独部署时,它们的公共库将不包含不必要的组合应用程序。并且当安装了新版本的 Java 时,启动画面将正确显示,而不是使启动器崩溃。

【讨论】:

  • 感谢您关注以正确的方式做事并使用公共 API 和一切。 Java 没有公共 API 来从与正在运行的 jar 文件不同的 jar 文件中获取启动画面,这有点烦人。这确实是我一直在寻找的答案,尽管它很丑陋。也就是说,我可能会根据 Robin Green 的回答编写代码,因为我不知道 Java 不在乎是否在类路径上找不到东西。只是不确定将谁标记为“答案”...
【解决方案2】:

使用-jar 并指定您可以在Class-Path 清单属性中使用的任何其他jar 的位置。该类路径上的东西不需要存在。这仍然有效。

【讨论】:

  • 不打算剪掉它,罐子结构保持不变。更新了问题。
猜你喜欢
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 2011-01-17
相关资源
最近更新 更多