Я понял это в немалой степени благодаря неоценимой помощи (и похвальному терпению в его комментариях) Хосе Переда. Поэтому следует отдать ему должное.
Итак, поехали:
Каковы ваши цели
Ваша банка должна соответствовать следующим спецификациям:
- он должен содержать javfx jar libs (то есть папки с пакетами, извлеченные из их jar и помещенные в корень вашей).
- он должен содержать двоичные библиотеки javafx в корне (* .so для Linux).
- он должен (очень важно) иметь модуль запуска: основной класс, который не расширяет «Приложение». Если этого не произойдет, ошибка не будет понятна: она скажет, что не может найти среду выполнения javafx; на самом деле это не проблема.
Теперь, если вы можете сделать это любым способом (Ant, Makefile, пользовательский скрипт, особая функция IDE ...), тогда все будет работать хорошо.
Как это сделать в NetBeans (и других местах, использующих Ant, с небольшими изменениями)
Сначала я создал папку lib в своем проекте и поместил туда libs (это не обязательно, просто проще в моем случае), затем я переопределил цель post-jar в моем build.xml, добавив далее, чтобы создать второй репозиторий dist, который я назвал dist-portable и встроил толстый флягу внутри:
<target name="-post-jar">
<property name="store.jar.name" value="${application.title}${application.desc}-portable"/>
<property name="store.dir" value="dist-portable"/>
<property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>
<echo message="Packaging ${application.title}${application.desc} into a single JAR at ${store.jar}"/>
<delete dir="${store.dir}"/>
<mkdir dir="${store.dir}"/>
<jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
<zipgroupfileset dir="dist" includes="*.jar"/>
<zipgroupfileset dir="lib" includes="*.jar"/>
<fileset dir="lib" includes="*.so"/>
<manifest>
<attribute name="Main-Class" value="${main.class}"/>
</manifest>
</jar>
<zip destfile="${store.jar}">
<zipfileset src="${store.dir}/temp_final.jar"
excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
</zip>
<delete file="${store.dir}/temp_final.jar"/>
</target>
Альтернативное решение
Используйте более продвинутые инструменты сборки, такие как Maven или Gradle. Я не хочу (отсюда и суть моего вопроса), потому что они кажутся слишком сложными, чтобы стоить беспокоиться, учитывая, что я занимаюсь только небольшими проектами.
Более спорным альтернативное решение
Поколение «8» (NetBeans 8, Javafx8 и JDK8) было отличным программным обеспечением и было выпущено не так давно (первая половина 2014 года) и официально поддерживалось вплоть до пары месяцев назад: оно не древний и ... они просто работают из коробки без необходимости что-либо делать. Поколению «11», возможно, придется немного повзрослеть, и я не думаю, что в каждой среде пока что произошел переход на ультрасовременный JDK11.
Старые версии все еще можно найти и хорошо работать практически везде, вы можете просто использовать их. Просто имейте в виду, что они больше не обновляются (и это может быть проблемой безопасности).