Какую jdk выбрать
Перейти к содержимому

Какую jdk выбрать

  • автор:

Какую jdk выбрать

Java Development Kit (JDK) является одним из трех основных технологий, используемых в программировании на языке Java. К ним также относятся JVM (Java Virtual Machine) и JRE (Java Runtime Environment). Важно их различать, а также понимать, как они связаны:

  • JVM отвечает за исполнение Java-программ;
  • JRE создает и запускает JVM;
  • JDK позволяет разработчикам создавать программы, которые могут выполняться и запускаться посредством JVM и JRE;

Начинающие Java-разработчики часто путают JDK и JRE. Различие заключается в том, что JDK представляет собой пакет инструментов для разработки программного обеспечения, тогда как JRE представляет собой пакет инструментов для запуска Java-кода.

JRE может использоваться, как отдельный компонент для простого запуска Java-программ, либо быть частью JDK. JDK требуется JRE, потому что запуск программ является неотъемлемой частью их разработки.

Давайте рассмотрим техническое и обобщенное определение JDK:

  • Техническое определение: JDK — это реализация спецификации платформы Java, включающая в себя компилятор и библиотеки классов.
  • Обобщенное определение: JDK — это программный пакет, который вы загружаете для создания Java-приложений.

JDK и компилятор Java

В дополнение к JRE, который является средой, используемой для запуска Java-приложений, каждый JDK содержит компилятор Java. Компилятор — это программа, способная принимать исходные файлы с расширением .java, которые являются обычным текстом, и превращать их в исполняемые файлы с расширением .class. Скоро мы рассмотрим как работает компилятор, но сперва разберемся, как загрузить и настроить JDK.

Знакомство с JDK

Установка и настройка JDK не представляет никакой сложности. При загрузке JDK необходимо выбрать какую версию Java вы хотите использовать. На данный момент Java 8 является все еще наиболее часто используемой версией (хотя уже и вышла Java 15). Java поддерживает обратную совместимость, поэтому просто загружайте последнюю версию.

Пакеты JDK

В дополнение к версии Java, необходимо выбрать пакет (платформу). В Java доступны следующие платформы: Java Enterprise Edition (Java EE), Java Standard Edition (Java SE) и Java Mobile Edition (Java ME).

Начинающие разработчики иногда не могут разобраться, какой именно пакет подходит для их проекта. Как правило, каждая версия JDK содержит инструменты Java SE. Например, Java EE это стандартная платформа (SE) с дополнительными инструментами, полезными для разработки корпоративных приложений таких, как Enterprise JavaBeans или поддержка Object Relational Mapping.

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

Совместимость версий JDK

Так как совместно с JDK поставляется компилятор, то, используемый вами JDK определяет, какую версию Java вы можете применить при разработке. Например, если вы хотите использовать новый функционал, появившийся в Java 15, то для корректной компиляции необходима, как минимум, Java 15 JDK. В противном случае команда javac сообщит о синтаксической ошибке в коде.

Загрузка JDK

В этой статье мы остановимся на JDK SE и сосредоточимся на основных классах и технологиях Java SE. Чтобы загрузить JDK, посетите сайт любой компании, которая формирует бинарные сборки JDK, например Oracle, BellSoft и т. д. и скачайте нужную версию. Актуальный список таких компаний можно посмотреть по этой ссылке.

О Java EE

Вам необходимо использовать Java EE, если вы собираетесь создавать веб-приложения. Java EE JDK включает спецификацию Java Servlet, которая поддерживает обработку HTTP-запросов. Для любой реализации Java EE JDK также требуется специальный контейнер, который является сервером, запускающим приложения. Glassfish является эталонной реализацией сервера Java EE от компании Oracle. Другими популярными реализациями являются Tomcat and Jetty.

Установка JDK

При запуске установщика JDK, вам для установки будет предложен выбор из трех компонентов: инструменты разработки, исходный код и JRE. Вы можете установить один или все из них.

Установка инструментов разработки дает вам доступ непосредственно к JDK. Исходный код содержит исходники публичных классов из Java Core API. Установка этого пункта позволит вам обращаться к исходному коду классов при разработке ваших приложений.

Устанавливайте все предлагаемые компоненты и принимайте значения по умолчанию. В вашу операционную систему будут установлены JDK, JRE и исходные коды классов. Путь установки используйте тот, который предлагается по умолчанию.

JDK в командной строке

Установка JDK и JRE добавляет команду java в вашу командную строку. Вы можете проверить это, выполнив в командной строке команду java -version , которая должна вывести в консоль, установленную версию Java.

Команда javac

Утилита javac находится в директории /bin, но автоматически не добавляется в системную переменную PATH (представляет собой набор путей до каталогов, в которых расположены исполняемые файлы) во время установки (хотя, некоторые дистрибутивы такие, как Axiom делают это автоматически). Мы можем установить javac самостоятельно или установить IDE (интегрированная среда разработки), которая содержит эту команду.

Простая Java программа
Шаг 1. Пишем код на Java

Создайте новый текстовый файл под названием Intro.java в каком-нибудь редакторе и сохраните его куда-нибудь на своем компьютере.

Затем добавьте в него следующий код:

 public class Intro < public static void main(String[] args) < System.out.println("Welcome to the JDK!"); >> 

Шаг 2. Компиляция с помощью JDK

Затем используйте JDK-компилятор, чтобы превратить ваш текстовый файл в исполняемую программу. Скомпилированный код в Java известен, как байт-код и имеет расширение class.

Для компиляции программ необходимо использовать команду javac :

 > javac Intro.java 

Это должно привести к успешной компиляции. Если компиляция прошла удачно, то в консоли не отобразится сообщение об ее успешном завершении. В противном случае любые ошибки будут отображены в консоли.

Шаг 3. Запуск .class-файла

После компиляции должен появиться файл Intro.class в той же папке, что и Intro.java. Для его запуска используйте команду java :

 > java Intro Welcome to the JDK! 

