Adopt openjdk что это
Так много JDK… Какой использовать и чем это грозит?
От переводчика: Решение перевести эту статью пришло не само собой — скорее это вынужденная мера :). К нам, как к вендорам фреймворка CUBA, обращаются с этим вопросом с завидной регулярностью. Безусловно, для нас это тоже крайне важная тема, и в ответ на последние изменения мы подняли тестовые стенды как на Oracle JDK, так и на Liberica JDK — эта мера на данный момент ограждает наших пользователей от непредвиденных лицензионных трат. Однако, эта тема еще не закрыта, и мы продолжаем внимательно следить за развитием событий, и, кто знает, возможно нам придется добавлять стенды для еще каких сборок JDK уже в следующем году.
Статья под катом подкупает тем, что она лаконично описывает проблематику и наиболее популярные JDK с их особенностями.
Недавно Oracle заявили, что эволюция Java кардинально изменится благодаря переходу на «Release Train» — новому подходу к выкатыванию версий. Это изменение также повлекло за собой перемены в плане поддержки версий, которая теперь будет осуществляться не для всех, а только для LTS версий. Сообщество Java чемпионов разъяснило вводимые новшества, детальный документ доступен в сети.
Даже с учетом этих новостей остаются вопросы: какие билды JDK сейчас доступны? Будут ли они бесплатными или коммерческими? Прежде чем ответить на этот вопрос, важно понять, какие требования предъявляются к JDK как продукту. Фактически, есть только один основной исходный код JDK. Он находится здесь. Кто угодно может использовать исходный код для построения собственной сборки и размещения ее где-то в сети. Однако есть отдельная процедура сертификации, которая должна быть пройдена, чтобы сборка JDK считалась валидной. Сертификация осуществляется Java Community Process (JCP), который предоставляет Technology Compatibility Kit (TCK). Если какая-либо организация создает новую сборку OpenJDK, которая отвечает TCK, она считается «совместимой с Java SE».
Имейте в виду, что сборка не может называться «Java SE», если компания, осуществившая сборку, не приобрела коммерческую лицензию от Oracle. Например, сборки AdoptOpenJDK, которые проходят TCK, не являются «Java SE», но являются «Java SE compliant». Также нужно учитывать, что сертификация сейчас основывается “на честном слове” — результаты не отсылаются в JCP/Oracle для верификации и являются закрытой информацией. Короче говоря, каждый вендор, взявший исходники OpenJDK и собравший версию, порождает еще одну отдельную сборку JDK.
Итак, без лишних слов, рекомендуем ознакомиться со следующими готовыми к использованию JDK:
Oracle JDK
Это главный поставщик Java 11 (релиз уже состоялся). Это коммерческая версия с платной поддержкой. Ее можно бесплатно скачивать и использовать только непосредственно для разработки. Использовать ее в продакшене, не заплатив Oracle, нельзя (так что для многих не интересующихся вопросами лицензирования это ловушка). Oracle планирует предоставлять платную поддержку до 2026 года и далее. В отличие от того, как было раньше, сборка Oracle JDK ничем не “лучше” OpenJDK (по стольку по скольку оба находятся на одном и том же уровне security patch level).
OpenJDK Build от Oracle
AdoptOpenJDK
Это тоже бесплатные и не-брендовые сборки OpenJDK, распространяемые по лицензии GPL с Classpath Extension, только в отличие от билдов OpenJDK от Oracle эти версии сборки будут действовать в течение более длительного времени для основных версий, таких как Java 11. Версии Java 11 будут выпускаться в течение 4 лет через год после следующего основного релиза. AdoptOpenJDK ориентируется на сообщество. Пока другие команды создают и публикуют исправления безопасности для исходного репозитория OpenJDK, они будут выпускать билды. И IBM, и Red Hat обозначили, что намерены выпускать такие патчи.
AdoptOpenJDK OpenJ9
Вдобавок к стандартным сборкам OpenJDK AdoptOpenJDK будет также предоставлять версии с OpenJ9 вместо HotSpot. OpenJ9 изначально была JVM от IBM, но сейчас OpenJ9 имеет открытый исходный код. И, кстати говоря, эта опция наиболее достойная изучения.
Red Hat OpenJDK
Red Hat предоставляет версии сборки OpenJDK на Red Hat Enterprise Linux (RHEL), являющемся коммерческим продуктом с платной поддержкой. Red Hat очень неплохо справляются с исправлениями безопасности в OpenJDK. В прошлом Red Hat отвечали за security-апдейты Java 6 и 7. Сборка от Red Hat более интегрирована с операционной системой, так что ее нельзя назвать типичным билдом OpenJDK (отсутствует JDK конечного пользователя).
Azul Zulu
Zulu — брендированная версия OpenJDK с платной коммерческой поддержкой. К тому же, хотя Azul предоставляет некоторые элементы Zulu бесплатно в рамках «Zulu Community», они не несут никаких особых обязательств по доступности этих сборок. У Azul довольно масштабный план по поддержке Zulu, включающий поддержку Java 9, 13 и 15, в отличие от других поставщиков.
Amazon Corretto
Это новейшая из всех описанных опций. Corretto — бесплатная версия сборки OpenJDK с долгосрочной поддержкой, проходящая TCK. Она распространяется по стандартным условиям лицензирования всех версий OpenJDK: GPL + CE. Amazon создаст собственные патчи и запустят Corretto на AWS, так что он будет использоваться довольно активно (и уже добавлен в некоторые продукты). Поддержка Java 8 планируется по меньшей мере до июня 2023.
В процессе преобразования исходного OpenJDK в различные версии сборки производитель может добавлять различные утилиты или брендировать продукт, если это не препятствует сертификации (TCK). Например, нельзя добавить новый public-метод в API или новые языковые ресурсы.
Есть и другие реализации JDK, такие как IBM и SAPMachine. Однако эти версии сборки не так часто используются, поэтому они не упомянуты в этой статье. Более подробную информацию можно найти здесь и здесь.
Заключение
Лично я особой проблемы в наличие нескольких версий JDK не вижу, так как всем им нужно проходить сертификацию (TCK). Чем действительно стоит обеспокоиться — это использование одной из проприетарных JDK и бесплатной версии сборки от Oracle, во избежание головной боли в будущем. Если вы используете только базовые функции (например, ваш бизнес не особо зависит от секьюрити-апдейтов), вам больше подойдут сборки OpenJDK от Oracle (НЕ OracleJDK), т.к. они постоянно обновляются (в течение 6 месяцев после релиза), и вы можете использовать JDK в продакшене без особых проблем. Если в вашем бизнесе задействованы облачные сервисы (или с AWS), хорошим выбором будет AWS Corretto, который уже пригоден к использованию на Amazon Linux и Docker.
AdoptOpenJDK Frequently Asked Questions
Installers
How do I get the source code for a release?
The answer to this depends on which version you are interested in. First, identify the major Java release which will be the first number after jdk in the release name. For example for jdk8u232-b09 the release is 8 for jdk-11.0.5+10 it is 11
HotSpot
Start by cloning the HotSpot codebase for the version you want. For example, replace the version number 8 with the one you want in the following repository: https://github.com/adoptopenjdk/openjdk-jdk8u
When you’ve done that, change into the directory and checkout the release name. Note for jdk9+ add an _adopt suffix:
git checkout jdk8u232-b09
git checkout jdk-11.0.8+10_adopt
See this issue for an explanation as to where that tag comes from.
Checkout the OpenJ9 «extensions» repository for the release you are interested in e.g. https://github.com/ibmruntimes/openj9-openjdk-jdk8 (Replace 8 with the major Java version you are interested in).
Then you can checkout that branch of the extensions repository e.g. git checkout openj9-0.15.1 Note that the checkout does NOT contain the underlying Java version in the OpenJ9 case.
Projects outside OpenJDK
IcedTea-WEB (WebStart support)
IcedTea-WEB is the open implementation of the Java web start component that was included in the Oracle JDK but is not part of the openjdk codebase. The IcedTea-WEB project is now hosted under the AdoptOpenJDK project in the IcedTea-WEB repository and we build and ship as a standalone download that can be used with our other OpenJDK downloads. We do not include support for Java applets as they are generally considered insecure and most modern browsers do not allow for such plugins to be installed any more.
JavaFX (OpenJFX)
Up until JDK 10, JavaFX was a part of the JDK. In 2018, Oracle decided to decouple JavaFX from the JDK. JavaFX lives on as OpenJFX, an OpenJDK subproject. As JavaFX is no longer part of OpenJDK, AdoptOpenJDK does not bundle it with its binaries. For further information, see our detailed OpenJFX FAQ.
GraalVM
While the community edition of Graal is available for all to build, we do not currently have an offering for this. Some experimental builds have been done by the team on Linux/x64, macOS and Windows though they are not currently being actively maintained
If you are an end-user of our builds, we would first recommend trying it with the latest version of the release (i.e. the latest JDK8, JDK11 etc.) as bugs are frequently fixed in the updates. If the problem still occurs with the latest one, check to see if it works with other providers’ builds (Such as Oracle’s if you can) or the upstream OpenJDK builds available via our web site.
Once you’ve done that, feel free to raise an issue in the openjdk-support repository to bring it to our attention and we will attempt to look into it if possible and determine the cause. Bear in mind that the AdoptOpenJDK team does not provide commercial support for our builds, although other providers do.
Licensing and redistribution
We fully support the notion that Java Is Still Free. The JDK and JRE binaries we produce are published under the GPLv2 with Classpath Exception and OpenJDK Assembly Exception (often referred to as GPL2+CE), and you don’t have any additional obligations imposed by the AdoptOpenJDK project beyond the terms of that license. For example, we have no additional requirement for you to reference or credit the AdoptOpenJDK project. We cannot provide legal advice, and if you have any questions about the license or exceptions you should consult your own legal counsel.
Quick-fire FAQ
Now that the trickier questions are out of the way, here are the rest of the things we get regularly asked:
Why do my fonts look weird?
Some commercial implementations of Java use relicensed Lucinda fonts but AdoptOpenJDK as a fully open implementation does not. For this reason, you may find some visible font differences between AdoptOpenJDK and other providers.
Something in the GUI isn’t rendering properly with AdoptOpenJDK but it does with other providers!
For JDK8, Oracle’s JDK used a renderer called Ductus. For JDK9 and later Oracle’s JDK and OpenJDK (and therefore AdoptOpenJDK) use the Marlin renderer. For JDK8, AdoptOpenJDK is using an open-source renderer called Pisces. This may result in differences between AdoptOpenJDK and Oracle when running JDK8. Work is planned to switch to using Marlin for JDK8
Can I get JDK Mission Control (JMC) for AdoptOpenJDK?
Yes! We provide downloads of JMC which are built through our CI
What is the difference between HotSpot and OpenJ9 downloads?
HotSpot is the default Java Virtual Machine that is included in the OpenJDK codebase. OpenJ9 is an alternative Java Virtual Machine developed by IBM for its own proprietory JVM and was open-sourced in 2017. You may find that OpenJ9 uses less memory than the HotSpot variants. Have a look at the OpenJ9 Performance Overview or the transition document for more information
What are the OpenJ9 «Large Heap» variants?
The Large Heap variants of the OpenJ9 builds (also known as the «non-compressed references builds) allow for Java heap sizes greater than 57Gb. If you need heap sizes that large, then pick the large heap versions (they have XL in the download filenames). The large heap versions are not on all platforms but the number has increased over time.
I’m worried about security vulnerabilities in your project compared to other OpenJDK implementations
The AdoptOpenJDK project does not work on security vulnerability updates independently of the community code base held at OpenJDK. For bugs including security issues, we work with the OpenJDK project to fix bugs there, and then build, test and distribute the code here. The OpenJDK LTS updates projects are working on vulnerabilities that are discussed amongst members of the OpenJDK Vulnerability Group. Patches to fix those vulnerabilities are applied to the appropriate OpenJDK repository ‘upstream’, and then we build, test and distribute the resulting binaries at AdoptOpenJDK. We do not compete with OpenJDK, we work together with them and address security vulnerabilities together.
What are the CPU and PSU updates and which do you build?
AdoptOpenJDK ships binaries based on the PSU (Patch Set Update) release for the quarterly updates. This contains additional fixes from the CPU (Critical Patch Update) and due to the very high levels of testing which the AdoptOpenJDK project runs on our release builds we are confident enough that the additional fixes in the PSU updates will not cause any problems.
How can I get commercial support for AdoptOpenJDK binaries?
The AdoptOpenJDK project does not itself provide commercial support for the binaries we produce, however, if you find an issue please raise it in the openjdk-support repository. If you need a stronger level of formal support, check out the support pages for the current list of commercial support providers for the AdoptOpenJDK binaries
Do you provide 32-bit builds?
Most of our builds are 64-bit only. The exceptions are arm32 so you can run our builds on your raspberry pi and other such devices, and HotSpot windows builds are also available in 32-bit versions. A Windows 32-bit version is also available for OpenJ9 but only for JDK8. We have had requests for 32-bit Linux/x86 but they are not available in our build farm at the moment.
So what is the TSC?
They are our overlords 🙂 Seriously, the TSC (Technical Steering Committee) is a group of people who run the AdoptOpenJDK project. Despite the name, most technical decisions are taken outside the TSC and only escalated to the TSC if issues arise. You will find that they are frequently the people responding to issues in GitHub and also in slack. Business decisions, the scope of the project, and management of finances is all done by the TSC. If you want something discussed by the TSC or need a decision from them please raise an issue in the GitHub TSC repository (or add the TSC-agenda label elsewhere) as that will generally flag it for inclusion in a future TSC meeting. The current TSC members with their affiliation are listed here. The TSC members also approve all releases.
OpenJFX FAQ
Support for JavaFX/OpenJFX is a hot topic, and we receive many questions about it. This section tries to answer the most important ones from the perspective of AdoptOpenJDK.
Does AdoptOpenJDK offer OpenJDK binaries with JavaFX support?
Are there any plans to bundle OpenJFX with AdoptOpenJDK’s binaries?
Are there any plans to build standalone binaries of OpenJFX at AdoptOpenJDK?
Why does AdoptOpenJDK not include OpenJFX?
JavaFX has been unbundled from OpenJDK and now exists as a separate project called OpenJFX with a different release schedule and support policy. Contrary to OpenJDK, there is no open-source long term support for any OpenJFX version. While OpenJDK 8 receives updates for the years to come, OpenJFX 8 is unmaintained and contains known security issues. OpenJFX 11 and newer only get patches for 6 months after their initial release. This situation makes it impossible for AdoptOpenJDK to provide high-quality, up-to-date binaries of OpenJDK LTS releases (8 and 11 at the time of writing) with a bundled OpenJFX.
As a result, we could only provide OpenJFX binaries for the most recent OpenJDK version. But because the OpenJFX project already does that itself, we want to focus our resources on OpenJDK.
What are my options if I need to run a program that uses JavaFX?
The OpenJFX project provides binaries of OpenJFX that work great together with AdoptOpenJDK. See the OpenJFX documentation for instructions on how to get started.
What are my options if I need patches or support for JavaFX 8?
There are versions of Azul Zulu and BellSoft Liberica that include JavaFX and are available free of charge. The ojdkbuild project offers JDK 8 builds with patched OpenJFX 8 overlays for Windows (sources).
What are my options if I need patches or support for OpenJFX 11 or later?
Gluon, the main contributor to OpenJFX, provides LTS support for OpenJFX 11.
There are versions of Azul Zulu and BellSoft Liberica that include JavaFX and are available free of charge.
What would be required to get AdoptOpenJDK to include OpenJFX?
If a credible interest group stepped up to provide long term support for OpenJFX that follows the release schedule of OpenJDK, we would consider bundling OpenJFX. If you want to support or sponsor such an effort, we are happy to talk: Join the #openjfx channel on the AdoptOpenJDK Slack workspace.
Разница между OpenJDK и AdoptOpenJDK
В чем разница между OpenJDK и AdoptOpenJDK?
ОТВЕТЫ
Ответ 1
Некоторые проекты OpenJDK, такие как OpenJDK 8 и OpenJDK 11, поддерживаются сообществом OpenJDK и предоставляют версии для некоторых версий OpenJDK для некоторых платформ. Члены сообщества взяли на себя ответственность за выпуск исправлений для уязвимостей в этих версиях OpenJDK.
Запись. Возможно, лучше называть сборки OpenJDK от Oracle «сборками Oracle OpenJDK».
В идеале мы бы просто называли все сборки Oracle JDK «Oracle JDK, «под лицензией GPL или коммерческой лицензией в зависимости от вашего ситуация. Однако по историческим причинам различия существуют, мы будем называть их отдельно как оракулы OpenJDK строит и Oracle JDK.
Поставщики OpenJDK и их сравнение
Какой дистрибутив Java я должен использовать?
В дни Sun/Oracle обычно Sun/Oracle создавала проприетарные нисходящие дистрибутивы JDK на основе источников OpenJDK. Недавно Oracle решила делать собственные проприетарные сборки только с коммерческой поддержкой. Они любезно публикуют сборки OpenJDK и на своем https://jdk.java.net/ сайте.
Начиная с JDK 11, происходит переход от мышления одного поставщика (Oracle) к мышлению, при котором вы выбираете поставщика, который дает вам дистрибутив для продукта, в условиях, которые вам нравятся: платформы, для которых они создаются, частота/быстрота выпусков как устроена поддержка и т.д. Если вы не доверяете ни одному из существующих поставщиков, вы даже можете создать OpenJDK самостоятельно.
Если ни одна среда (например, Linux) и/или лицензионное требование не определяют конкретный дистрибутив и если вам нужна самая стандартная сборка JDK, то, вероятно, лучшим вариантом будет использование OpenJDK от Oracle или AdoptOpenJDK.
Дополнительная информация
Java все еще бесплатна сообществом Java Champions (опубликовано 17 сентября 2018 г.)
Java все еще бесплатна 2.0.0 сообществом Java Champions (опубликовано 3 марта 2019 г.)
Алексей Шипилев об интервью JDK Опсиана (опубликовано 27 июня 2019 г.)
Разница между OpenJDK и AdoptOpenJDK
В чем разница между OpenJDK и AdoptOpenJDK?
ОТВЕТЫ
Ответ 1
Некоторые проекты OpenJDK, такие как OpenJDK 8 и OpenJDK 11, поддерживаются сообществом OpenJDK и предоставляют версии для некоторых версий OpenJDK для некоторых платформ. Члены сообщества взяли на себя ответственность за выпуск исправлений для уязвимостей в этих версиях OpenJDK.
Запись. Возможно, лучше называть сборки OpenJDK от Oracle «сборками Oracle OpenJDK».
В идеале мы бы просто называли все сборки Oracle JDK «Oracle JDK, «под лицензией GPL или коммерческой лицензией в зависимости от вашего ситуация. Однако по историческим причинам различия существуют, мы будем называть их отдельно как оракулы OpenJDK строит и Oracle JDK.
Поставщики OpenJDK и их сравнение
Какой дистрибутив Java я должен использовать?
В дни Sun/Oracle обычно Sun/Oracle создавала проприетарные нисходящие дистрибутивы JDK на основе источников OpenJDK. Недавно Oracle решила делать собственные проприетарные сборки только с коммерческой поддержкой. Они любезно публикуют сборки OpenJDK и на своем https://jdk.java.net/ сайте.
Начиная с JDK 11, происходит переход от мышления одного поставщика (Oracle) к мышлению, при котором вы выбираете поставщика, который дает вам дистрибутив для продукта, в условиях, которые вам нравятся: платформы, для которых они создаются, частота/быстрота выпусков как устроена поддержка и т.д. Если вы не доверяете ни одному из существующих поставщиков, вы даже можете создать OpenJDK самостоятельно.
Если ни одна среда (например, Linux) и/или лицензионное требование не определяют конкретный дистрибутив и если вам нужна самая стандартная сборка JDK, то, вероятно, лучшим вариантом будет использование OpenJDK от Oracle или AdoptOpenJDK.
Дополнительная информация
Java все еще бесплатна сообществом Java Champions (опубликовано 17 сентября 2018 г.)
Java все еще бесплатна 2.0.0 сообществом Java Champions (опубликовано 3 марта 2019 г.)
Алексей Шипилев об интервью JDK Опсиана (опубликовано 27 июня 2019 г.)
Руководство по возможностям Java версий 8-16
Вы можете использовать это руководство, чтобы получить практическую информацию о том, как найти и установить последнюю версию Java, понять различия между дистрибутивами Java (AdoptOpenJdk, OpenJDK, OracleJDK и т. д.), а также получить обзор функций языка Java, включая версии 8-16.
Вашему вниманию предлагается обновленная версия руководства от 05 апреля 2021 г.
Практическая информация
Во-первых, давайте рассмотрим некоторые общие практические вопросы, которые возникают у людей, пытающихся выбрать правильную версию Java для своего проекта.
TL; DR Мне нужна только ссылка для скачивания, и я знаю обо всем остальном. Куда мне следует идти?
Перейдите на сайт AdoptOpenJDK, выберите последнюю версию Java, загрузите и установите ее. Затем вернитесь к этому руководству, чтобы, возможно, еще кое-что узнать о версиях Java.
TL;DR (англ. too long; didn’t read — слишком длинно, не читал)
Какая последняя версия Java?
По состоянию на март 2021 года Java 16 является последней выпущенной версией Java.
Какую версию Java мне следует использовать?
Поскольку выходит так много новых версий, существуют в действительности имеются следующие сценарии использования:
Унаследованные проекты в компаниях часто застревают на Java 8 (см. раздел «Почему компании все еще застревают на Java 8?» ниже). Следовательно, вы также будете вынуждены использовать Java 8.
Если вы убедитесь, что используете самые последние IDE, фреймворки и инструменты сборки и начинаете новый проект, вы можете без колебаний использовать Java 11 (LTS) или даже последнюю версию Java 16.
Есть специальная область разработки Android, где версия Java в основном застряла на Java 7 с с доступом к определенному набору функций Java 8. Но вы можете переключиться на использование языка программирования Kotlin.
Почему компании все еще застряли на Java 8?
Есть несколько причин, по которым компании все еще придерживаются Java 8. Вот некоторые из них:
Инструменты сборки (Maven, Gradle и т. д.) и некоторые библиотеки изначально содержали ошибки с версиями Java > 8 и нуждались в обновлениях. Даже сегодня, например, с Java9+, некоторые инструменты сборки выводят предупреждения «reflective access» при сборке проектов Java, которые просто «кажутся не готовыми», даже если сборки в порядке.
Некоторые компании придерживаются политики использования только LTS-версий и полагаются на поставщиков своих ОС, которые предоставят им эти сборки, что требует времени.
Подводя итог: у вас есть сочетание практических вопросов (обновление ваших инструментов, библиотек, фреймворков) и политических проблем.
Почему некоторые версии Java, например 8, также называются 1.8?
Это просто означает Java 8. С переходом к основанным на времени выпускам с Java 9 схема именования также изменилась, и версии Java больше не имеют префикса 1.x. Теперь номер версии выглядит так:
В чем разница между версиями Java?
Должен ли я изучать конкретную?
Придя из других языков программирования с большими перерывами между выпусками, как, например, Python 2–3, вы можете спросить, применимо ли то же самое к Java.
Очевидно, что это не работает наоборот, скажем, ваша программа полагается на функции Java 14, которые просто недоступны в JVM Java 8.
Это означает несколько вещей:
Вы не просто «изучаете» конкретную версию Java, например 12.
Скорее, вы получите хорошую основу для всех языковых функций вплоть до Java 8. Это послужит хорошей базой.
И затем, из этого руководства вы можете узнать, какие дополнительные функции появились в Java 9-16, чтобы использовать их всегда, когда это возможно.
Каковы примеры этих новых возможностей новых версий Java?
Взгляните на раздел «Возможности Java 8-16» ниже.
Но, как правило: старые, более длинные циклы выпуска (3-5 лет, вплоть до Java 8) означали множество новых функций в каждом выпуске.
Шестимесячный цикл выпуска означает меньшее количество функций на выпуск, поэтому вы можете быстро освоить языковые функции Java 9-16.
В чем разница между 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 на свой компьютер, — это разархивировать файл jdk-<5-16>.zip. Вам даже не нужны права администратора для этого.
Ваш распакованный файл Java будет выглядеть так:
Магия происходит в каталоге /bin, который в Windows выглядит следующим образом:
Поэтому все, что вам нужно сделать, это разархивировать этот файл и поместить каталог /bin в переменную PATH, чтобы вы могли вызывать команду java из любого места.
В случае, если вам интересно, установщики с графическим интерфейсом, такие как Oracle или AdoptOpenJDK, выполняет распаковку и изменение переменной PATH вместо вас.
Дистрибутивы Java
Есть множество сайтов, предлагающих загрузки Java (читай: JDK), и неясно, «кто что предлагает и с какими лицензиями». Этот раздел прольет на это некоторый свет.
Проект OpenJDK
Что касается исходного кода Java (читайте: исходный код для вашего JRE / JDK), существует только один, живущий на сайте проекта OpenJDK.
Вот почему на практике есть несколько поставщиков, которые фактически создают эти сборки, сертифицируют (см. TCK) и затем распространяют их.
И хотя поставщики не могут, скажем, удалить метод из класса String перед созданием новой сборки Java, они могут добавить брэндинг (вay!) или добавить некоторые другие утилиты (например, CLI), которые они считают полезными. Но в остальном исходный код одинаков для всех дистрибутивов Java.
Сборки OpenJDK (от Oracle) и OracleJDK
Один из поставщиков, который создает Java из исходного кода, — это Oracle. Это приводит к двум разным дистрибутивам Java, что поначалу может казаться очень запутанными.
Сборки OpenJDK от Oracle (!). Эти сборки бесплатны и не имеют торговой марки, но Oracle не выпустит обновления для более старых версий, скажем, Java 15, как только выйдет Java 16.
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, а также SapMachine и многие другие. Упрощенно говоря, различия сводятся к тому, что у вас есть различные варианты поддержки/ гарантии обслуживания.
Но не забудьте проверить на сайтах дистрибьюторов, чтобы узнать о преимуществах каждого отдельного дистрибутива.
Полный обзор дистрибутива OpenJDK
Рафаэль Винтерхальтер (Rafael Winterhalter) собрал большой список всех доступных сборок OpenJDK, включая их описания: ОС, архитектуру, окна лицензирования, поддержки и обслуживания.
Рекомендация
Повторим с еще раз, что с 2020 года, если у вас нет особых требований, найдите файл jdk.zip (.tar.gz/.msi/.pkg) по адресу https://adoptopenjdk.net или выберите пакет, предоставленный вашим поставщиком ОС.
Возможности Java 8-16
Как уже упоминалось в самом начале этого руководства: в сущности все (если вы не будьте слишком требовательны) функции языка Java 8 работают в Java 14. То же самое касается всех других версий Java между ними.
В свою очередь, это означает, что знание всех языковых возможностей Java 8 создает хорошую базу в изучении Java, а все остальные версии (Java 9-16) в значительной степени дают дополнительные функции поверх этого базового уровня.
Вот краткий обзор того, что конкретные версии могут предложить:
Java 8 была массовым выпуском, и вы можете найти список всех функций на веб-сайте Oracle. Здесь я хотел бы упомянуть два основных набора функций:
Особенности языка: лямбды и т. д.
До Java 8 всякий раз, когда вы хотели создать экземпляр, например, нового Runnable, вы должны были написать анонимный внутренний класс, например, так:
С лямбдами тот же код выглядит так:
Вы также получили ссылки на методы, повторяющиеся аннотации, методы по умолчанию для интерфейсов и некоторые другие языковые функции.
Коллекции и потоки
В Java 8 вы также получили операции в функциональном стиле для коллекций, также известные как Stream API. Живой пример:
До Java 8, вам нужно было написать циклы for, чтобы что-то сделать с этим списком.
С помощью API Streams вы можете сделать следующее:
Если вы хотите больше практики на Java 8
Очевидно, что в рамках этого руководства я могу только дать краткий обзор каждого недавно добавленного Stream, Lambda или Optional метода в Java 8.
Если вам нужен более детальный, подробный обзор, включая упражнения, вы можете ознакомиться с моим курсом по основным функциям Java 8.
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 (кстати, отличные библиотеки!).
Project Jigsaw: модули Java и файлы Jar с несколькими выпусками
В Java 9 появилась система модулей Jigsaw, которая чем-то напоминает старую добрую спецификацию OSGI. Подробное описание Jigsaw не входит в задачи данного руководства — посмотрите предыдущие ссылки, чтобы узнать больше.
Если вы хотите больше практиковаться в Java 9
Опять же, это всего лишь краткий обзор функций Java 9, и если вам нужны более подробные объяснения и упражнения, ознакомьтесь с курсом основных функций Java 9.
Вывод типа локальной переменной: ключевое слово var
Чувствуете себя как в Javascript-е, не так ли? Однако Java все еще строго типизирован и var применяется только к переменным внутри методов (спасибо, dpash, за то, что снова указали на это).
Java 11 также была несколько меньшей версией с точки зрения разработчика.
Строки и файлы
Строки и файлы получили пару новых методов (здесь перечислены не все):
Запустить исходные файлы
Начиная с Java 10, вы можете запускать исходные файлы Java без предварительной их компиляции. Шаг к написанию сценариев.
Вывод типа локальной переменной (var) для лямбда-параметров
В заголовке сказано все:
HttpClient
HttpClient из Java 9 в его последней, не предварительной версии.
Другие вкусности
Flight Recorder (Регистратор полетов), сборщик мусора No-Op, Nashorn-Javascript-Engine объявлен deprecated (устаревшим) и т.д.
В Java 12 появилось несколько новых функций и исправлений, но здесь стоит упомянуть только поддержку Unicode 11 и предварительный просмотр нового выражения switch, которое вы увидите в следующем разделе.
Вы можете найти полный список возможностей здесь, но, по сути, вы получаете поддержку Unicode 12.1, а также две новые или улучшенные превью функции (могут быть изменены в будущем):
Switch выражение (Preview — предварительная версия)
Switch выражения теперь могут возвращать значение. И вы можете использовать лямбда-стиль синтаксиса для своих выражений, без проблем с ошибками:
Старые операторы switch выглядели так:
В то время как в Java 13 операторы switch могут выглядеть так:
Многострочные строки (предварительная версия)
Наконец-то, вы можете сделать это на Java:
Java 14 и далее
Switch выражения (стандартное)
Switch выражения, которые были превью функцией в версиях 12 и 13, теперь стандартизированы.
В настоящее время существуют классы Records (записей), которые помогают облегчить задачу написания большого количества шаблонов с использованием Java.
Взгляните на этот класс до Java 14, который содержит только данные, (потенциально) методы получения / установки, equals / hashcode, toString.
С записями теперь это можно записать так:
Опять же, это предварительная версия, которая может быть изменена в будущих выпусках.
Полезные исключения NullPointerExceptions
Наконец, исключения NullPointerExceptions описывают, какая именно переменная имела значение NULL.
Сопоставление с образцом для InstanceOf (предварительная версия)
Раньше вам приходилось выполнять cast ваших объектов внутри instanceof следующим образом:
Теперь вы можете сделать это, эффективно сбросив гипс.
Инструмент для упаковки (инкубатор)
Существует инструмент jpackage (инкубатор), который позволяет упаковать ваше Java-приложение в пакеты для конкретной платформы, включая все необходимые зависимости.
Сборщики мусора
Сборщик мусора Concurrent Mark Sweep (CMS) был удален, и был добавлен экспериментальный сборщик мусора Z.
Java 15
Текстовые блоки / многострочные строки
Представленные в качестве экспериментальной функции в Java 13 (см. Выше), многострочные тексты теперь готовы к работе.
Если вы когда-либо хотели иметь еще более четкое представление о том, кому разрешено создавать подклассы ваших классов, теперь есть такая sealed функция.
Записи и сопоставление с образцом
Функции Records и Pattern Matching из Java 14 (см. Выше) все еще находятся в предварительной версии и еще не доработаны.
Движок JavaScript Rhinoceros
После устаревания в Java 11 механизм Nashorn Javascript Engine был окончательно удален в JDK 15.
ZGC: готово к продакшн
Z Garbage Collector не маркирован экспериментальное больше. Теперь он готов к использованию в продакшн.
Java 16
Каналы сокетов домена Unix
Теперь вы можете подключаться к сокетам домена Unix (также поддерживаются macOS и Windows (10+).
Планируемая замена JNI (Java Native Interface), позволяющая выполнять привязку к собственным библиотекам (подумайте о C).
Записи и сопоставление с образцом
Запечатанные классы
Запечатанные классы (начиная с Java 15, см. Выше) все еще находятся в предварительной версии.
Java 17 и новее
Будет рассмотрено здесь, как только они будут выпущены. Зайдите в ближайшее время.
Заключение
К настоящему времени у вас должен быть довольно хорошее представление о нескольких вещах:
Как установить Java, какую версию получить и где ее получить (подсказка: AdoptOpenJDK).
Что такое дистрибутив Java, какие существуют и в чем различия.
Каковы различия между конкретными версиями Java.
Отзывы, исправления и ваш вклад всегда приветствуются! Просто оставьте комментарий внизу.
Спасибо за прочтение!
Благодарности
Стивен Колеборн, написал фантастическую статью о различных доступных дистрибутивах Java.