- PVSM.RU - https://www.pvsm.ru -
Здесь есть все, что вам нужно знать о различных версиях и функциях Java.

Java 8, Java 11, Java 13 — какая разница?
Вы можете использовать это руководство, чтобы найти и установить последнюю версию Java, понять различия между дистрибутивами Java (AdoptOpenJdk, OpenJDK, OracleJDK и т.д.), А также получить обзор возможностей языка Java, включая версии Java 8-13.
Во-первых, давайте взглянем на некоторые общие практические вопросы, которые возникают у людей при попытке выбрать правильную версию Java для своего проекта.
Если вы хотите узнать больше о конкретной версии, перейдите на сайт AdoptOpenJDK [1], выберите последнюю версию Java, загрузите и установите ее. Затем вернитесь к этому руководству и узнайте еще кое-что о разных версиях Java.
По состоянию на сентябрь 2019 года Java 13 [2] является последней выпущенной версией Java, с новыми версиями, выходящими каждые 6 месяцев — Java 14 запланирована на март 2020 года, Java 15 на сентябрь 2020 года и т.д. В прошлом циклы выпуска Java были намного длиннее, до 3-5 лет!

С появлением такого количества новых версий в действительности имеются следующие основные сценарии использования:
Существует множество разных причин, по которым компании все еще придерживаются Java 8. Вот некоторые из них:
Подводя итог, у вас есть сочетание практических вопросов (обновление ваших инструментов, библиотек, фреймворков) и политических проблем.
Java до версии 9 просто имела другую схему именования. Итак, Java 8 также может называться 1.8, Java 5 может называться 1.5 и т.д. Когда вы выполнили команду java -version с этими версиями, вы получили такой вывод:
c:Program FilesJavajdk1.8.0_191bin>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 FilesJavajdk11bin>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)
Придя из других языков программирования с большими перерывами между выпусками, как, например, Python 2–3, вы можете спросить, применимо ли это к Java.
Java особенная в этом отношении, поскольку она чрезвычайно обратно совместима. Это означает, что ваша программа на Java 5 или 8 гарантированно будет работать с виртуальной машиной Java 8-13 — с некоторыми исключениями, о которых вам сейчас не нужно беспокоиться.
Очевидно, что это не работает наоборот, скажем, ваша программа использует функции Java 13, которые просто недоступны в Java 8 JVM.
Это означает несколько вещей:
Взгляните на раздел «Возможности Java 8-13 [7]» ниже.
Но, как правило: старые, более длинные циклы выпуска (3-5 лет, вплоть до Java 8) означали множество новых функций в каждом выпуске.
Шестимесячный цикл выпуска означает меньшее количество функций на выпуск, поэтому вы можете быстро освоить языковые функции Java 9-13.
До сих пор мы говорили только о 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-Docker, оболочки MSI или пакеты для конкретной платформы. В конце концов, Java — это просто файл .zip; ни больше ни меньше.
Поэтому все, что вам нужно сделать, чтобы установить Java на свой компьютер, — это разархивировать файл jdk-{5-13}.zip. Вам даже не нужны права администратора для этого.
Ваш распакованный файл Java будет выглядеть так:
Directory C:devjdk-11
12.11.2019 19:24 <DIR> .
12.11.2019 19:24 <DIR> ..
12.11.2019 19:23 <DIR> bin
12.11.2019 19:23 <DIR> conf
12.11.2019 19:24 <DIR> include
12.11.2019 19:24 <DIR> jmods
22.08.2018 19:18 <DIR> legal
12.11.2019 19:24 <DIR> lib
12.11.2019 19:23 1.238 release
Магия происходит в каталоге / bin, который в Windows выглядит следующим образом:
Directory C:devjdk-11bin
...
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 (читай: JDK), и неясно, «кто что предлагает и с каким лицензированием». Этот раздел проливает свет на это.
С точки зрения исходного кода Java (читай: исходный код вашего JRE / JDK) есть только один — на сайте проекта OpenJDK [8].
Однако это всего лишь исходный код, а не распространяемая сборка (подумайте: ваш файл .zip с скомпилированной командой java для вашей конкретной операционной системы). Теоретически вы и я могли бы создать сборку из этого исходного кода, назвать ее, скажем, MarcoJDK, и начать ее дистрибуцию. Но наш дистрибутив не будет сертифицирован, чтобы можно было называть этот дистрибутив совместимым с Java SE.
Вот почему на практике есть несколько поставщиков, которые фактически создают эти сборки, сертифицируют (см. TCK [9]) и затем распространяют их.
И хотя поставщики не могут, скажем, удалить метод из класса String перед созданием новой сборки Java, они могут добавить брэндинг (вay!) или добавить некоторые другие утилиты (например, CLI), которые они считают полезными. Но в остальном исходный код одинаков для всех дистрибутивов Java.
Один из поставщиков, который создает Java из исходного кода, — это Oracle. Это приводит к двум разным дистрибутивам Java, что поначалу может быть очень запутанными.
Исторически (до Java 8) существовали реальные исходные различия между сборками OpenJDK и сборками OracleJDK, при этом можно было сказать, что OracleJDK был «лучше». Но на сегодняшний день обе версии практически одинаковы, с небольшими отличиями [12].
Впрочем все сводится к тому, что вам требуется платная коммерческая поддержка (номер телефона) для используемой версии Java.
В 2017 году группа участников, разработчиков и поставщиков Java User Group (Amazon, Microsoft, Pivotal, Red Hat и другие) создала сообщество под названием AdoptOpenJDK [1].
Они предоставляют бесплатные надежные сборки OpenJDK с более длительной доступностью / обновлениями и даже предлагают вам выбор из двух разных виртуальных машин Java: HotSpot [13] и OpenJ9 [14].
Я очень рекомендую ее, если вы хотите установить Java.
Полный список сборок OpenJDK вы найдете на сайте OpenJDK Wikipedia [15]. Среди них Azul Zulu [16], Amazon Corretto [17], а также https://sap.github.io/SapMachine/ [18] и многие другие. Упрощенно говоря, различия сводятся к тому, что у вас есть различные варианты поддержки/ гарантии обслуживания.
Но не забудьте проверить на сайтах дистрибьюторов, чтобы узнать о преимуществах каждого отдельного дистрибутива.
Повторим с еще раз, что с 2019 года, если у вас нет особых требований, найдите файл jdk.zip (.tar.gz/.msi/.pkg) по адресу https://adoptopenjdk.net [19] или выберите пакет, предоставленный вашим поставщиком ОС.
Как уже упоминалось в самом начале этого руководства: в сущности все (если вы не будьте слишком требовательны) функции языка Java 8 работают в Java 13. То же самое касается всех других версий Java между ними.
В свою очередь, это означает, что знание всех языковых функций Java 8 дает хорошую базу в изучении Java, а все остальные версии (Java 9-13) в значительной степени дают дополнительные функции поверх этого базового уровня.
Вот краткий обзор того, что конкретные версии могут предложить:
Java 8 была массовым выпуском, и вы можете найти список всех функций на веб-сайте Oracle [20]. Здесь я хотел бы упомянуть два основных набора функций:
До 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<String> 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 также была довольно большой версией, с несколькими дополнениями:
Коллекции получили несколько новых вспомогательных методов для простого создания списков, наборов и карт.
List<String> list = List.of("one", "two", "three");
Set<String> set = Set.of("one", "two", "three");
Map<String, String> map = Map.of("foo", "one", "bar", "two");
Потоки получили несколько дополнений, в виде методов takeWhile, dropWhile и iterate.
Stream<String> stream = Stream.iterate("", s -> s + "s")
.takeWhile(s -> s.length() < 10);
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 оператора.
Наконец, в Java появилась оболочка, в которой вы можете попробовать простые команды и получить немедленные результаты.
% jshell
| Welcome to JShell -- Version 9
| For an introduction type: /help intro
jshell> int x = 10
x ==> 10
Java 9 принес первоначальную предварительную версию нового HttpClient. До этого встроенная поддержка Http в Java была довольно низкоуровневой, и вам приходилось использовать сторонние библиотеки, такие как Apache HttpClient или OkHttp (кстати, отличные библиотеки).
В Java 9 у Java появился собственный современный клиент — хотя он находится в режиме превью, что означает, что он может быть изменен в более поздних версиях Java.
Java 9 получила Jigsaw Module System [21], которая чем-то напоминает старую добрую спецификацию OSGI [22]. Целью данного руководства не является подробное описание Jigsaw — посмотрите предыдущие ссылки, чтобы узнать больше.
Файлы Multi-Release .jar позволили создать один файл .jar, содержащий разные классы для разных версий JVM. Таким образом, ваша программа может вести себя по-разному / иметь разные классы, используемые при запуске на Java 8 и на Java 10, например.
В Java 10 было несколько изменений, таких как сборка мусора и т.д. Но единственное реальное изменение, которое вы, как разработчик, вероятно, заметите, — это введение ключевого слова var, также называемого выводом типа локальной переменной.
Вывод типа локальной переменной: ключевое слово var
// Pre-Java 10
String myName = "Marco";
// With Java 10
var myName = "Marco"
Чувствуете себя как в Javascript-е, не так ли? Однако Java все еще строго типизирован и var применяется только к переменным внутри методов (спасибо, dpash [23], за то, что снова указал на это).
Java 11 также была несколько меньшей версией с точки зрения разработчика.
Строки и файлы получили несколько новых методов (не все перечислены здесь):
"Marco".isBlank();
"Marnco".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 firstName, var lastName) -> firstName + lastName
HttpClient из Java 9, но уже в окончательной, а не превью версии.
Flight Recorder (Регистратор полетов), сборщик мусора No-Op, Nashorn-Javascript-Engine объявлен deprecated (устаревшим) и т.д.
В Java 12 появилось несколько новых функций и исправлений [24], но здесь стоит упомянуть только поддержку Unicode 11 и превью нового выражения switch, о котором вы узнаете в следующем разделе.
Вы можете найти полный список возможностей здесь [25], но, по сути, вы получаете поддержку Unicode 12.1, а также две новые или улучшенные превью функции (могут быть изменены в будущем):
Выражения переключателя теперь могут возвращать значение. И вы можете использовать лямбда-стиль синтаксиса для своих выражений, без проблем с ошибками:
Старые операторы 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 = "<html>n" +
" <body>n" +
" <p>Hello, world</p>n" +
" </body>n" +
"</html>n";
String htmlWithJava13 = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
Будет рассмотрено здесь, как только их выпустят. Зайдите в ближайшее время!
К настоящему времени у вас должен быть довольно хорошее представление о нескольких вещах:
Обратная связь, исправления и случайный ввод всегда приветствуются! Просто оставьте комментарий внизу.
Спасибо за прочтение!
Эта статья первоначально появилась на сайте [26] как часть серии руководств по современному программированию на Java. Чтобы найти больше руководств, посетите веб-сайт или подпишитесь на рассылку, чтобы получать уведомления о недавно опубликованных руководствах: https://bit.ly/2K0Ao4F [27].
Стивен Колебурн написал фантастическую статью [28] о различных доступных дистрибутивах Java. Спасибо, Стивен!
JVM Ecosystem Survey: Why Devs Aren't Switching to Java 11 [29]
Beyond Java 8 [30]
When Will Java 11 Replace Java 8 as the Default Java? [31]
Автор: val6852
Источник [32]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/347007
Ссылки в тексте:
[1] AdoptOpenJDK: https://adoptopenjdk.net/
[2] Java 13: https://openjdk.java.net/projects/jdk/13/
[3] определенному набору функций Java 8: https://developer.android.com/studio/write/java8-support
[4] предупреждения «reflective access»: https://issues.apache.org/jira/browse/GROOVY-8339
[5] схему лицензирования: https://www.oracle.com/technetwork/java/javase/overview/oracle-jdk-faqs.html
[6] Дистрибутивы Java: https://www.marcobehler.com/guides/a-guide-to-java-versions-and-features#_java_distributions
[7] Возможности Java 8-13: https://www.marcobehler.com/guides/a-guide-to-java-versions-and-features#_java_features_8_13
[8] проекта OpenJDK: http://openjdk.java.net/projects/jdk/
[9] TCK: https://en.wikipedia.org/wiki/Technology_Compatibility_Kit
[10] Сборки OpenJDK: http://jdk.java.net/
[11] OracleJDK: https://www.oracle.com/technetwork/java/javase/downloads/index.html
[12] небольшими отличиями: https://blogs.oracle.com/java-platform-group/oracle-jdk-releases-for-java-11-and-later
[13] HotSpot: https://en.wikipedia.org/wiki/HotSpot
[14] OpenJ9: https://en.wikipedia.org/wiki/OpenJ9
[15] OpenJDK Wikipedia: https://en.wikipedia.org/wiki/OpenJDK
[16] Azul Zulu: https://www.azul.com/products/zulu-community/
[17] Amazon Corretto: https://aws.amazon.com/de/corretto/
[18] https://sap.github.io/SapMachine/: https://sap.github.io/SapMachine/
[19] https://adoptopenjdk.net: https://adoptopenjdk.net
[20] веб-сайте Oracle: https://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html
[21] Jigsaw Module System: https://www.oracle.com/corporate/features/understanding-java-9-modules.html
[22] спецификацию OSGI: https://en.wikipedia.org/wiki/OSGi
[23] dpash: https://www.reddit.com/user/dpash
[24] несколько новых функций и исправлений: https://www.oracle.com/technetwork/java/javase/12-relnote-issues-5211422.html
[25] здесь: https://www.oracle.com/technetwork/java/13-relnote-issues-5460548.html
[26] сайте: http://www.marcobehler.com/written
[27] https://bit.ly/2K0Ao4F: https://bit.ly/2K0Ao4F
[28] фантастическую статью: https://blog.joda.org/2018/09/time-to-look-beyond-oracles-jdk.html?showComment=1536303755275#c5934330550793525320
[29] JVM Ecosystem Survey: Why Devs Aren't Switching to Java 11: https://dzone.com/articles/jvm-ecosystem-survey-why-devs-are-staying-with-jav
[30] Beyond Java 8: https://dzone.com/articles/beyond-java-8
[31] When Will Java 11 Replace Java 8 as the Default Java?: https://dzone.com/articles/when-will-java-11-replace-java-8-as-the-default-ja
[32] Источник: https://habr.com/ru/post/488144/?utm_source=habrahabr&utm_medium=rss&utm_campaign=488144
Нажмите здесь для печати.