История версий Java


Языка Java претерпел несколько изменений с JDK  1.0, а также многочисленных добавлений классов и пакетов в стандартной библиотеке . Начиная с J2SE 1.4, развитие языка Java регулируется процессом сообщества Java (JCP), который использует запросы спецификации Java (JSR) для предложения и определения дополнений и изменений в платформе Java . Язык указан в спецификации языка Java (JLS); изменения в JLS управляются под JSR 901 .

Помимо языковых изменений, за прошедшие годы в библиотеку классов Java были внесены и другие изменения , которые выросли с нескольких сотен классов в JDK 1.0 до более трех тысяч в J2SE 5. Полностью новые API , такие как Swing и Java2D , были введены, и многие из исходных классов и методов JDK 1.0 устарели . Некоторые программы позволяют преобразовывать программы Java из одной версии платформы Java в более старую (например, Java 5.0, перенесенная на 1.4) (см. Инструменты резервного копирования Java ).

Что касается плана поддержки Oracle Java SE, [1] версия 11 является поддерживаемой в настоящее время версией долгосрочной поддержки (LTS) вместе с Java 8 LTS, в которой клиенты Oracle получат поддержку Oracle Premier. Последнее бесплатное общедоступное обновление программного обеспечения Java 8 LTS для коммерческого использования было выпущено Oracle в январе 2019 года, в то время как Oracle продолжает выпускать бесплатные общедоступные обновления Java 8 для разработки [1] и личного использования на неопределенный срок. [2] Поддержка Java 10, ранее поддерживавшейся версии быстрого выпуска, закончилась в сентябре 2018 г., в тот же день, когда началась поддержка Java 11. Java 7 больше не поддерживается публично. Для Java 11 долгосрочная поддержка Oracle не будет предоставляться общественности; вместо этого ожидается , что более широкое сообщество OpenJDK , такое как AdoptOpenJDK или другие, выполнит эту работу. [3]

Общая доступность Java 16 состоялась 16 марта 2021 г., и Java 17 сейчас также находится в разработке. [4]

В сентябре 2017 года Марк Рейнхольд, главный архитектор платформы Java, предложил изменить последовательность выпусков на «один выпуск функции каждые шесть месяцев» вместо текущего двухлетнего графика [9] [10], и позже предложение вступило в силу. .

Первая версия была выпущена 23 января 1996 года. [11] [12] Первая стабильная версия, JDK 1.0.2, называется Java 1. [12]

Основные дополнения к выпуску от 19 февраля 1997 г. включали: [13]

Codename Playground

Выпуск от 8 декабря 1998 г. и последующие выпуски через J2SE 5.0 были ретроспективно переименованы в Java 2, а название версии «J2SE» ( Java 2 Platform, Standard Edition ) заменило JDK, чтобы отличить базовую платформу от J2EE ( Java 2 Platform, Enterprise Edition ) и J2ME ( платформа Java 2, Micro Edition ). Это был очень важный выпуск Java, поскольку он утроил размер платформы Java до 1520 классов в 59 пакетах. Основные дополнения включали: [15]

  • strictfp ключевое слово
  • Качели графический API был интегрирован в основные классы
  • JVM Sun был оснащен JIT компилятором в первый раз
  • Плагин Java
  • Java IDL , реализация IDL для взаимодействия с CORBA
  • Рамки коллекций

Кодовое имя пустельга

Наиболее заметными изменениями в версии от 8 мая 2000 г. были: [16] [17]

  • Включена JVM HotSpot (JVM HotSpot была впервые выпущена в апреле 1999 г. для J2SE 1.2 JVM)
  • RMI был изменен для поддержки дополнительной совместимости с CORBA.
  • Интерфейс именования и каталогов Java (JNDI) включен в основные библиотеки (ранее был доступен как расширение)
  • Архитектура отладчика платформы Java (JPDA)
  • JavaSound
  • Синтетические прокси-классы

Кодовое имя Мерлин

