Java-дайджест (4 мая — 25 мая)

Платформа Java

Внезапно до многих дошло, что в Java больше не будет major releases: что во-первых, этот термин можно считать устаревшим и замененным feature releases, а во-вторых, что отсутствие long term support для Java 9 — это не шутка. По сети прокатилось множество статей и блогпостов, посвященных этой теме, эмоциональный настрой которых варьируется от радостной эйфории до дремучей депрессии.

Greg Luck, CEO/CTO в Hazelcast, высказал ожидания, что большая часть пользователей останется на Java 8 и подождет финального решения Oracle по этому вопросу. Также он наблюдает улучшения в бизнесе компаний, которые собираются оказывать самостоятельную поддержку Java (и это, например, Azul).

Markus Eisele, Head of Developer Advocacy в Lightbend отмечает, что проблема не столько в энтерпрайзах, сколько в Open Source библиотеках, которым нужно начать поддерживать куда больше конфигураций.

  • JavaFX (точнее, OpenJFX) стал доступен как отдельная сборка, скачать можно здесь, запускать надо с помощью Java 10 или 11. Johan Vos (коммитер OpenJFX, член экспертной группы OSGi, итп) кратко выразил эту мысль так: «Ядро OpenJDK — чудесное место, разработанное талантливыми инженерами. Чтобы гарантировать качество ядра, особенно в связи с быстрыми релизными циклами, нужно все компоненты, для которых это вообще возможно, выпускать и поддерживать отдельно от ядра.»
  • Три новых JEP для OpenJDK:
    • JEP 324: Key Agreement With Curve25519 and Curve448. Curve25519 — это 128-битная кривая для Диффи-Хеллмана, одна из быстрейших ECC, которая не заблокирована никакими патентами;
    • JEP 327: Unicode 10
    • JEP 328: Flight Recorder (высокоэффетивный фреймворк для сборка данных и отладки приложений, выполняющихся на HotSpot)
  • В рассылочке холиворят на тему появления Predicate::not (а баг лежит тут). Смысл примерно в следующем: сейчас нет способа быстро отрицнуть лямбду, не оборачивая ее в предикат:
    List<String> list = bufferedReader
      .lines()
      .filter(((Predicate<String>)String::isEmpty).negate())
      .collect(toList()); 
    

    Поэтому некисло бы иметь статический not, который возьмет обычную незавернутую лямбду и отрицнёт её:

    import static java.util.function.Predicate.not;
    
    List<String> list = bufferedReader
      .lines()
      .filter(not(String::isEmpty))
      .collect(toList()); 
    

    Несмотря на всю очевидность данного решения, есть и другие мнения. Например, Гёц считает, что default-методы на функциональных интерфейсах, используемые вместе с сабтайпингом, ведут к головной боли. А что думаете вы?

IntelliJ IDEA

  • Выпущена версия 2018.1.3:
    • Имя run/debug configuration полностью отображается, если его длина до 80 символов, потом — обрезается;
    • При импорте настроек из предыдущей версии, проверяется версия плагина Kotlin;
    • Ускорение работы Spring diagrams;
    • Горячие клавиши на Find in Path теперь работают в окне предпросмотра и диалоговом окне Find in Path;
    • Поддержка озвучивания интерфейса (screen readers) теперь делается с помощью JVM-опции -Dide.support.screenreaders.enabled=true в файле idea.properties;
    • Новая версия встроенного JRE с исправлением проблем:
      • z-index окон: JRE-692, JRE-695, JRE-705;
      • возможность отключить IME c помощью -Dawt.ime.disabled=true: JRE-729;
      • исправление позиционирования IME на HiDPI-экранах: JRE-742.
  • Следом за ней вышла IntelliJ IDEA 2018.1.4.
    • $MODULE_DIR$ теперь deprecated от греха подальше. Вместо этого теперь есть $MODULE_WORKING_DIR$ для содержимого модуля и $MODULE_IML_DIR$ для директории с .iml-файлом;
    • Поддержка Spring Boot Relaxed Binding 2.0;
    • Поправлена проблема с попапом Enter file name;
    • Для SVN починили проблемы, связанные с пробелами и специмальными символами в урле: IDEA-108912, IDEA-190790;
    • Поправили проблему с размерами окна, перетягиваемого между двумя мониторами с разным DPI;
  • Открыта 2018.2 Early Access Program. В частности,
    • появилась поддержка тачбара в MacBook (включая кастомизацию!). Очень, очень няшно;
    • улучшилась отладка Gradle;
    • улучшилась поддержка Maven (версия 3.7.0, опция release, новые быстрофиксы и подсветка динамических свойств);
    • серьезно улучшилась работа со Spring и Spring Boot;
  • Сразу же за первой сборкой подтянулась вторая, IntelliJ IDEA 2018.2 EAP2:
    • Улучшения в отладчике, в том числе интеншены:
      • stop only in class;
      • do not stop in class;
      • stop only in the current object;
    • Появилась новая панель предпросмотра для рефакторинга Extract Method. Может оказаться полезным для рефакторинга кода, содержащего копипасту;
    • Плагин Maven может распарсить даже такой POM, у которого в объявлении корневого пома используется property placeholder;
    • Подробное описание релиза можно прочитать по ссылке.

