Splash-Screen работает в IDE, но не как .jar - проблема с ANT? - PullRequest
1 голос
/ 15 июня 2019

Я пытаюсь добавить заставку в большой проект Java. Приложение скомпилировано в исполняемый файл .jar с использованием ANT.

Я могу легко заставить заставку работать с NetBeans, просто добавив -splash: src / com /.../.../ image.PNG к параметрам виртуальной машины моего основного проекта. Тем не менее, добавление SplashScreen-Image: com /.../.../ image.PNG в мой файл манифеста завершается неудачно с «SplashScreen.getSplashScreen () вернул ноль»

Я уже открыл свой архив .jar, чтобы убедиться, что все настроено правильно: мой файл META-INF \ MANIFEST.MF содержит строку SplashScreen-Image. Я пытался переместить его до или после Main-Class. Мое действительное изображение .PNG также находится в архиве, в правильном пути.

Я компилирую этот java-проект с помощью ANT, который, как я могу догадаться, является источником моих проблем (я смог заставить простой, "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. Мое изображение.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, где я также в конце концов решил добавить тег splashscreen.

Я немного новичок в работе с ANT, поэтому любые советы относительно того, как справиться с этим или что искать, приветствуются.

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

У меня есть решение, хотя я уверен, что кто-то другой поймет это лучше, чем я.

Я смог запустить с заставкой, используя двоичный файл Java в ../jre/lib/Java.exe, однако изначально я работал с ../lib/Java.exe.

Похоже, это известная ошибка?Ссылка здесь: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7129420. Я думаю, путь к DLL SplashScreen жестко закодирован

Примечание: спасибо пользователю VGR за исчерпывающую помощь.

0 голосов
/ 16 июня 2019

Это не проблема с Ant.Проблема в том, что опция -splash принимает имя файла , но атрибут манифеста SplashScreen-Image должен ссылаться на запись jar .Если com/example/brian/image.PNG нет в файле .jar, он не будет использоваться SplashScreen-Image.Цель файла .jar - действовать как самостоятельный модуль или приложение, поэтому он должен включать все необходимые ему ресурсы.

Решение состоит в том, чтобы включить изображение в свой.файл jar:

<jar jarfile="${jarfile}" basedir="${build}">
    <fileset dir="${src}" includes="**/*.PNG"/>

Обновление: Ваш файл сборки уже добавляет изображения в .jar с задачей <copy>, и я не заметил этого.

...