Выпуск от 6 февраля 2002 г. был первым выпуском платформы Java, разработанной в рамках процесса сообщества Java как JSR 59 . Основные изменения включали: [18] [19]

  • Изменения языка
    • assertключевое слово (указано в JSR 41 )
  • Улучшения библиотеки
    • Регулярные выражения, смоделированные на основе регулярных выражений Perl
    • Цепочка исключений позволяет исключению инкапсулировать исходное исключение нижнего уровня
    • Поддержка интернет-протокола версии 6 ( IPv6 )
    • Неблокирующий ввод-вывод (Java) (с именем NIO) (указан в JSR 51 )
    • Logging API (указано в JSR 47 )
    • API ввода-вывода изображений для чтения и записи изображений в таких форматах, как JPEG и PNG.
    • Интегрированный синтаксический анализатор XML и процессор XSLT ( JAXP ) (указанный в JSR 5 и JSR 63 )
    • Встроенные расширения безопасности и криптографии ( JCE , JSSE , JAAS )
    • Включена Java Web Start (Java Web Start впервые была выпущена в марте 2001 года для J2SE 1.3) (указана в JSR 56 )
    • API настроек ( java.util.prefs)

Публичная поддержка и обновления безопасности для Java 1.4 закончились в октябре 2008 года. Платные обновления безопасности для клиентов Oracle закончились в феврале 2013 года. [20]

Кодовое имя Тигр

Релиз от 30 сентября 2004 г. изначально имел номер 1.5, который до сих пор используется в качестве внутреннего номера версии. Номер был изменен на «лучше отражает уровень зрелости, стабильности, масштабируемости и безопасности J2SE». [21] Эта версия была разработана под JSR 176 .

J2SE 5.0 вступил в период окончания периода публичных обновлений 8 апреля 2008 г .; с 3 ноября 2009 г. обновления больше не доступны для широкой публики. Обновления были доступны для платных клиентов Oracle до мая 2015 г. [1]

Tiger добавил ряд важных новых языковых функций: [22] [23]

  • Generics : обеспечивает безопасность типов во время компиляции (статическую) для коллекций и устраняет необходимость в большинстве типов (преобразование типов) (определяется JSR 14 )
  • Метаданные : также называемые аннотациями ; позволяет помечать языковые конструкции, такие как классы и методы, с дополнительными данными, которые затем могут обрабатываться утилитами, поддерживающими метаданные (указанными в JSR 175 )
  • Autoboxing / unboxing: автоматические преобразования между примитивными типами (такими как int) и примитивными классами-оболочками (такими как Integer) (заданными JSR 201 )
  • Перечисления : enumключевое слово создает типизированный , упорядоченный список значений (например Day.MONDAY, Day.TUESDAYи т.д.); ранее это могло быть достигнуто только с помощью нетипизированных постоянных целых чисел или вручную созданных классов (шаблон типизированного перечисления) (указанный в JSR 201 )
  • Varargs : последний параметр метода теперь может быть объявлен с использованием имени типа, за которым следует три точки (например void drawtext(String... lines)); в вызывающем коде может использоваться любое количество параметров этого типа, и затем они помещаются в массив для передачи методу, или, альтернативно, вызывающий код может передать массив этого типа.
  • Расширенный for eachцикл: forсинтаксис цикла расширен специальным синтаксисом для перебора каждого члена массива или любого Iterable, например стандартных Collectionклассов (указанных в JSR 201 )
  • Улучшена семантика выполнения многопоточных программ Java; новая модель памяти Java решает проблемы сложности, эффективности и производительности предыдущих спецификаций [24]
  • Статический импорт

Также были внесены следующие улучшения в стандартные библиотеки:

  • Автоматическая генерация заглушки для объектов RMI
  • Swing : новый внешний вид с возможностью смены скинов , называемый синтезатором.
  • В параллельности утилиты в пакете [25]java.util.concurrent
  • Класс сканера для анализа данных из различных входных потоков и буферов

Java 5 - это последний выпуск Java, официально поддерживающий Microsoft Windows 98 и Windows ME , [26] в то время как Windows Vista была новейшей версией Windows, на которой J2SE 5 поддерживалась до того, как Java 5 закончился в октябре 2009 года. . [20]

Java 5 Update 5 (1.5.0_05) - это последний выпуск Java, работающий в Windows 95 (с установленным Internet Explorer 5.5 ) и Windows NT 4.0 . [27]

Java 5 была впервые доступна в Apple Mac OS X 10.4 (Tiger) [28] и была версией Java по умолчанию, установленной в Apple Mac OS X 10.5 (Leopard).