Проекты Eclipse

  • Eclipse Photon немного задерживается и будет где-нибудь в конце июня, а пока у нас есть Eclipse Photon M7. Подробности развития проекта есть в обширном ченжлоге с картинками, но в целом, можно сказать направление развития: не столько непрерывное добавление новой функциональности как раньше, сколько улучшение удобства использования и увеличение производительности. Идет работа над эргономикой, улучшением тёмной темы, высокого DPI (особенно в Windows), и так далее. Поддержку Windows XP выбросили из плана. Поддержка новых версий Java в JDT запилена полностью, Photon на 100% поддерживает Java 10.
  • Со времен последнего анонса Eclipse JDT Language Server прошел год, и сейчас в Eclipse подготовили обзор событий, произошедших за год. JDT Language Server коротко называют jdt.ls, и это Open Source реализация Language Server Protocol для языка Java.Language Server Protocol — это протокол между неким инструментом (клиентом) и источником информации о языке (сервером), используемый для реализации таких фичей как автодополнение, переход к объявлению переменной, поиску всех ссылок на объект языка, и так далее, которые хочет реализовать у себя инструмент (например, IDE).За год в jdt.ls была проведена большая работа:
    • уменьшен размер дистрибутива;
    • ускорен запуск;
    • быстрей собирается диагностика;
    • реализована поддержка Java 9;
    • произведены улучшения в рефакторинге «organize imports» (любимые импорты, порядок импортов, запуск рефакторинга при сохранении);
    • добавлено можество quick fixes;
    • появилась возможность выключать автоматическую сборку, или напротив, требовать инкрементальную или полную сборку по запросу;
    • починена правильная изоляция тестового classpath (тесты больше не утекают в основной релизный classpath);
    • улучшили поиск символов (типов);
    • вроде как работает поддержка нескольких корней у кода;
    • частично реализован рефактринг переименования (до сих пор нельзя переименовать файл);
    • добавлена поддержка внешних расширений (отладчики, декомпиляторы, новые команды).
  • Вышел Ditto 0.3.0-M1 — новый IoT фреймворк в Eclipse. Исходники есть на Github.

Frameworks

  • На седьмой Greach, конференции про Groovy и Grails, в испанском Мадриде, Graeme Rocher, лидер Grails, представил новый Micronaut framework. Основные преимущества:
    • Невероятно быстрый стартап;
    • Занимает очень мало в оперативной памяти;
    • Очень маленькие JAR-файлы;
    • Нет зависимостей;
    • 12 factor.

    Код выглядит как-то так:

    @Controller
    class HelloController {
         @Get("/hello/{name}") 
         String hello(String name) { 
               return "Hello $name!"
         } 
    } 
    
    // Клиент, генерируемый во время сборки приложения 
    @Client("/") 
    interface HelloClient { 
         @Get("/hello/{name}") 
         String hello(String name)
    }
    

    Кроме того, там есть еще вагон фич, например:

    • Service Discovery;
    • Circuit Breaker / Retry;
    • Configuration Sharing;
    • Client Side Load Balancing;
    • Serverless computing, AWS Lambda.

    Фичи видны напрямую из кода:

    @CircuitBreaker(attempts = '10', delay = '10ms', reset = '600ms')
    public List<User> findUsers() {
        ...
    }
    
  • Apache Wicket 8.0.0. Хотите ли вы того или нет, но Wicket все еще жив, и даже обзавелся новой большой версией. Миссия Wicket в том, чтобы писать веб с использованием нормальных Java-идиом, касающихся наследования и расширения компонентов, в основном на языке Java (получается ли это у него — замнем для ясности). Среди значимых исправлений:
    • Нужна Java 8 и выше;
    • Нужны Servlet 3.1;
    • Component databinding (IModel) теперь превратилась в Functional Interface;
    • Добавилась нативная поддержка JSR 310 Date/Time;
    • Optional теперь используется в правильных местах;
    • Удалена куча deprecated фич и кода.
  • Netflix выложили в open source Zuul 2. Zuul 2 позиционируется как cloud gateway, и предназначен для того, чтобы улучшать архитектуру систем, предоставляя фичи для управления, роутинга и защиты облачных систем. В Netflix он работает более чем на 80 кластерах и шлет трафик на более чем 100 бэкенд-кластеров, выдерживая более миллиона запросов в секунду. Детальное объяснение работы платформы выложено на Medium.

Spring

