Если изменить или удалить какой-либо файл Java, то лаунчер скорее всего скачает его заново.
Не всем игрокам это нужно: кто-то захочет использовать свою Java или полностью заменить её файлы на свои.
Инструкция
Откройте настройки Java 
Выберите «Рекомендуемая»
Нажмите «Открыть папку» 
Создайте файл с именем «override» (расширение не важно) 
Готово! Лаунчер больше не будет обновлять эту Java и её файлы можно спокойно изменять или удалять.
Руководство по версиям и возможностям Java
Здесь есть все, что вам нужно знать о различных версиях и функциях Java.
Java 8, Java 11, Java 13 — какая разница?
Вы можете использовать это руководство, чтобы найти и установить последнюю версию Java, понять различия между дистрибутивами Java (AdoptOpenJdk, OpenJDK, OracleJDK и т.д.), А также получить обзор возможностей языка Java, включая версии Java 8-13.
Исходная информация
Во-первых, давайте взглянем на некоторые общие практические вопросы, которые возникают у людей при попытке выбрать правильную версию Java для своего проекта.
Если вы хотите узнать больше о конкретной версии, перейдите на сайт AdoptOpenJDK, выберите последнюю версию Java, загрузите и установите ее. Затем вернитесь к этому руководству и узнайте еще кое-что о разных версиях Java.
Какую версию Java я должен использовать?
По состоянию на сентябрь 2019 года Java 13 является последней выпущенной версией Java, с новыми версиями, выходящими каждые 6 месяцев — Java 14 запланирована на март 2020 года, Java 15 на сентябрь 2020 года и т.д. В прошлом циклы выпуска Java были намного длиннее, до 3-5 лет!