Публичная поддержка и обновления безопасности для Java 1.5 закончились в ноябре 2009 года. Платные обновления безопасности для клиентов Oracle закончились в апреле 2015 года.

Изменение версий

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

Оба номера версии «1.5.0» и «5.0» используются для обозначения этого выпуска Java 2 Platform Standard Edition. Версия «5.0» - это версия продукта, а «1.5.0» - версия для разработчика. Число «5.0» используется для лучшего отражения уровня зрелости, стабильности, масштабируемости и безопасности J2SE.

-  Версия 1.5.0 или 5.0?[29]

Это соответствие продолжалось и в более поздних выпусках (Java 6 = JDK 1.6, Java 7 = JDK 1.7 и т. Д.).

Обновления Java 5

Кодовое имя Мустанг

В версии, выпущенной 11 декабря 2006 года, Sun заменила имя «J2SE» на Java SE и удалила «.0» из номера версии. [47] Внутренняя нумерация для разработчиков остается 1.6.0. [48]

Эта версия была разработана под JSR 270 .

На этапе разработки новые сборки, включая улучшения и исправления ошибок, выпускались примерно еженедельно. Бета-версии были выпущены в феврале и июне 2006 г., а окончательный выпуск состоялся 11 декабря 2006 г.

Основные изменения, внесенные в эту версию: [49] [50]

  • Прекращена поддержка старых версий Win9x; неофициально Java 6 Update 7 была последней версией Java, работающей с этими версиями Windows. [ необходима цитата ] Это считается [ кем? ] в связи с крупными изменениями в обновлении 10.
  • Поддержка языка сценариев ( JSR 223 ): общий API для тесной интеграции с языками сценариев и встроенная интеграция Mozilla JavaScript Rhino .
  • Значительные улучшения производительности базовой платформы [51] [52] и Swing .
  • Улучшенная поддержка веб-сервисов через JAX-WS ( JSR 224 ).
  • Поддержка JDBC 4.0 ( JSR 221 ).
  • Java Compiler API ( JSR 199 ): API, позволяющий Java-программе выбирать и вызывать Java-компилятор программно.
  • Обновление JAXB до версии 2.0: включая интеграцию парсера StAX .
  • Поддержка подключаемых аннотаций ( JSR 269 ). [53]
  • Многие улучшения графического интерфейса , такие как интеграция SwingWorker в API, сортировка и фильтрация таблиц и настоящая двойная буферизация Swing (устранение эффекта серой зоны).
  • Улучшения JVM включают: оптимизацию синхронизации и производительности компилятора , новые алгоритмы и обновления существующих алгоритмов сборки мусора , а также производительность запуска приложений.

Java 6 можно установить в Mac OS X 10.5 (Leopard), работающем на компьютерах с 64-разрядными процессорами (Core 2 Duo и выше). [54] Java 6 также поддерживается как 32-битными, так и 64-битными машинами под управлением Mac OS X 10.6 (Snow Leopard).

Срок поддержки Java 6 подошел к концу в феврале 2013 года, когда все общедоступные обновления, включая обновления безопасности, должны были быть остановлены. [55] [56] Oracle выпустила еще два обновления для Java 6 в марте и апреле 2013 года, в которых были исправлены некоторые уязвимости системы безопасности. [57] [58]

Обновления Java 6

После выпуска Java 6 Sun, а затем Oracle выпустили несколько обновлений, которые, хотя и не изменили общедоступный API, улучшили удобство использования конечным пользователем или исправили ошибки. [59]

Java SE 7

Java 7 (кодовое имя Dolphin [137] ) - это крупное обновление, которое было выпущено 7 июля 2011 г. [138] и стало доступным для разработчиков 28 июля 2011 г. [139] Период разработки был разбит на тринадцать этапов; 6 июня 2011 года завершился последний из тринадцати этапов. [139] [140] В среднем за один этап выпускалось 8 сборок (которые обычно включали улучшения и исправления ошибок). В списке возможностей проекта OpenJDK 7 перечислены многие изменения.