Обратите внимание, что при вводе команды расширение .class не указывается.
Результат работы команды отобразится в командной строке.
Команда jar

Javac является важной частью JDK, но каталог /bin содержит и другие инструменты, которые вам понадобятся. Вероятно, наиболее важным после javac является инструмент jar.

Файл с расширением .jar является архивом для Java-классов. После того как компилятор создал class-файлы , разработчик может объединить их в .jar , который сжимает и структурирует их в необходимом порядке.

Давайте преобразуем Intro.java в jar-файл .

>Вернитесь в каталог, где вы разместили файл Intro.java и выполните следующую команду в командной строке:

 > jar --create --file Intro.jar Intro.class 

Запуск .jar-файла

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

 > java -cp Intro.jar Intro 

Эта команда говорит Java, что искать метод main надо в классе Intro по пути intro.jar . Для такой маленькой программы не имеет смысла создавать .jar — файл. Но такие файлы необходимы, когда программа разрастается, а также использует сторонние библиотеки классов.

JDK в вашей IDE

IDE (Integrated Development Environment) или интегрированная среда разработки — это программное обеспечение, которое представляет собой функциональный набор инструментов для разработки приложений. Воспринимайте IDE, как визуальную операционную систему с набором таких инструментов, как браузер файлов и текстовый редактор с дополнительными возможностями, специфичными для разработки (автодополнение кода, форматирование и т. д.).

В Java-разработке одной из ключевых обязанностей IDE является автоматическое управление компиляцией. Среда сама запускает процесс компиляции в фоновом режиме, поэтому вам не нужно постоянно делать это самостоятельно. Также IDE «на лету» ловит и отображает ошибки кодирования.

Мы уже обсудили, как JDK работает в командной строке, теперь давайте немного посмотрим, как она работает в среде IntelliJ IDEA.

Руководство по возможностям языка Java версий 8-19

Вы можете использовать это руководство для получения практической информации о том, как найти и установить последнюю версию Java, понять различия между дистрибутивами Java (Adoptium, AdoptOpenJdk, OpenJDK, OracleJDK и т. д.), а также получить обзор функций языка Java, включая версии 8–19.

Примечание переводчика: 11 апреля 2021 г. был опубликован перевод Руководство по возможностям Java версий 8-16.

Вашему вниманию предлагается обновленная версия руководства от 28 октября 2022 г.

Практическая информация

Для начала давайте рассмотрим некоторые распространенные практические вопросы, которые возникают у людей при попытке выбрать правильную версию Java для своего проекта.

TL; DR Мне нужна только ссылка для скачивания, и я знаю обо всем остальном. Куда мне следует идти?

Перейдите на сайт Adoptium, выберите последнюю версию Java, загрузите и установите ее. Затем вернитесь к этому руководству, чтобы, возможно, еще кое‑что узнать о версиях Java.

TL;DR (англ. too long; didn’t read — слишком длинно, не читал)

Какая последняя версия Java?

По состоянию на сентябрь 2022 года Java 19 является последней выпущенной версией Java.

В марте 2023 года за ней последует Java 20. Последней версией Java с долгосрочной поддержкой (LTS) является Java 17, выпущенная в сентябре 2021 года.

Какую версию Java следует использовать?

Новые версии Java теперь выходят каждые 6 месяцев. Таким образом, Java 20 запланирована на март 2023 года, Java 21 — на сентябрь 2023 года и так далее. В прошлом циклы выпуска Java были намного длиннее, до 3–5 лет. Данный график демонстрирует, это:

С таким количеством выходящих новых версий имеются следующие основные сценарии использования:

  • Унаследованные проекты в компаниях часто застряли на использовании Java 8 (см. раздел «Почему компании все еще застряли на Java 8?» ниже). Следовательно, вы также будете вынуждены использовать Java 8.
  • Некоторые устаревшие проекты даже застряли на Java 1.5 (выпущен в 2004 г.) или 1.6 (выпущен в 2006 г.) — извините, друзья, я вам сочувствую!
  • Если вы следите за тем, чтобы использовать самые последние IDE, фреймворки и инструменты сборки и начинаете новый проект, вы можете без колебаний использовать Java 17 (LTS) или даже последнюю версию Java 19.
  • Есть особая область разработки Android, где версия Java в основном застряла на Java 7 с определенным набором возможностей Java 8. Или вы переходите на использование языка программирования Kotlin.

Почему компании все еще застряли на Java 8?

Существует целый ряд причин, по которым компании все еще придерживаются Java 8. Вот некоторые из них:

  • Инструменты сборки (Maven, Gradle и т. д.) и некоторые библиотеки изначально содержали ошибки с версиями Java > 8 и нуждались в обновлениях. Например, некоторые инструменты сборки, такие как Maven, выводили предупреждения о «рефлективном доступе» при сборке Java‑проектов, которые просто «кажутся не готовыми», даже если сборки в порядке.
  • Вплоть до Java 8 вы в практически использовали сборки Oracle JDK, и вам не нужно было заботиться о лицензировании. Однако в 2019 году Oracle изменила схему лицензирования, что привело к тому, что Интернет сошел с ума от множества статей, в которых говорилось, что «Java больше не является бесплатной», — и последовала изрядная путаница. Однако на самом деле это не является проблемой, о которой вы узнаете в разделе «Дистрибутивы Java» этого руководства.
  • Некоторые компании придерживаются политики использования только LTS‑версий и полагаются на поставщиков своих ОС, которые должны предоставить им эти сборки, что требует времени.

Подводя итог: у вас есть сочетание практических вопросов (обновление ваших инструментов, библиотек, фреймворков) и политических проблем.

Почему некоторые версии Java, например 8, также называются 1.8?

В версиях Java до 9 просто была другая схема именования. Так, Java 8 также может называться 1.8, Java 5 может называться 1.5 и т. д. Когда вы вводили команду java ‑version , с этими версиями вы получали следующий результат:

