Создание облегченных нативных программ Java

Поэтому я только начал разрабатывать собственные программы на Java с помощью Netbeans, создавая для них сценарии установки с помощью Inno Script. Но затем я заметил, что даже базовые программы, как правило, довольно требовательны к ресурсам, потому что у каждой программы есть собственная копия среды выполнения виртуальной машины Java, необходимая для ее выполнения. Я подумал, что хорошим решением будет установка среды выполнения JVM в единую папку (разве это не одни и те же файлы, скопированные в каждую отдельную программу?), из которой каждая отдельная программа может затем запускать общие файлы.

Проблема в том, что я действительно не знаю, как это сделать. Куда именно мне установить среды выполнения и как настроить этот путь, чтобы любые собственные Java-программы, запускаемые на компьютере, автоматически обнаруживали и использовали их? Будет ли достаточно добавления общего каталога в среду %PATH% или нет?

Пожалуйста помоги. Любая помощь будет высоко оценена.

Я еще ничего не пробовал, так как подумал, что, может быть, сначала мне следует получить совет.

::: ОБНОВЛЯТЬ ::: Итак, я думаю, что нашел возможное решение своей проблемы, хотя мне еще предстоит его попробовать, потому что я не могу получить доступ к своей IDE и другим инструментам до завтра по причинам. Но я подумал, что, возможно, я мог бы установить общие среды выполнения виртуальной машины Java в каталог, а затем добавить каталог в переменную среды %PATH%, чтобы его среды выполнения могли выполняться так же, как системные библиотеки DLL. Я опубликую обновленную информацию о результатах теории, как только смогу.

Забастовка модератора meta.stackexchange.com/questions/389811/… - так что я также не буду делать здесь никаких (дальнейших) действий, связанных с контентом/курированием

kleopatra 11.06.2023 12:42

Вам не нужны сторонние инструменты. Java может установить встроенную виртуальную машину с ресурсами там, где вы хотите.

g00se 11.06.2023 12:49

Если вы действительно обеспокоены тем, что Java является тяжеловесной, вам, вероятно, следует использовать язык без GC, который компилируется в исполняемые файлы собственного кода; то есть С или С++.

Stephen C 11.06.2023 13:58

Откуда вы знаете, что это правда? => «даже базовые программы, как правило, довольно требовательны к ресурсам, потому что каждая программа имеет свою собственную копию среды выполнения виртуальной машины Java, необходимую для ее выполнения». И, в частности, что вы подразумеваете под «довольно ресурсоемким»? Чтобы было ясно, я не согласен и не не согласен с вашим утверждением, но когда вы делаете это утверждение ядром своего вопроса, вам действительно нужно предоставить некоторые доказательства. Вы ищете решение, не демонстрируя, что есть проблема, которую нужно решить.

skomisa 11.06.2023 22:55

@skomisa, ну, я написал простую пустую программу с графическим интерфейсом, и она все равно заняла около 200+ МБ места. Я проверил, и большинство из них были просто средами выполнения JVM, поэтому я хочу, чтобы они были перемещены в общую папку. Таким образом, я не буду занимать более 200 МБ пространства для каждого из моих приложений, потому что приложения будут использовать одну и ту же среду выполнения вместо того, чтобы иметь свою собственную копию.

Juancarlos Kai Shiro 11.06.2023 23:24

Вы не должны оставлять комментарии, чтобы поблагодарить. Пожалуйста, ознакомьтесь с рекомендациями: stackoverflow.com/help/someone-answers, где это прямо сказано.

aled 12.06.2023 00:22

@JuancarlosKaiShiro Хорошо. В этом случае вы должны добавить эту информацию к своему вопросу. Как следует из ответа Василия, вы четко не указали конкретные улучшения, которые вы ищете. Поэтому любые ответы обязательно являются лишь предположениями. И без метрик, как вы можете узнать, действительно ли какие-либо изменения, которые вы вносите, полезны?

skomisa 12.06.2023 03:51