Дополнения в Java 7 включают: [141]

  • Поддержка JVM для динамических языков с новым invokedynamicбайт-кодом под JSR-292, [142] после работы над прототипом, которая в настоящее время выполняется на многоязыковой виртуальной машине
  • Сжатые 64-битные указатели [143] (доступны в Java 6 с -XX:+UseCompressedOops) [144]
  • Эти небольшие языковые изменения (сгруппированы в рамках проекта под названием Coin): [145]
  • Строки в переключателе [146]
  • Автоматическое управление ресурсами в инструкции try [147]
  • Улучшенный вывод типа для создания универсального экземпляра, также известного как ромбовидный оператор <> [148]
  • Упрощенное объявление метода varargs [149]
  • Целочисленные двоичные литералы [150]
  • Разрешение подчеркивания в числовых литералах [151]
  • Перехват нескольких типов исключений и повторное генерирование исключений с улучшенной проверкой типов [152]
  • Утилиты параллелизма под JSR 166 [153]
  • Новая библиотека файлового ввода-вывода (определенная JSR 203), добавляющая поддержку нескольких файловых систем, метаданных файлов и символических ссылок. Новые пакеты java.nio.file, java.nio.file.attributeи java.nio.file.spi[154] [155]
  • Timsort используется для сортировки коллекций и массивов объектов вместо сортировки слиянием.
  • Поддержка на уровне библиотеки алгоритмов криптографии с эллиптическими кривыми
  • XRender трубопровод для Java 2D, что улучшает управляемость возможностей , характерных для современных графических процессоров
  • Новые API платформы для графических функций, изначально реализованные в версии 6u10 как неподдерживаемые API [156]
  • Расширенная поддержка на уровне библиотеки новых сетевых протоколов, включая SCTP и протокол Sockets Direct.
  • Upstream обновления XML и Unicode
  • Наборы правил развертывания Java [157]

Lambda (реализация лямбда-функций в Java), Jigsaw (реализация модулей в Java ) и часть Coin были исключены из Java 7 и выпущены как часть Java 8 (за исключением Jigsaw , выпущенного в Java 9). [158] [159]

Java 7 была версией по умолчанию для загрузки на java.com с апреля 2012 года до выпуска Java 8. [160]

Обновления Java 7

Oracle выпускала общедоступные обновления для семейства Java 7 ежеквартально [161] до апреля 2015 года, когда продукт достиг конца своей публичной доступности. [162] Дальнейшие обновления для JDK 7, которые планируется продлить до июля 2022 года, доступны только для клиентов с контрактом на поддержку. [163]

Java 8 была выпущена 18 марта 2014 г. [230] [231] и включала некоторые функции, которые были запланированы для Java 7, но позже отложены. [232]

Работа над функциями была организована в рамках предложений по расширению JDK (JEP) . [233]

  • JSR 335, JEP 126: поддержка на уровне языка лямбда-выражений (официально лямбда-выражения; неофициально - замыкания ) в рамках проекта Lambda [234] и методов по умолчанию (методы виртуального расширения ) [235] [236] [237], которые позволяют добавлять методов для интерфейсов без нарушения существующих реализаций. В сообществе Java продолжались дискуссии о том, следует ли добавлять поддержку лямбда-выражений. [238] [239] Sun позже объявила, что лямбда-выражения будут включены в Java, и попросила сообщество внести вклад в улучшение этой функции. [240] Поддержка лямбда-выражений также позволяет выполнять операции в функциональном стиле с потоками элементов, такие как преобразования коллекций в стиле MapReduce . Методы по умолчанию позволяют автору API добавлять новые методы в интерфейс, не нарушая старый код, используя его. Хотя это не было их основной целью, [235] методы по умолчанию также допускают множественное наследование поведения (но не состояния).
  • JSR 223, JEP 174: Project Nashorn , среда выполнения JavaScript, которая позволяет разработчикам встраивать код JavaScript в приложения.
  • JSR 308, JEP 104: Аннотация к типам Java [241]
  • Беззнаковая целочисленная арифметика [242]
  • JSR 337, JEP 120: повторяющиеся аннотации [243]
  • JSR 310, JEP 150: API даты и времени [244]
  • JEP 178: Статически связанные библиотеки JNI [245]
  • JEP 153: Запуск приложений JavaFX (прямой запуск JAR-файлов приложений JavaFX) [246]
  • JEP 122: Удалить постоянное поколение [247]