С появлением такого количества новых версий в действительности имеются следующие основные сценарии использования:
- Унаследованные проекты в компаниях часто связаны с использованием Java 8 (см. Раздел «Почему компании все еще застревают на Java 8?» Ниже). Таким образом, вы также будете вынуждены использовать Java 8.
- Некоторые унаследованные проекты даже работают на Java 1.5 (выпущен в 2004 г.) или 1.6 (выпущен в 2006 г.) — сожалею, друзья!
- Если вы уверены, что используете самые последние IDE, интегрированные среды и инструменты сборки и запускаете новый проект, вы можете без колебаний использовать Java 11 (LTS) или даже самую последнюю версию Java 13.
- Есть специальная область разработки Android, где Java в основном застряла на версии Java 7, с доступом к определенному набору функций Java 8. Но вы можете переключиться на использование языка программирования Kotlin.
Почему компании все еще застряли на Java 8?
Существует множество разных причин, по которым компании все еще придерживаются Java 8. Вот некоторые из них:
- Инструменты сборки (Maven, Gradle и т.д.) и некоторые библиотеки изначально имели ошибки с версиями Java версий> 8 и нуждались в обновлениях. Даже сегодня, например, с Java 9+, некоторые инструменты сборки выводят предупреждения «reflective access» при создании проектов Java, которые просто «не готовы», даже если со сборкой все в порядке.
- До Java 8 вы в основном использовали JDK-сборки Oracle, и вам не нужно было заботиться о лицензировании. Однако в 2019 году Oracle изменила схему лицензирования, что привело к тому, что Интернет сошел с ума, сказав, что «Java больше не является бесплатной», — и последовало значительное замешательство. Однако на самом деле это не проблема, о чем вы узнаете в разделе «Дистрибутивы Java» данного руководства.
- В некоторых компаниях действуют политики, позволяющие использовать только версии LTS, и полагаются на поставщиков своих ОС для предоставления этих сборок, что требует времени.
Подводя итог, у вас есть сочетание практических вопросов (обновление ваших инструментов, библиотек, фреймворков) и политических проблем.
Почему некоторые версии Java называются 1.X?
Java до версии 9 просто имела другую схему именования. Итак, Java 8 также может называться 1.8, Java 5 может называться 1.5 и т.д. Когда вы выполнили команду java -version с этими версиями, вы получили такой вывод:
Это просто означает Java 8. С переходом к основанным на времени выпускам с Java 9 также изменилась схема именования, и версии Java больше не имеют префикса 1.x. Теперь номер версии выглядит так:
В чем разница между версиями Java?
Должен ли я изучать конкретную?
Придя из других языков программирования с большими перерывами между выпусками, как, например, Python 2–3, вы можете спросить, применимо ли это к Java.
Java особенная в этом отношении, поскольку она чрезвычайно обратно совместима. Это означает, что ваша программа на Java 5 или 8 гарантированно будет работать с виртуальной машиной Java 8-13 — с некоторыми исключениями, о которых вам сейчас не нужно беспокоиться.
Очевидно, что это не работает наоборот, скажем, ваша программа использует функции Java 13, которые просто недоступны в Java 8 JVM.
Это означает несколько вещей:
- Вы не просто «изучаете» конкретную версию Java, например Java 12.
- Скорее, вам нужно получить хорошую основу для всех языковых возможностей вплоть до Java 8.
- И затем, из этого руководства вы можете узнать, какие дополнительные функции появились в Java 9-13, чтобы использовать их всегда, когда это возможно.
Каковы примеры этих новых возможностей новых версий Java?
Взгляните на раздел «Возможности Java 8-13» ниже.
Но, как правило: старые, более длинные циклы выпуска (3-5 лет, вплоть до Java 8) означали множество новых функций в каждом выпуске.
Шестимесячный цикл выпуска означает меньшее количество функций на выпуск, поэтому вы можете быстро освоить языковые функции Java 9-13.
В чем разница между JRE и JDK?
До сих пор мы говорили только о Java. Но что именно означает «Java»?
Во-первых, вам нужно провести различие между JRE (Java Runtime Environment) и JDK (Java Development Kit).
Исторически, вы загружали только JRE, если вас интересовали только программы Java. JRE включает, помимо прочего, виртуальную машину Java (JVM) и инструмент командной строки «java».
Для разработки новых программ на Java вам нужно было загрузить JDK. JDK включает в себя все, что есть в JRE, а также компилятор javac и несколько других инструментов, таких как javadoc (генератор документации Java) и jdb (отладчик Java).
Теперь, почему я говорю в прошедшем времени?
Вплоть до Java 8 веб-сайт Oracle предлагал JRE и JDK в качестве отдельных загрузок, хотя JDK также всегда включал JRE в отдельной папке. В Java 9 это различие практически исчезло, и вы всегда загружаете JDK. Структура каталогов JDK также изменилась, так как в ней больше не было явной папки JRE.
Таким образом, хотя некоторые дистрибутивы (см. Раздел «Дистрибутивы Java») по-прежнему предлагают отдельную загрузку JRE, похоже, существует тенденция предлагать только JDK. Следовательно, теперь мы будем использовать Java и JDK взаимозаменяемо.
Как мне установить Java или JDK?
На данный момент не обращайте внимания на образы Java-Docker, оболочки MSI или пакеты для конкретной платформы. В конце концов, Java — это просто файл .zip; ни больше ни меньше.
Поэтому все, что вам нужно сделать, чтобы установить Java на свой компьютер, — это разархивировать файл jdk-<5-13>.zip. Вам даже не нужны права администратора для этого.
Ваш распакованный файл Java будет выглядеть так:
Магия происходит в каталоге / bin, который в Windows выглядит следующим образом:
Поэтому все, что вам нужно сделать, это разархивировать этот файл и поместить каталог /bin в переменную PATH, чтобы вы могли вызывать команду java из любого места.
В случае, если вам интересно, установщики с графическим интерфейсом, такие как Oracle или AdoptOpenJDK, выполняет распаковку и изменение переменной PATH вместо вас.
Чтобы убедиться, что вы правильно установили Java, вы можете просто выполнить команду java -version. Если вывод выглядит так, как показано ниже, вы готовы!
Теперь остался один вопрос: откуда вам взять этот .zip файл с Java? Что подводит нас к теме дистрибутивов.
Дистрибутивы Java
Существует множество сайтов, предлагающих загрузку Java (читай: JDK), и неясно, «кто что предлагает и с каким лицензированием». Этот раздел проливает свет на это.
Проект OpenJDK
С точки зрения исходного кода Java (читай: исходный код вашего JRE / JDK) есть только один — на сайте проекта OpenJDK.
Однако это всего лишь исходный код, а не распространяемая сборка (подумайте: ваш файл .zip с скомпилированной командой java для вашей конкретной операционной системы). Теоретически вы и я могли бы создать сборку из этого исходного кода, назвать ее, скажем, MarcoJDK, и начать ее дистрибуцию. Но наш дистрибутив не будет сертифицирован, чтобы можно было называть этот дистрибутив совместимым с Java SE.
Вот почему на практике есть несколько поставщиков, которые фактически создают эти сборки, сертифицируют (см. TCK) и затем распространяют их.
И хотя поставщики не могут, скажем, удалить метод из класса String перед созданием новой сборки Java, они могут добавить брэндинг (вay!) или добавить некоторые другие утилиты (например, CLI), которые они считают полезными. Но в остальном исходный код одинаков для всех дистрибутивов Java.
OpenJDK (от Oracle) и сборки OracleJDK
Один из поставщиков, который создает Java из исходного кода, — это Oracle. Это приводит к двум разным дистрибутивам Java, что поначалу может быть очень запутанными.
-
от Oracle (!). Эти сборки бесплатны и не имеют торговой марки, но Oracle не выпустит обновления для более старых версий, скажем, Java 13, как только выйдет Java 14. — это коммерческая сборка под брендом, выпускаемая начиная с изменения лицензии в 2019 году. Это означает, что ее можно использовать бесплатно во время разработки, но вы должны платить Oracle, если используете ее в рабочей среде. При этом вы получаете более длительную поддержку, то есть все обновления дистрибутива и номер телефона, по которому можно позвонить, если с вашей JVM будут проблемы.
Исторически (до Java 8) существовали реальные исходные различия между сборками OpenJDK и сборками OracleJDK, при этом можно было сказать, что OracleJDK был «лучше». Но на сегодняшний день обе версии практически одинаковы, с небольшими отличиями.
Впрочем все сводится к тому, что вам требуется платная коммерческая поддержка (номер телефона) для используемой версии Java.
AdoptOpenJDK
В 2017 году группа участников, разработчиков и поставщиков Java User Group (Amazon, Microsoft, Pivotal, Red Hat и другие) создала сообщество под названием AdoptOpenJDK.
Они предоставляют бесплатные надежные сборки OpenJDK с более длительной доступностью / обновлениями и даже предлагают вам выбор из двух разных виртуальных машин Java: HotSpot и OpenJ9.
Я очень рекомендую ее, если вы хотите установить Java.
Azul Zulu, Amazon Corretto, SAPMachine
Полный список сборок OpenJDK вы найдете на сайте OpenJDK Wikipedia. Среди них Azul Zulu, Amazon Corretto, а также https://sap.github.io/SapMachine/ и многие другие. Упрощенно говоря, различия сводятся к тому, что у вас есть различные варианты поддержки/ гарантии обслуживания.
Но не забудьте проверить на сайтах дистрибьюторов, чтобы узнать о преимуществах каждого отдельного дистрибутива.
Рекомендация
Повторим с еще раз, что с 2019 года, если у вас нет особых требований, найдите файл jdk.zip (.tar.gz/.msi/.pkg) по адресу https://adoptopenjdk.net или выберите пакет, предоставленный вашим поставщиком ОС.
Возможности Java 8-13
Как уже упоминалось в самом начале этого руководства: в сущности все (если вы не будьте слишком требовательны) функции языка Java 8 работают в Java 13. То же самое касается всех других версий Java между ними.
В свою очередь, это означает, что знание всех языковых функций Java 8 дает хорошую базу в изучении Java, а все остальные версии (Java 9-13) в значительной степени дают дополнительные функции поверх этого базового уровня.
Вот краткий обзор того, что конкретные версии могут предложить:
Java 8
Java 8 была массовым выпуском, и вы можете найти список всех функций на веб-сайте Oracle. Здесь я хотел бы упомянуть два основных набора функций:
Особенности языка: лямбды и т.д.
До Java 8 всякий раз, когда вы хотели создать экземпляр, например, нового Runnable, вы должны были написать анонимный внутренний класс, например, так:
С лямбдами тот же код выглядит так:
Вы также получили ссылки на методы, повторяющиеся аннотации, методы по умолчанию для интерфейсов и некоторые другие языковые функции.
Коллекции и потоки
В Java 8 вы также получили операции в функциональном стиле для коллекций, также известные как Stream API. Быстрый пример:
До Java 8, вам нужно было написать циклы for, чтобы что-то сделать с этим списком.
С помощью API Streams вы можете сделать следующее:
Java 9
Java 9 также была довольно большой версией, с несколькими дополнениями:
Коллекции
Коллекции получили несколько новых вспомогательных методов для простого создания списков, наборов и карт.
Streams
Потоки получили несколько дополнений, в виде методов takeWhile, dropWhile и iterate.
Optionals
Optionals получили метод ifPresentOrElse, которого крайне не хватало.
Интерфейсы
Интерфейсы получили private методы:
Другие возможности языка
И пара других улучшений, таких как улучшенный оператор try-with-resources или расширения diamond оператора.
JShell
Наконец, в Java появилась оболочка, в которой вы можете попробовать простые команды и получить немедленные результаты.
HTTPClient
Java 9 принес первоначальную предварительную версию нового HttpClient. До этого встроенная поддержка Http в Java была довольно низкоуровневой, и вам приходилось использовать сторонние библиотеки, такие как Apache HttpClient или OkHttp (кстати, отличные библиотеки).
В Java 9 у Java появился собственный современный клиент — хотя он находится в режиме превью, что означает, что он может быть изменен в более поздних версиях Java.
Проект Jigsaw: модули Java и файлы Jar с несколькими выпусками
Java 9 получила Jigsaw Module System, которая чем-то напоминает старую добрую спецификацию OSGI. Целью данного руководства не является подробное описание Jigsaw — посмотрите предыдущие ссылки, чтобы узнать больше.
Файлы Multi-Release .jar позволили создать один файл .jar, содержащий разные классы для разных версий JVM. Таким образом, ваша программа может вести себя по-разному / иметь разные классы, используемые при запуске на Java 8 и на Java 10, например.
Java 10
В Java 10 было несколько изменений, таких как сборка мусора и т.д. Но единственное реальное изменение, которое вы, как разработчик, вероятно, заметите, — это введение ключевого слова var, также называемого выводом типа локальной переменной.
Вывод типа локальной переменной: ключевое слово var
Чувствуете себя как в Javascript-е, не так ли? Однако Java все еще строго типизирован и var применяется только к переменным внутри методов (спасибо, dpash, за то, что снова указал на это).
Java 11
Java 11 также была несколько меньшей версией с точки зрения разработчика.
Строки и файлы
Строки и файлы получили несколько новых методов (не все перечислены здесь):
Запустить исходные файлы
Начиная с Java 10, вы можете запускать исходные файлы Java без предварительной компиляции. Шаг к написанию сценариев.
Вывод типа локальной переменной (var) для лямбда-параметров
В заголовке все сказано:
HttpClient
HttpClient из Java 9, но уже в окончательной, а не превью версии.
Другие вкусности
Flight Recorder (Регистратор полетов), сборщик мусора No-Op, Nashorn-Javascript-Engine объявлен deprecated (устаревшим) и т.д.
Java 12
В Java 12 появилось несколько новых функций и исправлений, но здесь стоит упомянуть только поддержку Unicode 11 и превью нового выражения switch, о котором вы узнаете в следующем разделе.
Java 13
Вы можете найти полный список возможностей здесь, но, по сути, вы получаете поддержку Unicode 12.1, а также две новые или улучшенные превью функции (могут быть изменены в будущем):
Switch выражение (Preview — предварительная версия)
Выражения переключателя теперь могут возвращать значение. И вы можете использовать лямбда-стиль синтаксиса для своих выражений, без проблем с ошибками:
Старые операторы switch выглядели так:
В то время как в Java 13 операторы switch могут выглядеть так:
Многострочные строки (превью)
Наконец-то вы можете сделать это на Java:
Java 14 и позже
Будет рассмотрено здесь, как только их выпустят. Зайдите в ближайшее время!
Вывод
К настоящему времени у вас должен быть довольно хорошее представление о нескольких вещах:
- Как установить Java, какую версию получить и где ее получить (подсказка: AdoptOpenJDK).
- Что такое дистрибутив Java, какие существуют и в чем различия.
- Каковы различия между конкретными версиями Java.
Обратная связь, исправления и случайный ввод всегда приветствуются! Просто оставьте комментарий внизу.
Спасибо за прочтение!
Там больше, откуда это появилось
Эта статья первоначально появилась на сайте как часть серии руководств по современному программированию на Java. Чтобы найти больше руководств, посетите веб-сайт или подпишитесь на рассылку, чтобы получать уведомления о недавно опубликованных руководствах: https://bit.ly/2K0Ao4F.
Благодарности
Стивен Колебурн написал фантастическую статью о различных доступных дистрибутивах Java. Спасибо, Стивен!
Java™ Runtime Environment Version Selection
In Java SE 6 update 10, Oracle, Inc. is introducing a new implementation of the Java Plug-In, which is the piece of software which executes applets in the web browser. The new Java Plug-In is being introduced simultaneously for all of the platforms on which Oracle directly supports Java (Solaris, Linux, and Microsoft Windows) and all supported browser families (the Mozilla Firefox family of browsers as well as Internet Explorer 6 and 7).
The new plug-in offers a substantially redesigned architecture. Rather than executing applets in a Java™ virtual machine (JVM) instance which is embedded in the web browser’s process, the JVM instance which executes the applet is now a separate process from the web browser. This architecture bears similarities to the «classic» Java Plug-In on the Solaris and Linux platforms, but the communications channel and relationship between the web browser and the attached JVM instance have been redesigned. The new plug-in now supports having more than one JVM instance simultaneously attached to the web browser.
Note that the new plug-in does not necessarily create a new JVM instance for each applet; like the classic plug-in, the default behavior of the new plug-in is to run all applets in the same JVM instance.
Not only does the new Java Plug-In support multiple simultaneously attached JVM instances, it supports multiple JRE versions. More precisely, it supports running an individual applet on top of a particular version of the JRE without affecting which JRE version is used to run any other applet in the same browser session. This capability is similar to that provided by Java Web Start, which allows selection of which version of the JRE is used to launch the application. When an earlier version of the JRE is selected via the new plug-in, the new plug-in’s code is actually run on top of the earlier JRE version, again in similar fashion to how the Java Web Start launcher works.
Limitations
The new Java Plug-In’s version selection mechanism works on JRE versions as far back as 1.4.2. JRE 1.3.1 and earlier are not supported. It is not possible to use the new Java Plug-In for some applets in the browser session and the classic Java Plug-In for other applets in the same browser session, for example to circumvent the 1.3.1 limitation.
Due to technical limitations of earlier versions of the JRE, on Unix/X11 platforms (Solaris and Linux), the earliest JRE version that can be selected is 5.0. Running applets on top of 1.4.2 using the new Java Plug-In is not supported on these platforms.
Version Selection Mechanisms
The new Java Plug-In provides a new platform- and browser-independent mechanism for selecting a JRE version upon which to launch an applet: the java_version applet parameter. This new parameter supports:
- Selection of a particular JRE version («1.5.0_11»)
- Selection of a particular JRE family («1.5*»)
- Selection of a particular JRE family or later («1.5+»)
The new Deployment Toolkit can be used to specify this parameter in a browser-independent fashion, without writing HTML manually.
In order to provide the most complete information, the new version selection mechanism, as well as how it interoperates with the previously available browser-specific mechanisms, are detailed here. More details of the version selection behavior are provided in the following section.
The java_version parameter
The java_version parameter has been added to the <applet> , <object> and <embed> tags to provide browser-independent JRE version selection. The value of this parameter is a version string following the rules in the JNLP specification, Chapter 4 and Appendix A. In particular, selection of a particular JRE version, one in a particular family, or one in a given family or any later family are all supported.
The java_version parameter should be specified as a name/value pair in an embedded <param> tag when used with the <applet> and <object> tags, and via java_version=[version] when used with the <embed> tag. Other alternate or shorthand forms of syntax are not guaranteed to work across browsers. Consult the Using APPLET, OBJECT and EMBED tags section of the Java Plug-In Guide for details.
Note that in order to run on top of the latest available JRE on the system, no java_version parameter is necessary; this is the default behavior.
The examples below illustrate how to use the java_version parameter.
Relationship to the Other Mechanisms
Support for the java_version parameter is provided by the new Java Plug-In. If the new Java Plug-In is not present on a particular system, then browser-specific mechanisms are needed to download and install it in order to support per-applet JRE version selection. Generally speaking, the <object> tag and classid attribute is used in the Internet Explorer browser family to auto-download plugins, and the <embed> tag and MIME type is used in the Mozilla browser family for the same purpose. Please see the «recommended usage» subsections in the classid and version documentation below for more information on combining the java_version parameter with the <object> and <embed> tags.
Both the <object> and <embed> tags also support a certain amount of version selection of the plugin to be used to render a piece of content. For backward compatibility purposes, some of the previous version selection techniques for these tags are supported in the new plug-in, though changes to existing content will be needed to access all of the new features. Please see the classid backward compatibility and the version backward compatibility sections below for more information.
Examples
Using the <applet> tag to select a particular JRE version for an individual applet:
Для чего нужна программа Java 10.0.2