Выпущены:

  • Отчет об уязвимостях Spring (Framework, Security, Data, Integration). Интересно, что только выпущенные версии Spring Framework как раз исправляют старый CVE про DDoS;
  • Release trains Spring Data Ingalls SR12 и Kay SR7 (если пройти по ссылкам, можно увидеть, что там происходило). Конечно, они будут в Spring Boot 2.0.2 и 1.5.13;
  • Spring Framework 4.3.1715 исправлений багов и улучшений;
  • Spring Framework 5.0.6 — тут исправлений и улучшений уже более 40 штук;
  • Spring Boot 1.5.13. 22 изменения, которые можно посмотреть на GitHub. В основном, обновления зависимостей, но есть и исправленные баги, типа DevTools, сломавшихся на Java 6;
  • Spring Boot 2.0.2. Здесь изменений целых 84 штуки, посмотреть как всегда можно на GitHub. Огромное количество багфиксов, обновлений документации и зависимостей;
  • Spring Security 5.0.5 и 4.2.6. В 4.2.6 поправлен всего один баг, все остальное — улучшения и бэкпорты. В 5.0.6 поправлена и улучшена куча вещей, включая обновление до свежих Framework и Kay;
  • Spring Security 5.1.0.M1. Этот релиз чинит аж 81 тикет!
  • Spring Security OAuth версий 2.3.3, 2.2.2, 2.1.2, 2.0.15. Рассматривать в дайджесте все эти ченжлоги — это слишком погружение, поэтому вам придется пройти по ссылкам и сделать это самостоятельно;
  • Сначала Spring Cloud Data Flow 1.5 RC1, а потом и полноценный 1.5.0 — тулкит для создания интеграций и пайплайнов данных в реальном времени.

Hibernate

Выпущены:

  • Hibernate ORM 5.3.0 CR2, а сразу за ней и полноценная 5.3.0.Final. Насколько понимаю, там движуха идет вокруг верификации относительно JPA 2.2 TCK (которая, в основном, делается силами WildFly, ибо им нужно пройти полный EE TCK). Из фичей интересны repeating annotations (@java.lang.annotation.Repeatable, включая добавление @TableGenerators и @SequenceGenerators), query result streaming (Query#getStream как для javax.persistence.Query, так и для org.hibernate.query.Query), поддержку «новых» Java 8 Date and Time API, включение и выключение кэширования на любом уровне иерархии, и совместимость с JPA (когда Hibernate по историческим причинам делал что-то отличное от JPA, смотрите джавадок на org.hibernate.jpa.JpaCompliance);
  • Hibernate ORM 5.2.17 и 5.1.14.Final. В 5.2 все как всегда — чертово количество багов. 5.1 не отстает.
  • Hibernate Search 5.10.0.CR1. Обновление зависимостей на Hibernate ORM, прямой доступ к клиенту Elasticsearch, починенная бинарная совместимость с Hibernate Search 5.5 (так что его можно теперь положить в новый релиз WildFly), и так далее.
  • Hibernate Validator 6.0.10.Final:

Java EE & Jakarta EE

  • OmniFaces провело очередное исследование с вопросами из следующих категорий:
    • Версии Java EE;
    • Сервлет-контейнеры;
    • Используемые API;
    • Будущее Java EE / Jakarta EE.

    Если вкратце,

    • 81% разработчиков используют JEE 7;
    • Пользуются больше всего WildFly (и GlassFish с большим отставанием), любят — Payara Server, а ненавидят — WebSphere;
    • Контейнеры — Tomcat, Jetty и Undertow;
    • Самое популярное API — JPA, а самое безвестное — JACC;
    • Из библиотек чаще всего используют Hibernate, Mojarra и Jersey;
    • Из специфичных JEE библиотек люди яростно используют PrimeFaces и DeltaFaces, с сильным отставанием — DeltaSpike;
    • Почти никто не использовал MicroProfile, но кто использовал — делал это на Wildfly Swarm для Config, Health и Metrics;
    • Больше всего люди ждут обновления JPA, CDI, JAX-RS и JEE Security.

    В целом, исследование интересное, рекомендую взглянуть на него самостоятельно. На что стоит обратить внимание — на то, какие доработки опрошенные считают приоритетными.

Тестирование

  • Вышел AssertJ Guava assertions 3.2.0 — можно обновляться. Guava 21+ с поддержкой Java 8 (подключена как provided), совместимость с assertj-core 3.9.1+, улучшения в джавадоке;
  • Вышел JUnit 5.2: работа длиной два года подоша к концу. В поставке есть три основных модуля: JUnit Platform, JUnit Jupiter, and JUnit Vintage.
  • Прочитать про него можно в статье: What’s New in JUnit 5.2.
  • Если еще не убежал с предыдущей версии, поможет статья Introduction to JUnit 4 Test Runners, помогающая понять, чем занимаются test runners, как создавать свои раннеры и делать сьюиты с помощью раннера Categories;
  • A practical introduction to Spring Cloud Contract — хороший начальный туториал по Spring Cloud Contract;
  • Если кто-то все еще думает, что Gradle тормозит, его разработчики написали отличную статью про их тестовую инфраструктуру: Performance testing at Gradle;
Tags from the story