Java 8 не поддерживается в Windows XP [248], но после обновления 25 для JDK 8 ее можно установить и запустить под Windows XP. [249] Предыдущие обновления JDK 8 можно было запустить под XP, загрузив заархивированный файл в формате zip и разархивировав его для исполняемого файла. Последней версией Java 8, которая могла работать на XP, является обновление 251. Но совместимость его компонентов начинает нарушаться при неподдерживаемых ОС в самом начале разработки обновлений Java 8.

С октября 2014 года Java 8 была версией по умолчанию для загрузки (а затем снова для загрузки, заменяющей Java 9) с официального сайта. [250] «Oracle будет продолжать предоставлять публичные обновления и автоматические обновления Java SE 8 бессрочно для личных пользователей». [2]

Обновления Java 8

Java SE 9 была доступна 21 сентября 2017 г. [302] из-за неоднозначного принятия текущей реализации Project Jigsaw Исполнительным комитетом Java [303], что привело к тому, что Oracle исправила некоторые нерешенные проблемы и проблемы, а также уточнила некоторые критические технические вопросы. В последние дни июня 2017 года Java Community Process практически единодушно согласился с предложенной схемой модульной системы. [304]

  • JSR 376: Модуляризация JDK в рамках Project Jigsaw ( система модулей платформы Java ) [159]
  • JavaDB был удален из JDK [305]
  • СЭП 193: Переменные ручки : определить стандартные средства для вызова эквивалентов различных java.util.concurrent.atomicи sun.misc.Unsafeопераций
  • JEP 213: Milling Project Coin : разрешить @SafeVarargs для методов частного экземпляра; Разрешить использование переменных с эффективным окончанием в качестве ресурсов в операторе try-with-resources; Разрешить ромб с анонимными классами, если тип аргумента предполагаемого типа является обозначаемым; Завершите удаление, начатое в Java SE 8, подчеркивания из набора имен допустимых идентификаторов; Поддержка частных методов в интерфейсах
  • JEP 222: jshell: оболочка Java (цикл чтения-вычисления-печати) : JShell - это интерфейс командной строки REPL для языка Java. [306]
  • JEP 254: Компактные струны
  • JEP 263: Графика HiDPI: автоматическое масштабирование и изменение размера
  • СЭП 266: Больше обновления параллелизма : Она включает в себя реализацию Java в Reactive Streams , [307] в том числе нового Flowкласса [308] , который включал интерфейсы ранее предоставленные Reactive Streams [309]
  • JEP 268: XML-каталоги
  • JEP 282: jlink: Java Linker : создание инструмента, который может собирать и оптимизировать набор модулей и их зависимости в настраиваемый образ времени выполнения. Это эффективно позволяет создать полностью пригодный для использования исполняемый файл, включая JVM для его запуска.
  • JEP 295: Опережающая компиляция : опережающая компиляция, предоставляемая GraalVM .

Первый кандидат на выпуск Java 9 был выпущен 9 августа 2017 года. [310] Первый стабильный выпуск Java 9 был выпущен 21 сентября 2017 года. [311]

История