Java Runtime Environment – это виртуальная машина, которая содержит собственную среду разработки и определённые Java-библиотеки. В первую очередь, она необходима для запуска некоторых игр и приложений, которые разрабатывались по Java-технологии (например, Minecraft и ему-подобные игры).
Пакеты для эффективной работы
Java Runtime Environment содержит в себе следующие компоненты:
- Исполнительная платформа JRE – предназначена для поддержки работы базовых ява-апплетов в браузере и приложениях, без использования более продвинутых компиляторов и сред разработки. Данный модуль является обязательным компонентом. Нужно также понимать различие стандартного языка Java от JavaScript, который используется на многих сайтах. Если вам нужно, чтобы браузер качественно обрабатывал последний, то в скачивании JRE нет необходимости. А вот тем, кто часто пользуется онлайн-играми и приложениями, разработанными на «чистом» Ява, данный модуль будет необходим;
- JVM – это встроенная в ПО базовая виртуальная машина, которая необходима для корректного запуска JRE на устройствах с разными операционными системами. Также она нужна для корректной работы программ, которые написаны на языке Java, но имеют разную разрядность;
- Java-библиотеки – они больше будут интересны для разработчиков, т.к. предоставляют возможность оптимизировать Ява-код под работу с другими языками программирования. Для обычных пользователей библиотеки тоже могут быть полезны, так как они позволяют корректно обрабатывать программы, написанные не только на Java.
Поддержка приложений
ПО позволяет корректно отображать старые сайты, где часть функционала работает на языке Java. Также оно позволяет запускать на компьютере многие инди и онлайн-игры. Плюс, некоторые web-приложения в социальных сетях для корректной работы тоже требуют установленной на компьютере Java Runtime Environment.
Более полезным данное ПО окажется для офисных работников и разработчиков. В первом случае оно позволит производить закрытую отчётность, проводить работы с важными документами в рамках корпоративной сети. Во втором случае оно способно заинтересовать разработчиков, пишущих на языке Java и не только. По заверению разработчиков JRE – программа гарантирует надёжность, комфорт работы и безопасность обрабатываемых данных.
Принцип работы Java Runtime Environment
Рядовому пользователю достаточно будет только установить программу и перезагрузить компьютер, после чего все приложения, которым требуется JRE, будут работать без каких-либо проблем. То же самое касается отображения Java-контента в браузере. В-основном, после установки вам практически не понадобится открывать JRE, так как ПО будет работать в фоновом режиме.
В качестве исключения можно рассматривать некоторых программистов и системных администраторов. Возможно, им придётся заходить в панель управления программы и производить там некоторые манипуляции. Но, в большинстве случаев, обращаться к Java Runtime Environment придётся для загрузки обновлений или отключения ПО. Во время обновления можно пользоваться компьютером без каких-либо ограничений.

Достоинства
- Кроссплатформенность. ПО работает на всех версиях Windows и на других ОС, в том числе мобильных;
- JRE без проблем запустится даже на очень слабом и давно устаревшем железе;
- Позволяет запускать большинство онлайн-игр;
- В большинстве случаев, не требуется какой-либо настройки после установки.
Недостатки
- Отсутствие русского языка в интерфейсе;
- Некоторые пользователи жалуются на медленную работу ПК после установки программы;
- Есть уязвимости в некоторых компонентах.
Java Runtime Environment обязательна к установки тем, кто проводит много времени в онлайн-играх, работает с различными документами в интернете или изучает языки программирования (особенно Java). Данная программа мало весит и устанавливается в пару кликов, а после установки практически не требует никакого вмешательства.