从Eclipse调试SplashScreen而不生成Jar

wil*_*824 6 java eclipse debugging swing splash-screen

我在网上搜索但找不到这个问题的答案:

我需要根据您访问的模块调试更改SplashScreen的应用程序的功能.

我知道代码:

SplashScreen splash = SplashScreen.getSplashScreen();
Run Code Online (Sandbox Code Playgroud)

通过时,可用于获取实例:

  • 从命令行启动:java -splash:path/image.gif ClassFile
  • 清单中的启动图像:splashscreen-image:img/SplashNomina.gif

仍然当我尝试通过从Eclipse中的VM args传递-splash值来运行应用程序时,它无效.

它实际上是可能的,因为SplashScreen.getSplashScreen()始终为NULL.我一直试图通过而没有成功:

  • -splash:Image.gif的
  • -Dsplash = Image.gif的

现在我在这个Splash api中看到了很多限制,因为总是需要传递一个参数.我认为能够在运行时传递参数会更灵活:(

任何帮助都会非常感激!

Ste*_*hen 13

好吧,这也咬了我一下.

我构建了一个带有清单条目的可运行jar

SplashScreen-Image: MyGraphic.jpg
Run Code Online (Sandbox Code Playgroud)

它按照预期的方式工作.

从Eclipse,将VM arg指定为

-splash:MyGraphic.jpg
Run Code Online (Sandbox Code Playgroud)

没有这样的运气

SplashScreen.getSplashScreen()返回null.

原因是JDK中的SplashScreen.getSplashScreen()的脑死亡实现(至少1.6).我认为.如果不了解本机代码正在做什么,这很难说.但是,这是java.awt.SplashScreen中的这个方法.我不确定它是否被调用但是研究它确实为我提供了在Eclipse中使用它所需的基本线索:

public synchronized URL getImageURL() throws IllegalStateException {
    checkVisible();
    if (imageURL == null) {
        try {
            String fileName = _getImageFileName(splashPtr);
            String jarName = _getImageJarName(splashPtr);
            if (fileName != null) {
                if (jarName != null) {
                    imageURL = new URL("jar:"+(new File(jarName).toURL().toString())+"!/"+fileName);
                } else {
                    imageURL = new File(fileName).toURL();
                }
            }
        }
        catch(java.net.MalformedURLException e) {
            // we'll just return null in this case
        }
    }
    return imageURL;
}
Run Code Online (Sandbox Code Playgroud)

请注意,对于文件(即命令行而不是jar启动),它不会使用getResource()来获取URL,而是打开相对于CWD的文件.由于Eclipse运行配置默认从项目的根目录运行,因此答案是将路径指定为相对路径,而不是期望进行类路径查找.

因此,由于我使用maven构建,我的图像位于src/main/resources/MyGraphic.jpg.将其指定为命令行参数:ie

-splash:src/main/resources/MyGraphic.jpg 
Run Code Online (Sandbox Code Playgroud)

允许它在Eclipse中工作(或者,我想,任何命令行)

我不确定为什么这样,因为getImageURL方法不是由getSplashScreen()调用的,但是它可以工作.

对我来说,这是Sun/Oracle的一种脑死亡.他们可以轻松地使用像imageURL = getResource(filename)这样的类路径查找,但他们没有.

简短的回答是,Splash Screen命令行语法是指相对于当前工作目录的文件名,而不是相对于类路径的文件名.