На JavaOne 2011 Oracle обсудила функции, которые они надеются выпустить для Java 9 в 2016 году. [312] Java 9 должна включать лучшую поддержку многогигабайтных куч, лучшую интеграцию с собственным кодом, другой сборщик мусора по умолчанию ( G1 , для «более короткого времени ответа» ") [313] и самонастраивающаяся JVM. [314] В начале 2016 года выпуск Java 9 был перенесен на март 2017 года [315], а позже снова отложен еще на четыре месяца до июля 2017 года. [316]

Обновления Java 9

OpenJDK 10 был выпущен 20 марта 2018 года с подтвержденными двенадцатью новыми функциями. [320] Среди этих функций были:

  • JEP 286: Вывод типа локальной переменной
  • JEP 296: объединить лес JDK в единый репозиторий
  • JEP 304: Интерфейс сборщика мусора
  • JEP 307: полный параллельный сборщик мусора для G1
  • JEP 310: Совместное использование данных классов приложений
  • JEP 312: локальные рукопожатия потока
  • JEP 313: удалить инструмент создания собственных заголовков (javah)
  • JEP 314: Дополнительные расширения тегов языка Unicode
  • JEP 316: Распределение кучи на альтернативных устройствах памяти
  • JEP 317: экспериментальный JIT-компилятор на основе Java
  • JEP 319: корневые сертификаты
  • JEP 322: Управление версиями релизов по времени

Первый из этих выводов типа локальной переменной JEP 286 позволяет использовать varключевое слово для локальных переменных с фактическим типом, вычисленным компилятором. Итак, мы можем сделать

var  list  =  new  ArrayList < String > ();  // выводит ArrayList  var  stream  =  list . поток ();  // выводит Stream 

Обновления Java 10

JDK 11 был выпущен 25 сентября 2018 г., и в настоящее время эта версия открыта для исправления ошибок. Он предлагает LTS или долгосрочную поддержку. Среди прочего, Java 11 включает ряд новых функций, таких как: [326]

  • JEP 181: Контроль доступа на основе гнезд
  • JEP 309: динамические константы файлов классов
  • JEP 315: Улучшение встроенных функций Aarch64
  • JEP 318: Эпсилон: сборщик мусора без использования
  • JEP 320: удаление модулей Java EE и CORBA
  • JEP 321: HTTP-клиент (стандартный)
  • JEP 323: Синтаксис локальной переменной для лямбда-параметров
  • JEP 324: ключевое соглашение с Curve25519 и Curve448
  • JEP 327: Юникод 10
  • JEP 328: Бортовой регистратор
  • JEP 329: криптографические алгоритмы ChaCha20 и Poly1305
  • JEP 330: Запуск однофайловых программ с исходным кодом
  • JEP 331: Профилирование кучи с низкими накладными расходами
  • JEP 332: Безопасность транспортного уровня (TLS) 1.3
  • JEP 333: ZGC: масштабируемый сборщик мусора с малой задержкой (экспериментальный)
  • JEP 335: отказ от ядра JavaScript Nashorn
  • JEP 336: устарели инструменты и API Pack200

Ряд функций из предыдущих выпусков был удален; в частности, Java-апплеты и Java Web Start больше не доступны. Модули JavaFX , Java EE и CORBA были удалены из JDK [327]

Обновления Java 11

JDK 12 был выпущен 19 марта 2019 г. Среди прочего, Java 12 включает ряд новых функций, таких как: [340]

  • JEP 189: Шенандоа: сборщик мусора с малым временем паузы (экспериментальный)
  • JEP 230: Пакет Microbenchmark
  • JEP 325: Switch Expressions (предварительная версия)
  • JEP 334: API констант JVM
  • JEP 340: один порт AArch64, а не два
  • JEP 341: Архивы CDS по умолчанию
  • JEP 344: прерывание смешанных коллекций для G1
  • JEP 346: незамедлительно вернуть неиспользованную выделенную память из G1

Функция предварительного просмотра Jep 325 расширяет switchоператор, так что его также можно использовать как выражение, и добавляет новую форму метки case, где правая часть является выражением. Оператор разрыва не требуется. Для сложных выражений yieldможно использовать оператор. Это становится стандартом в Java SE 14.

int  ndays  =  переключатель ( месяц )  {  case  JAN ,  MAR ,  MAY ,  JUL ,  AUG ,  OCT ,  DEC  ->  31 ;  case  APR ,  JUN ,  SEP ,  NOV  ->  30 ;  case  FEB  ->  {  if ( year  %  400  == 0 )  yield  29 ;  иначе,  если ( год  %  100  ==  0 )  yield  28 ;  иначе,  если ( год  %  4  == 0 )  yield  29 ;  иначе  выход  28 ;  } };

Обновления Java 12

JDK 13 был выпущен 17 сентября 2019 года. Java 13 включает следующие новые функции, а также «сотни небольших улучшений и тысячи исправлений ошибок». [344]

  • JEP 350: динамические архивы CDS
  • JEP 351: ZGC: разблокировать неиспользуемую память
  • JEP 353: переопределить устаревший API сокетов
  • JEP 354: Switch Expressions (предварительная версия)
  • JEP 355: Текстовые блоки (предварительная версия)

JEP 355 Text Blocks позволяет использовать многострочные строковые литералы:

String  html  =  "" "  ru ">   

Привет, мир