Скачал вчера свежую JDK 11 и поставил, но возникает ошибка.
Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: hel has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
Как я понял, это из-за того что JDK 11, и код скомпилирован на нём, а но моём компьютере версия джавы другая (восьмая), но вопрос в том, где я могу скачать JRE 11? Официальный сайт Оракла предлает только восьмую версию. Не бейте только за этот вопрос, я пытаюсь научиться, а вчера 11 Java вышла вот я её и скачал.
В Java 11 нет JRE. Если вы разработчик, вы можете запускать свою программу при помощи JDK 11. Если вы хотите делать это из командной строки, вы должны позаботиться о том, чтобы путь к java
или к java.exe
из JDK11 стоял, в переменной окружения PATH
, раньше пути к java
или к java.exe
более старых JRE. При этом вы должны учесть, что в Windows установщики старых Public JRE копировали java.exe
в директорию C:\Windows\System32
, которая так же прописана в PATH
. Лучше всего просто удалить старую Public JRE. Старый JDK удалять не обязательно, он не помешает.
Если же вы хотите послать свою программу конечному пользователю, у которого теперь нет подходящего JRE и который не хочет устанавливать JDK, вы должны создать рантайм среду (некое подобие старого JRE), которая будет включать лишь необходимые Java модули, включая модуль вашей программы.
Для примера разберём простой Hello world. Пусть ваша программа состоит из одного класса com.example.MainClass
и является модулем tryout
, то есть кроме com/example/MainClass.java
у вас есть и module-info.java
(в default пакете, то есть над com
) с описанием модуля. Например с таким минимальным:
module tryout {
}
Кстати, в IntelliJ IDEA добавление модуля является отдельной операцией от добавления класса в меню New
. Создать module-info.java
тем же способом, которым вы создаёте обычный класс вы не сможете.
После сборки вашего проекта, например при помощи Maven, у вас получится некий jar файл, точное название которого совершенно неважно. Это jar файл и будет вашим модулем, описание которого будет у него внутри в module-info.class
. Для создания рантайм среды вы должны запустить примерно такую комманду:
jlink --module-path . --add-modules tryout --launcher start=tryout/com.example.MainClass --output tryoutapp
Описание используемых параметров:
--module-path .
говорит о том, где искать модули, кроме модулей JDK. В данном случае в текущей директории .
.
--add-modules tryout
говорит о том, какие модули включить, кроме модулей, включаемых по-умолчанию из JDK.
--launcher start=tryout/com.example.MainClass
говорит о том, что нужно создать скрипты запуска start
(UNIX Shell script) и start.bat
(Batch script) которые будут запускать модуль tryout
, запуская класс com.example.MainClass
в этом модуле. Указание класса опционально и в моём случае понадобилось потому, что я поленился указать его в MANIFEST.MF
внутри jar файла.
--output tryoutapp
говорит о том, в какой директории создавать рантайм среду. При этом если такая директория уже существует и даже если она пустая, будет ошибка: "Error: directory already exists: tryoutapp".
В конечном итоге вы получите директорию tryoutapp
внутри которой будет всё необходимое для запуска вашей программы (вашего модуля). При этом ваш jar файл вы там не найдёте. Ваш модуль (а значит и класс com.example.MainClass
), вмести с остальными модулями, будет находиться в файле tryoutapp/lib/modules
. В моём случае размер этого файла 23 мегабайта. Стартовые скрипты start
и start.bat
будут находиться в директории tryoutapp/bin
.
Более детальное описание утилиты jlink
вы можете получить запустив jlink --help
.
jre 11 не будет. ссылка с картинки https://blogs.oracle.com/java-platform-group/oracle-jdk-releases-for-java-11-and-later
Выше комментирующий заявил, что Java 11 JRE не существует.
Файл имеет название: jre-11-ea+8_windows-x64_bin.exe Фактический размер: 98,7Мб
Ссылка на скачивание JDK 11 с сайта Oracle
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
как можно заставить анимацию двигаться в обратном направлении каждый раз после выполнения?
Не могу заставить располагаться кнопку на нужном месте, делаю Layout командой add(buttonPanel, BorderLayoutSOUTH);и add(centerPanel, BorderLayout
Я создаю приложениеЕсть основной функционал, но хотелось бы видеть его функциональность в виде счетчика
Когда создадим массив, например, типа char, где он сохраняется - в heap, stack или pool?