Вы должны упомянуть, что используете JavaFX, так как среда выполнения JavaFX даже больше, чем среда выполнения Java. Вы можете удалить ненужные вещи из модульной среды Java, но это не поможет, если фактическое потребление пространства не связано со средой выполнения Java. Использование общей среды выполнения — отличная идея; в основном это означает, что вы заново изобрели неродные программы, известные как обычные Java-программы.

Holger 12.06.2023 12:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
8
66
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Используйте установщик OpenJDK по умолчанию для вашей операционной системы, и если установщик этого не делает, просто добавьте каталог bin каталога JAVA HOME в переменную среды PATH.

Если ваш главный приоритет — небольшой размер исполняемого файла, Java не подходит. Вы должны использовать язык, предназначенный для компиляции в простой собственный исполняемый файл с минимальным исполняемым файлом. Например, Swift, Rust и C.

Если вы хотите продолжить работу с Java, уменьшив при этом размер своего программного артефакта, выполните следующие действия.

  1. Модулируйте ваше приложение с помощью Java Platform Module System (JPMS).
  2. Используйте инструмент jlink для сборки и оптимизации набора модулей и их зависимостей в пользовательский образ времени выполнения. Вместо того, чтобы вводить весь набор классов, предоставляемых JVM, включаются только классы модулей, фактически используемых вашим конкретным приложением.
  3. Используйте инструмент jpackage, чтобы упаковать приложение Java в пакет для конкретной платформы. Поддерживаемые форматы пакетов для конкретных платформ: Linux: deb и rpm, macOS: pkg и dmg, Windows: msi и exe.

Если скорость запуска является приоритетом, рассмотрите возможность использования JVM с OpenJ9 , а не HotSpot.

Если скорость выполнения является приоритетом, используйте предварительную компиляцию вашего Java-приложения с помощью технологии GraalVM.

Вы сказали:

Я подумал, что хорошим решением будет установка среды выполнения JVM в единую папку.

Вы можете предположить, что на компьютере пользователя установлена ​​JRE или JDK. Тогда вам не нужно включать среду выполнения Java в ваш программный артефакт.

Очевидно, это практично только в том случае, если (а) ваша пользовательская база использует управляемые компьютеры, например, в корпоративной или образовательной среде, или (б) ваши пользователи достаточно активны и сообразительны, чтобы получить и установить JRE / JDK самостоятельно.

В первые годы существования Java Sun Microsystems удалось убедить большую часть индустрии персональных компьютеров включить JRE в свои компьютеры. Но эта практика закончилась много лет назад.

Ответ принят как подходящий

Я нашел решение проблемы сейчас.

Я опробовал свою первоначальную теорию, но она не сработала, потому что оказалось, что собственные Java-программы (или, по крайней мере, те, которые скомпилированы с использованием Java FX в Netbeans) жестко запрограммированы на поиск среды выполнения JVM в определенной папке, и эта папка определена в простой текстовый файл конфигурации. Итак, вместо добавления пользовательской папки, в которой я устанавливаю среды выполнения JVM, в переменную среды %PATH%, мне просто нужно было изменить каталог среды выполнения в файле конфигурации.

Это скомпилированная нативная Java-программа

Это директория конфигурационного файла в файлах программы

Это измененный файл конфигурации. Мне просто нужно было изменить значение app.runtime на пользовательское местоположение моих общих сред выполнения JVM

Нативная программа Java, теперь настроенная таким образом, что вместо этого папка среды выполнения устанавливается в мой общий каталог; это определено в файле конфигурации

Моя общая папка среды выполнения

Внутри бинарных файлов JVM каталога среды выполнения

Нативная Java-программа, теперь без собственных сред выполнения

Благодаря этим настройкам я теперь могу запускать две отдельные нативные программы Java на компьютере без Java, не имея у каждой из них собственных сред выполнения, вместо этого разделяя среды выполнения в общей папке сред выполнения (определяемой в соответствующих файлах конфигурации). Я также настроил установки для собственных программ, так что если общие среды выполнения не будут установлены на целевом компьютере, они будут установлены, когда любая из программ будет установлена ​​или восстановлена ​​с помощью ее установки. Кроме того, более новые модифицированные среды выполнения можно легко настроить так, чтобы они переопределяли старые, обновляя среды выполнения в общей папке.

Другие вопросы по теме