我正在尝试将闪屏添加到大型Java项目中。使用ANT将应用程序编译成可执行的.jar文件。
只需在主项目的VM选项中添加-splash:src / com /.../.../ image.PNG,便可以从NetBeans轻松启动启动屏幕。但是,将SplashScreen-Image:com /.../.../ image.PNG添加到清单文件失败,并显示“ SplashScreen.getSplashScreen()返回null”
我已经打开.jar存档以确认是否已正确设置:META-INF \ MANIFEST.MF文件包含SplashScreen-Image行。我尝试过在Main-Class之前或之后移动它。我的实际image.PNG也在存档中的正确路径位置。
我用ANT编译了这个Java项目,我可以猜出这是我问题的根源(我能够使一个简单的“ jar cmf ...”示例正常工作)。
我使用以下方法来准备要实现的项目元素:
<target name="compile" depends="init"
description="Compile the source">
<!-- Compile the java code from ${src} into ${build} -->
<path id="lib.path.ref">
<fileset dir="${path_to_jre}" includes="*.jar"/>
</path>
<javac srcdir="${src}" destdir="${build}" source="${java_ver}" target="${java_ver}"
includeantruntime="false">
<!--compilerarg value="-Xbootclasspath/p:${toString:lib.path.ref}" compiler="javac1.7"/-->
<compilerarg value="-Xlint:unchecked"/>
<classpath>
<fileset dir="${LibDir}">
<include name="*.jar"/>
</fileset>
<pathelement path="${dependant_jar}"/>
<pathelement path="${another_dependant_jar}"/>
</classpath>
</javac>
<!-- Copy the .png files -->
<copy todir="${build}">
<fileset dir="${src}" casesensitive="false">
<include name="**/*.PNG"/>
</fileset>
</copy>
</target>
请注意,我使用副本将.PNG文件与.class文件一起移入。我的Splash Screen的image.PNG和其他的一样。我将其复制到netbeans项目中,只需将其复制到那里即可。
我的实现目标如下:
<target name="archive" depends="compile"
description="Generate the .jar file">
<!-- Put everything in ${build} into the .jar file -->
<jar jarfile="${jarfile}" basedir="${build}">
<!-- Merge in contents of dependency .jars -->
<zipfileset src="${LibDir}/snakeyaml.jar"/>
<zipfileset src="${dependant_jar}"/>
<zipfileset src="${another_dependant_jar}"/>
<!-- Specify main class in manifest -->
<manifest>
<attribute name="SplashScreen-Image" value="com/../../image.PNG"/>
<attribute name="Main-Class" value="${mainclass}"/>
</manifest>
</jar>
</target>
因此,最终的.jar中的清单是在这里创建的,这也是我最终意识到要添加启动画面标签的地方。
我对使用ANT有点陌生,因此,任何有关如何处理或寻找内容的建议都将受到赞赏。
答案 0 :(得分:0)
Ant没问题。问题是the -splash option takes a file name,但是the SplashScreen-Image manifest attribute must refer to a jar entry。如果com/example/brian/image.PNG
不在.jar文件中,则SplashScreen-Image无法使用它。 .jar文件的目的是充当一个独立的模块或应用程序,因此它应包括其所需的所有资源。
解决方案是将图像包含在您的.jar文件中:
<jar jarfile="${jarfile}" basedir="${build}">
<fileset dir="${src}" includes="**/*.PNG"/>
更新:您的构建文件已经通过<copy>
任务将图像添加到.jar中,但是我没有注意到它。
答案 1 :(得分:0)
我有一个解决方案,尽管我确信别人会比我更了解这一点。
我能够使用../jre/lib/Java.exe中的Java二进制文件运行,并且出现了启动画面,但是最初我是从../lib/Java.exe运行的。
看起来这是一个已知的错误?链接到这里:https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7129420。我猜到SplashScreen dll的路径是硬编码的。
注意:感谢用户VGR的详尽帮助。