c:\Program Files\Java\jdk1.8.0_191\bin>java -version java version "1.8.0_191" (1) Java(TM) SE Runtime Environment (build 1.8.0_191-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

Это просто означает Java 8. С переходом к основанным на времени выпускам с Java 9 схема именования также изменилась, и версии Java больше не имеют префикса 1.x. Теперь номер версии выглядит следующим образом:

c:\Program Files\Java\jdk11\bin>java -version openjdk version "11" 2018-09-25 (1) OpenJDK Runtime Environment 18.9 (build 11+28) OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

В чем разница между версиями Java? Должен ли я изучать какую-то конкретную версию?

Придя из других языков программирования с большими перерывами между выпусками, как, например, Python 2–3, вы можете задаться вопросом, применимо ли то же самое к Java.

В этом отношении Java является особенной, поскольку она имеет полную обратную совместимость. Это означает, что ваша программа на Java 5 или 8 гарантированно будет работать на виртуальной машине Java 8–19 — за некоторыми исключениями, о которых вам пока не нужно беспокоиться.

Очевидно, что это не работает, наоборот, скажем, ваша программа полагается на функции Java 19, которые просто недоступны в Java 8 JVM.

Это означает несколько вещей:

  • Вы не просто «выучите» конкретную версию Java, например 12.
  • Скорее, вы получите хорошую основу для всех языковых функций вплоть до Java 8. Это послужит хорошей базой.
  • А затем, из такого руководства, как это, вы можете узнать, какие дополнительные возможности появились в Java 9–19, и будете использовать их всегда, когда это возможно.

Каковы примеры этих новых возможностей новых версий Java?

Посмотрите раздел «Возможности Java 8–19» ниже.

Но, как правило: старые, более длинные циклы выпуска (3–5 лет, вплоть до Java 8) означали большое количество новых функций в каждом выпуске.

Шестимесячный цикл выпуска означает гораздо меньшее количество функций на один выпуск, поэтому вы можете быстро освоить языковые возможности Java 9–19.

В чем разница между 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‑.zip. Для этого даже не нужны права администратора.

Ваш распакованный файл Java будет выглядеть следующим образом:

Directory C:\dev\jdk-11 12.11.2019 19:24 . 12.11.2019 19:24 .. 12.11.2019 19:23 bin 12.11.2019 19:23 conf 12.11.2019 19:24 include 12.11.2019 19:24 jmods 22.08.2018 19:18 legal 12.11.2019 19:24 lib 12.11.2019 19:23 1.238 release

Магия происходит в каталоге /bin, который в Windows выглядит следующим образом:

Directory C:\dev\jdk-11\bin . 12.11.2019 19:23 272.736 java.exe . 12.11.2019 19:23 20.832 javac.exe . 

Поэтому все, что вам нужно сделать, это разархивировать этот файл и поместить каталог /bin в переменную PATH, чтобы вы могли вызывать команду java из любого места.

Если вам интересно, установщики с графическим интерфейсом, такие как Oracle или Adoptium, выполняет для вас распаковку и изменение переменной PATH, вот и все.

Чтобы убедиться, что вы правильно установили Java, вы можете просто выполнить команду java ‑version. Если результат выглядит так, как показано ниже, вы готовы начать разработку.

openjdk version "11" 2018-09-25 OpenJDK Runtime Environment 18.9 (build 11+28) OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

Теперь остался один вопрос: откуда вам взять этот ZIP‑файл с Java? Что подводит нас к теме дистрибутивов.

Дистрибутивы Java

Есть множество сайтов, предлагающих скачать Java (читай: JDK), и непонятно, «кто что предлагает и с какой лицензией». Этот раздел прольет на это некоторый свет.

Проект OpenJDK

Что касается исходного кода Java (читайте: исходного кода для вашего JRE / JDK), существует только один, находящийся на сайте проекта OpenJDK.

Однако это всего лишь исходный код, а не распространяемая сборка (представьте: ваш файл.zip со скомпилированной командой java для вашей конкретной операционной системы). Теоретически мы с вами могли бы создать сборку из этого исходного кода, назвать ее, скажем, MarcoJDK и начать ее распространять. Но нашему дистрибутиву не хватило бы сертификации, чтобы легально называть этот дистрибутив совместимым с Java SE.

Вот почему на практике есть несколько поставщиков, которые действительно создают эти сборки, получают их сертификацию (см. TCK) и затем распространяют их.

И хотя поставщики не могут, скажем, удалить метод из класса String до выпуска новой сборки Java, они могут добавить брэндинг (ура!) или добавить некоторые другие утилиты (например, CLI), которые они считают полезными. Но в остальном исходный код одинаков для всех дистрибутивов Java.

Сборки OpenJDK (от Oracle) и OracleJDK

Одним из производителей, который собирает Java из исходников, является Oracle. Это приводит к появлению двух разных дистрибутивов Java, что поначалу может казаться очень запутанными.

  1. Сборки OpenJDK от Oracle (!). Эти сборки бесплатны и не брендированы, но Oracle не будет выпускать обновления для более старых версий, скажем, Java 15, как только выйдет Java 16.
  2. OracleJDK, которая является фирменной, коммерческой сборкой, выпускаемая начиная с изменения лицензии в 2019 году. Это означает, что ее можно использовать бесплатно во время разработки, но вам придется заплатить Oracle при ее использовании в производственной среде. За это вы получаете более длительную поддержку, то есть все обновления дистрибутива и номер телефона, по которому можно позвонить, если с вашей JVM будут проблемы.

Исторически (до появления Java 8) между сборками OpenJDK и OracleJDK существовали фактические различия в исходных текстах, и можно было сказать, что OracleJDK был «лучше». Но на сегодняшний день обе версии практически одинаковы, с небольшими отличиями.

Впрочем все сводится к тому, требуется ли вам платная коммерческая поддержка (номер телефона) для используемой версии Java.

Eclipse Temurin от Adoptium (ранее AdoptOpenJDK)

В 2017 году группа членов Java User Group, разработчиков и поставщиков (Amazon, Microsoft, Pivotal, Redhat и другие) основала сообщество под названием AdoptOpenJDK. С августа 2021 года проект AdoptOpenJDK переехал в новый дом и теперь называется проектом Eclipse Adoptium.

Adoptium предоставляет бесплатные, надежные сборки OpenJDK, называемые Eclipse Temurin с более длительной доступностью/обновлениями для различных операционных систем, архитектур и версий.

Настоятельно рекомендую ее, если вы хотите установить Java.

Azul Zulu, Amazon Corretto, SAPMachine

Полный список сборок OpenJDK можно найти на сайте OpenJDK Wikipedia. Среди них Azul Zulu, Amazon Corretto, а также SapMachine и это лишь некоторые из имеющих. Проще говоря, различия сводятся к тому, что у вас есть различные варианты поддержки/ гарантии обслуживания.

Тем не менее, если вы, например, работаете на AWS, имеет смысл просто использовать их сборки Amazon Corretto OpenJDK, если они предлагают версию, которую вы хотите использовать.

Полный обзор дистрибутива OpenJDK

Рафаэль Винтерхальтер (Rafael Winterhalter) составил отличный список всех доступных сборок OpenJDK, включая их описания: ОС, архитектуру, лицензирование, окна поддержки и обслуживания.

Рекомендация

Повторим с еще раз, что в 2022 и 2023 годах, если у вас нет специфических требований, возьмите файл jdk.zip (.tar.gz/.msi/.pkg) с сайта https://adoptium.net (под названием Eclipse Temurin) или выберите пакет, предоставленный вашим поставщиком ОС/облака.

Возможности Java 8–19

Как уже упоминалось в самом начале этого руководства: практически все (не придирайтесь) функции языка Java 8 работают в Java 19. То же самое относится и ко всем другим версиям Java между ними.

Что в свою очередь означает, что знание всех языковых возможностей Java 8 служит очень хорошей базой в изучении Java, а все остальные версии (Java 9–19) в значительной степени дают дополнительные функции поверх этого базового уровня.

Вот краткий обзор того, что могут предложить конкретные версии:

— Java 8 —

Java 8 была массовым релизом, и вы можете найти список всех функций на веб‑сайте Oracle. Однако здесь я хотел бы упомянуть два основных набора функций:

Возможности языка: лямбды и т.д.

До Java 8 всякий раз, когда вы хотели создать экземпляр, например, нового Runnable, вам приходилось писать анонимный внутренний класс следующим образом:

 Runnable runnable = new Runnable() < @Override public void run()< System.out.println("Hello world !"); >>;

С лямбда-выражениями тот же код выглядит так:

Runnable runnable = () -> System.out.println("Hello world two!");

Вы также получили ссылки на методы, повторяющиеся аннотации, методы по умолчанию для интерфейсов и некоторые другие возможности языка.

Коллекции и потоки

В Java 8 вы также получили функциональный стиль операций для коллекций, также известный как Stream API. Быстрый пример:

List list = Arrays.asList("franz", "ferdinand", "fiel", "vom", "pferd");

До появления Java 8, вам приходилось писать циклы for, чтобы что‑то сделать с этим списком.

С помощью API Streams вы можете сделать следующее:

list.stream() .filter(name -> name.startsWith("f")) .map(String::toUpperCase) .sorted() .forEach(System.out::println);

Очевидно, что в рамках данного руководства я могу только дать лишь краткий обзор каждого недавно добавленного метода Stream, Lambda или Optional в Java 8.

— Java 9 —

Java 9 также была довольно большой версией, с несколькими дополнениями:

Коллекции

Коллекции получили несколько новых вспомогательных методов для простого создания списков, наборов и карт.

List list = List.of("one", "two", "three"); Set set = Set.of("one", "two", "three"); Map map = Map.of("foo", "one", "bar", "two");
Streams

Потоки получили несколько дополнений в виде методов takeWhile, dropWhile и iterate.

Stream stream = Stream.iterate("", s -> s + "s") .takeWhile(s -> s.length() < 10);
Optionals

Optionals получили метод ifPresentOrElse, которого очень не хватало.

user.ifPresentOrElse(this::displayAccount, this::displayLogin);
Интерфейсы

Интерфейсы получили private методы:

public interface MyInterface < private static void myPrivateMethod()< System.out.println("Yay, I am private!"); >>
Другие возможности языка

И пара других улучшений, таких как улучшенный оператор try‑with‑resources или расширения diamond оператора.

JShell

Наконец, в Java появилась оболочка, в которой вы можете опробовать простые команды и получить немедленные результаты.

% jshell | Welcome to JShell -- Version 9 | For an introduction type: /help intro jshell> int x = 10 x ==> 10
HTTPClient

В Java 9 появилась начальная предварительная версия нового HttpClient. До этого встроенная поддержка Http в Java была довольно низкоуровневой, и вам приходилось прибегать к использованию сторонних библиотек, таких как Apache HttpClient или OkHttp (кстати, отличные библиотеки!).

В Java 9 у Java появился собственный современный клиент, хотя и в режиме превью, что означает возможность его изменения в более поздних версиях Java.

Project Jigsaw: Модули Java и мультирелизные JAR-файлы

В Java 9 появилась система модулей Jigsaw, которая чем‑то напоминает старую добрую спецификацию OSGI. В задачи данного руководства не входит подробное описание Jigsaw — посмотрите предыдущие ссылки, чтобы узнать больше.

Мультирелизные JAR‑файлы позволили создать один файл.jar, который содержит различные классы для различных версий JVM. Таким образом, ваша программа может вести себя по‑разному / использовать разные классы, например, при запуске на Java 8 и Java 10.

- Java 10 -

В Java 10 было внесено несколько изменений, таких как сборка мусора и т. д. Но единственное реальное изменение, которое вы, как разработчик, скорее всего заметите, — это введение ключевого слова «var», также называемого выводом типа локальной переменной.

Вывод типа локальной переменной: ключевое слово var
// Pre-Java 10 String myName = "Marco"; // With Java 10 var myName = "Marco"

Похоже на Javascript, не так ли? Тем не менее, Java все еще строго типизирован и var применяется только к переменным внутри методов (спасибо, dpash, за то, что снова указали на это).

- Java 11 -

Java 11 также была несколько меньшей версией с точки зрения разработчика.

Строки и файлы

Строки и файлы получили несколько новых методов (здесь перечислены не все):

"Marco".isBlank(); "Mar\nco".lines(); "Marco ".strip(); Path path = Files.writeString(Files.createTempFile("helloworld", ".txt"), "Hi, my name is!"); String s = Files.readString(path);
Запуск исходных файлов

Начиная с Java 10, вы можете запускать исходные файлы Java без предварительной их компиляции. Это шаг к созданию сценариев.

ubuntu@DESKTOP-168M0IF:~$ java MyScript.java
Вывод типа локальной переменной (var) для лямбда-параметров

Заголовок говорит сам за себя:

(var firstName, var lastName) -> firstName + lastName
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 выражения теперь могут возвращать значение. И вы можете использовать синтаксис в стиле лямбда для своих выражений, без проблем с ошибками:

Старые операторы switch выглядели следующим образом:

switch(status) < case SUBSCRIBER: // code block break; case FREE_TRIAL: // code block break; default: // code block >

В то время как в Java 13 операторы switch могут выглядеть следующим образом:

boolean result = switch (status) < case SUBSCRIBER ->true; case FREE_TRIAL -> false; default -> throw new IllegalArgumentException("something is murky!"); >;
Многострочные строки (предварительная версия)

Наконец‑то, вы можете сделать это на Java:

String htmlBeforeJava13 + " \n" + " 

Hello, world

\n" + " \n" + "\n"; String htmlWithJava13 = """

Hello, world

""";

- Java 14 -

Switch выражения (стандарт)

Switch выражения, которые были превью функцией в версиях 12 и 13, теперь стандартизированы.

int numLetters = switch (day) < case MONDAY, FRIDAY, SUNDAY ->6; case TUESDAY -> 7; default -> < String s = day.toString(); int result = s.length(); yield result; >>;
Records (Записи - превью)

Теперь существуют классы Records (записей), которые помогают упростить задачу написания большого количества шаблонного кода на Java.

Посмотрите на этот класс до Java 14, который содержит только данные, (потенциально) геттеры/сеттеры, equals / hashcode, toString.

final class Point < public final int x; public final int y; public Point(int x, int y) < this.x = x; this.y = y; >> // реализация equals, hashCode, toString на основе состояния // ничего больше

С записями теперь это может быть записано следующим образом:

record Point(int x, int y)

Опять же, это предварительная версия, которая может быть изменена в будущих выпусках.

Полезные исключения NullPointerExceptions

Наконец, исключения NullPointerExceptions описывают, какая именно переменная имела значение NULL.

author.age = 35; --- Exception in thread "main" java.lang.NullPointerException: Cannot assign field "age" because "author" is null
Сопоставление с образцом для InstanceOf (предварительная версия)

Раньше вам приходилось приводить ваши объекты (выполнять cast) внутри instanceof, как это показано ниже:

if (obj instanceof String) < String s = (String) obj; // использование s >

Теперь вы можете сделать это, фактически отказавшись от приведения.

if (obj instanceof String s)
Инструмент упаковки (инкубатор)

Существует инструмент jpackage (инкубатор), который позволяет упаковать ваше Java‑приложение в пакеты для конкретной платформы, включая все необходимые зависимости.

  • Linux: deb и rpm
  • macOS: pkg и dmg
  • Windows: msi и exe
Сборщики мусора

Сборщик мусора Concurrent Mark Sweep (CMS) был удален, и был добавлен экспериментальный сборщик мусора Z.

- Java 15 -

Текстовые блоки / многострочные строки

Представленные в качестве экспериментальной функции в Java 13 (см. выше), многострочные тексты теперь готовы к использованию.

String text = """ Lorem ipsum dolor sit amet, consectetur adipiscing \ elit, sed do eiusmod tempor incididunt ut labore \ et dolore magna aliqua.\ """;
Запечатанные (sealed) классы - превью

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

public abstract sealed class Shape permits Circle, Rectangle, Square

Это означает, что хотя класс является public , единственными классами, которым разрешено создавать подклассы, Shape , являются Circle , Rectangle и Square .

Записи и сопоставление с образцом

Функции Records и Pattern Matching из Java 14 (см. выше) все еще находятся на стадии предварительной версии и еще не доработаны.

Nashorn Javascript Engine

После того, как движок Nashorn Javascript Engine был объявлен устаревшим в Java 11, он был окончательно удален в JDK 15.

ZGC: готов к продакшн

Z Garbage Collector больше не обозначен как экспериментальный. Теперь он готов к использованию в продакшн.

- Java 16 -

Сопоставление шаблонов для instanceof
if (obj instanceof String) < String s = (String) obj; // например, s.substring(1) >

Теперь вы можете сделать следующее:

if (obj instanceof String s) < // Пусть сопоставление шаблонов сделает свою работу! // . s.substring(1) >
Каналы сокетов Unix-домена

Теперь вы можете подключаться к сокетам Unix‑домена (также поддерживаются macOS и Windows (10+).

 socket.connect(UnixDomainSocketAddress.of( "/var/run/postgresql/.s.PGSQL.5432"));
API стороннего компоновщика - превью

Планируемая замена JNI (Java Native Interface), позволяющая выполнять компоновку с нативными библиотеками (например, с библиотеками языка C).

Записи и сопоставление с образцом

Обе функции теперь готовы к продакшн и больше не отмечены in preview .

Запечатанные классы

Запечатанные классы (начиная с Java 15, см. выше) все еще находятся в предварительной версии.

- Java 17 -

Java 17 — это новая версия Java с долгосрочной поддержкой (LTS) после Java 11.

Сопоставление шаблонов для switch (предварительная версия)

Уже доступно на многих других языках:

public String test(Object obj) < return switch(obj) < case Integer i ->"An integer"; case String s -> "A string"; case Cat c -> "A Cat"; default -> "I don't know what it is"; >; >

Теперь вы можете передавать объекты в функции переключателя и проверять наличие определенного типа.

Запечатанные классы (завершена)

Функция, которая была представлена ​​в Java 15 в качестве предварительной версии, теперь завершена.

Резюме: если вы когда‑либо хотели иметь еще более жесткий контроль над тем, кому разрешено создавать подклассы ваших классов, теперь у вас есть функция sealed .

public abstract sealed class Shape permits Circle, Rectangle, Square

Это означает, что хотя класс Shape является публичным, единственными классами, которым разрешено создавать его подклассы являются Circle , Rectangle и Square .

API внешних функций и памяти (инкубатор)

Замена нативного интерфейса Java (JNI). Позволяет вызывать нативные функции и обращаться к памяти за пределами JVM. Пока это вызовы на C, но в будущем планируется поддержка дополнительных языков (таких как C++, Fortran).

Прекращение поддержки диспетчера безопасности

Начиная с Java 1.0, существовал менеджер безопасности. Теперь он устарел и будет удален в одной из будущих версий.

- Java 18 -

UTF-8 по умолчанию

Если вы пытались, например, читать файлы без явного указания окончания символов, то в предыдущих версиях Java использовалась кодировка операционной системы (например, UTF-8 в Linux и macOS и Windows-1252 в Windows). В Java 18 она изменилась на UTF-8 по умолчанию.

Простой веб-сервер

Java 18 теперь поставляется с простейшим HTTP‑сервером, с которого вы можете начать:

jwebserver

Подробнее о его возможностях можно узнать здесь .

Другие не столь захватывающие вещи/инкубационные возможности

Полный список и обзор смотрите в этой статье .

- Java 19 -

В Java 19 добавлено несколько интересных функций, таких как Virtual Threads и новый Foreign Function & Memory API , а также структурированный параллелизм и Vector API , но все они находятся в режиме предварительного просмотра, поэтому могут быть изменены в следующих релизах.

Если вы хотите узнать об этих функциях и о том, что будет дальше, ознакомьтесь с этой статьей .

Заключение

К настоящему моменту у вас должно быть довольно хорошее представление о нескольких вещах:

  • Как установить Java, какую версию получить и где ее получить (подсказка: Adoptium).
  • Что такое дистрибутив Java, какие из них существуют и чем они отличаются.
  • В чем разница между конкретными версиями Java.

Обратная связь, исправления и ваш вклад всегда приветствуются! Просто оставьте комментарий внизу.

Спасибо за прочтение!

Благодарности

Стивену Колеборну, который написал фантастическую статью о различных доступных дистрибутивах Java.

Что такое JDK и для чего он нужен

Рассказываем, как выбрать и установить JDK — комплект инструментов для Java-разработки.

Иллюстрация: Оля Ежак для Skillbox Media

Марина Демидова

Марина Демидова

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

JDK (Java Development Kit) — это бесплатный комплект инструментов, с помощью которого создают и запускают программы при разработке приложений на языке Java. Конечно, код можно написать и в текстовом редакторе, но скомпилировать, запустить и отладить программу без JDK у вас не получится.

Основные компоненты JDK

Java Development Kit состоит из двух частей:

  • инструменты для разработки программ;
  • средства для запуска программ.

Инструменты для разработки — это различные утилиты, средства безопасности, документация, примеры и так далее. Весь набор устанавливать не обязательно; разработчик может выбрать и установить только то, что нужно ему для работы.

Назовём лишь инструменты, без которых точно не обойтись, — они входят в стандартную сборку.

Библиотека классов. Это готовые решения ко многим задачам, с которыми сталкиваются практически все разработчики. Их использование ускоряет создание приложений.

Компилятор Javac. Он переводит исходный текст в байт-код — набор инструкций, понятный виртуальной Java-машине.

Отладчик. Помогает разработчику при поиске и исправлении ошибок. Программу в режиме отладчика можно остановить и запустить снова, можно узнать значения переменных и вычислить выражения на определённом этапе.

API Java — это программные компоненты, позволяющие интегрировать различные приложения и веб-сайты, то есть оперативно обмениваться данными между ними.

JRE (Java Runtime Environment) — среда выполнения Java. Программы на Java можно запускать на выполнение, только если установлена JRE. Она действует как посредник между программой и операционной системой, позволяет выполнять программу на разных устройствах и ОС. Благодаря ей разработчик может создавать приложение, не задумываясь о том, где оно будет выполняться.

В состав JRE входит JVM — виртуальная машина Java, которая выполняет скомпилированный байт-код. Ещё в неё входят стандартные библиотеки и вспомогательные файлы.

JDK, JRE, JVM — это три технологии Java для создания программ. При этом JRE можно использовать отдельно от JDK, если нужно не разрабатывать, а только запускать приложения. В то же время JDK не применяется без JRE — программы без запуска и отладки создавать невозможно.

JDK и среда разработки

В Java Development Kit нет среды разработки — для этой цели используются внешние программы. Конечно, можно, как мы уже говорили, написать код в каком-нибудь текстовом редакторе, например в Notepad, а затем отлаживать его в командной строке. Но гораздо удобнее установить интегрированную среду разработки (IDE): это упростит работу, особенно если вы создаёте большое приложение. Самая популярная IDE для Java — IntelliJ IDEA от компании JetBrains. Её бесплатную версию можно найти на официальном сайте.

Для аналогичных целей также используют Eclipse, NetBeans, JDeveloper, BlueJ и другие IDE — в них есть удобные средства для редактирования и отладки кода. Для компиляции используется компилятор Javас, поэтому в состав IDE обычно входит JDK. Или его устанавливают перед началом работы.

Пакеты JDK: SE, EE и ME

Есть несколько пакетов (технологических платформ) Java Development Kit — они предназначены для разработки и запуска приложений разного вида и назначения. Рассмотрим их подробнее.

Java SE (Java Standard Edition) — стандартная технологическая платформа для разработки небольших программ, главным образом десктопных. Это приложения с графическим интерфейсом, консольные приложения, а также апплеты — программы внутри браузеров. Пакет Java SE используют большинство разработчиков, с него начинают изучение языка.

Java EE (Java Enterprise Edition) — платформа для создания крупномасштабных многоуровневых программ. Их называют корпоративными, так как они обычно решают задачи, возникающие у предприятий большого бизнеса. Но порой они могут оказаться полезны для небольших организаций и даже отдельных разработчиков. Это главным образом веб-приложения и веб-сервисы. Для их создания в пакете Java EE есть специальные программные модули — сервлеты, которые обрабатывают пользовательские запросы и возвращают результат обработки.

Java ME (Java Micro Edition) — компактная платформа для программ, работающих на мобильных и встраиваемых устройствах. У платформы Java ME две конфигурации (два набора библиотек) — CDC (конфигурация подключённого устройства) и CDLC (конфигурация подключённого ограниченного устройства).

CDLC разработана для устройств с ограниченными ресурсами: слабой вычислительной мощностью и малым объёмом памяти, небольшой графикой или совсем без неё. Это мобильники, двусторонние пейджеры, торговые терминалы и так далее.

CDC предназначена для более мощных устройств: смартфонов, телевизионных приставок, встраиваемых автомобильных систем.

Все технологические платформы совместимы между собой: при необходимости вы легко можете переходить с одной на другую.

Версии JDK: Oracle и Open

Есть две версии стандартной платформы JDK SE — OpenJDK и Oracle JDK. Расскажем, чем они различаются.

Сначала была версия Java Development Kit, которую разработала в 1995 году корпорация Sun Microsystems; впоследствии она вошла в состав Oracle. Поначалу JDK создавали как бесплатное ПО с закрытым исходным кодом. Через несколько лет Oracle решила открыть код, и с 2007 года JDK развивается в двух направлениях:

  • Oracle JDK — реализация Java SE с частично открытым кодом. Её разрабатывает только Oracle, без участия кого-либо ещё.
  • OpenJDK — реализация с полностью открытым кодом. Разработана при участии Oracle, сообщества JDK, Red Hat, IBM, Apple, Azul Systems.

OpenJDK реализуется под лицензией GPL GNU , а Oracle JDK — под NFTC (Oracle No-Fee Terms and Conditions). Обе версии активно развиваются, регулярно выходят обновления. Большой технической разницы между ними нет, хотя некоторые разработчики считают, что Oracle JDK работает стабильнее.

Установка JDK

Установочные файлы Java Development Kit можно скачать на сайте Oracle, где есть версии для разных операционных систем: Windows, macOS, Ubuntu и других. Вы можете также использовать сборки, разработанные другими организациями на основе OpenJDK, — они имеют ту же функциональность, но предлагают дополнительные возможности. Так, в сборке AdoptOpenJDK можно выбрать одну из двух версий JVM, а в Liberica JDK от BellSoft есть техподдержка на русском языке.

Выберите версию, подходящую для вашей ОС. Есть два варианта установки JDK:

  • Установщик-приложение. При запуске вы можете выбрать стандартную установку или отметить нужные компоненты.
  • Установочный архив — его распаковывают и устанавливают.

Мы уже рассматривали подробно, как установить JDK. После успешной установки можно начинать работать в IDE или текстовом редакторе и командной строке.

Читайте также:

  • Всё о Java: экосистема, популярные фреймворки, системы сборки, JDK, JVM и будущее языка
  • Тест. Какой язык создадите вы — Java или Python?
  • Как устроена Java Virtual Machine и её экосистема: подробный гайд

GNU General Public License — лицензия на свободное программное обеспечение, созданная в рамках проекта GNU в 1988 году. По ней автор передаёт программное обеспечение в общественную собственность.

Руководство по версиям и возможностям Java

Здесь есть все, что вам нужно знать о различных версиях и функциях Java.

Java 8, Java 11, Java 13 — какая разница?

Вы можете использовать это руководство, чтобы найти и установить последнюю версию Java, понять различия между дистрибутивами Java (AdoptOpenJdk, OpenJDK, OracleJDK и т.д.), А также получить обзор возможностей языка Java, включая версии Java 8-13.

Примечание переводчика
09 апреля 2020 г. Марко опубликовал новую версию Руководства, в которую добавлено описание Java 14.
Перевод новой версии Руководства предлагается Вашему вниманию.

Исходная информация

Во-первых, давайте взглянем на некоторые общие практические вопросы, которые возникают у людей при попытке выбрать правильную версию 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 с этими версиями, вы получили такой вывод:

c:\Program Files\Java\jdk1.8.0_191\bin>java -version java version "1.8.0_191" (1) Java(TM) SE Runtime Environment (build 1.8.0_191-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

Это просто означает Java 8. С переходом к основанным на времени выпускам с Java 9 также изменилась схема именования, и версии Java больше не имеют префикса 1.x. Теперь номер версии выглядит так:

c:\Program Files\Java\jdk11\bin>java -version openjdk version "11" 2018-09-25 (1) OpenJDK Runtime Environment 18.9 (build 11+28) OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

В чем разница между версиями 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-.zip. Вам даже не нужны права администратора для этого.

Ваш распакованный файл Java будет выглядеть так:

Directory C:\dev\jdk-11 12.11.2019 19:24 . 12.11.2019 19:24 .. 12.11.2019 19:23 bin 12.11.2019 19:23 conf 12.11.2019 19:24 include 12.11.2019 19:24 jmods 22.08.2018 19:18 legal 12.11.2019 19:24 lib 12.11.2019 19:23 1.238 release

Магия происходит в каталоге / bin, который в Windows выглядит следующим образом:

Directory C:\dev\jdk-11\bin . 12.11.2019 19:23 272.736 java.exe . 12.11.2019 19:23 20.832 javac.exe . 

Поэтому все, что вам нужно сделать, это разархивировать этот файл и поместить каталог /bin в переменную PATH, чтобы вы могли вызывать команду java из любого места.

В случае, если вам интересно, установщики с графическим интерфейсом, такие как Oracle или AdoptOpenJDK, выполняет распаковку и изменение переменной PATH вместо вас.

Чтобы убедиться, что вы правильно установили Java, вы можете просто выполнить команду java -version. Если вывод выглядит так, как показано ниже, вы готовы!

openjdk version "11" 2018-09-25 OpenJDK Runtime Environment 18.9 (build 11+28) OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

Теперь остался один вопрос: откуда вам взять этот .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, что поначалу может быть очень запутанными.

  1. Сборки OpenJDK от Oracle (!). Эти сборки бесплатны и не имеют торговой марки, но Oracle не выпустит обновления для более старых версий, скажем, Java 13, как только выйдет Java 14.
  2. OracleJDK — это коммерческая сборка под брендом, выпускаемая начиная с изменения лицензии в 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, вы должны были написать анонимный внутренний класс, например, так:

 Runnable runnable = new Runnable() < @Override public void run()< System.out.println("Hello world !"); >>;

С лямбдами тот же код выглядит так:

Runnable runnable = () -> System.out.println("Hello world two!");

Вы также получили ссылки на методы, повторяющиеся аннотации, методы по умолчанию для интерфейсов и некоторые другие языковые функции.

Коллекции и потоки

В Java 8 вы также получили операции в функциональном стиле для коллекций, также известные как Stream API. Быстрый пример:

List list = Arrays.asList("franz", "ferdinand", "fiel", "vom", "pferd");

До Java 8, вам нужно было написать циклы for, чтобы что-то сделать с этим списком.

С помощью API Streams вы можете сделать следующее:

list.stream() .filter(name -> name.startsWith("f")) .map(String::toUpperCase) .sorted() .forEach(System.out::println);

Java 9

Java 9 также была довольно большой версией, с несколькими дополнениями:

Коллекции

Коллекции получили несколько новых вспомогательных методов для простого создания списков, наборов и карт.

List list = List.of("one", "two", "three"); Set set = Set.of("one", "two", "three"); Map map = Map.of("foo", "one", "bar", "two");
Streams

Потоки получили несколько дополнений, в виде методов takeWhile, dropWhile и iterate.

Stream stream = Stream.iterate("", s -> s + "s") .takeWhile(s -> s.length() < 10);
Optionals

Optionals получили метод ifPresentOrElse, которого крайне не хватало.

user.ifPresentOrElse(this::displayAccount, this::displayLogin);
Интерфейсы

Интерфейсы получили private методы:

public interface MyInterface < private static void myPrivateMethod()< System.out.println("Yay, I am private!"); >>
Другие возможности языка

И пара других улучшений, таких как улучшенный оператор try-with-resources или расширения diamond оператора.

JShell

Наконец, в Java появилась оболочка, в которой вы можете попробовать простые команды и получить немедленные результаты.

% jshell | Welcome to JShell -- Version 9 | For an introduction type: /help intro jshell> int x = 10 x ==> 10
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

// Pre-Java 10 String myName = "Marco"; // With Java 10 var myName = "Marco"

Чувствуете себя как в Javascript-е, не так ли? Однако Java все еще строго типизирован и var применяется только к переменным внутри методов (спасибо, dpash, за то, что снова указал на это).

Java 11

Java 11 также была несколько меньшей версией с точки зрения разработчика.

Строки и файлы

Строки и файлы получили несколько новых методов (не все перечислены здесь):

"Marco".isBlank(); "Mar\nco".lines(); "Marco ".strip(); Path path = Files.writeString(Files.createTempFile("helloworld", ".txt"), "Hi, my name is!"); String s = Files.readString(path);
Запустить исходные файлы

Начиная с Java 10, вы можете запускать исходные файлы Java без предварительной компиляции. Шаг к написанию сценариев.

ubuntu@DESKTOP-168M0IF:~$ java MyScript.java
Вывод типа локальной переменной (var) для лямбда-параметров

В заголовке все сказано:

(var firstName, var lastName) -> firstName + lastName
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 выглядели так:

switch(status) < case SUBSCRIBER: // code block break; case FREE_TRIAL: // code block break; default: // code block >

В то время как в Java 13 операторы switch могут выглядеть так:

boolean result = switch (status) < case SUBSCRIBER ->true; case FREE_TRIAL -> false; default -> throw new IllegalArgumentException("something is murky!"); >;
Многострочные строки (превью)

Наконец-то вы можете сделать это на Java:

String htmlBeforeJava13 + " \n" + " 

Hello, world

\n" + " \n" + "\n"; String htmlWithJava13 = """

Hello, world

""";

Java 14 и позже

Будет рассмотрено здесь, как только их выпустят. Зайдите в ближайшее время!

Вывод

К настоящему времени у вас должен быть довольно хорошее представление о нескольких вещах:

  • Как установить Java, какую версию получить и где ее получить (подсказка: AdoptOpenJDK).
  • Что такое дистрибутив Java, какие существуют и в чем различия.
  • Каковы различия между конкретными версиями Java.

Обратная связь, исправления и случайный ввод всегда приветствуются! Просто оставьте комментарий внизу.

Спасибо за прочтение!

Там больше, откуда это появилось

Эта статья первоначально появилась на сайте как часть серии руководств по современному программированию на Java. Чтобы найти больше руководств, посетите веб-сайт или подпишитесь на рассылку, чтобы получать уведомления о недавно опубликованных руководствах: https://bit.ly/2K0Ao4F.

Благодарности

Стивен Колебурн написал фантастическую статью о различных доступных дистрибутивах Java. Спасибо, Стивен!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *