Что хранится в файле манифеста?
В JAR архиве можно найти файл
Манифест – текстовый файл, который состоит из заголовков, строчек вида
Вот некоторые из часто используемых заголовков:
• Информация об архиве: Manifest-Version, Created-By, Multi-Release, Built-By
• Main-class – точка входа приложения
• Classpath приложения
• Информация об экстеншне (Specification и Implementation, deprecated)
• Заголовки OSGI бандла
• Типы и хэши файлов архива (особенно применимо в Android приложениях)
Полный список стандартных заголовков можно почитать в документации.
👉@BookJava
В JAR архиве можно найти файл
META-INF/MANIFEST.MF
. Это манифест архива – хранилище его метаинформации. Манифест обычно добавляется той же утилитой, которой собирается jar-файл: maven-jar-plugin
, команда JDK jar
.Манифест – текстовый файл, который состоит из заголовков, строчек вида
ключ: значение
. Заголовки разделены на секции. Файл начинается с главной секции, описывающей метаинформацию всего архива. Следом, отделенные пустыми строками, идут секции для отдельных пакетов и файлов. В них могут переопределяться общие заголовки. JVM игнорирует неизвестные ей заголовки, что позволяет сторонним утилитам хранить в манифесте свою специфичную метаинформацию.Вот некоторые из часто используемых заголовков:
• Информация об архиве: Manifest-Version, Created-By, Multi-Release, Built-By
• Main-class – точка входа приложения
• Classpath приложения
• Информация об экстеншне (Specification и Implementation, deprecated)
• Заголовки OSGI бандла
• Типы и хэши файлов архива (особенно применимо в Android приложениях)
Полный список стандартных заголовков можно почитать в документации.
👉@BookJava
Трассировка в Spring Boot3
Вспоминая свои первые годы работы, я несколько удивляюсь тому, как я устранял проблемы, связанные с продакшеном. Я работал над проектом, в котором занимался всем - от взаимодействия с клиентами до кода, развертывания и, естественно, решения проблем. Когда возникала проблема и у меня не было четкого решения, я брал дамп базы данных продакшена, запускал приложение на своей машине с этой базой данных, затем звонил заказчику и пытался повторить его действия, используя необходимые отладочные указатели и операторы печати, чтобы точно определить проблему. В то время этот метод оказался для меня эффективным. Приложение было небольшим, с ограниченной базой пользователей, и с ним вполне мог справиться один разработчик. Однако я еще не понимал важности протоколирования.
https://medium.com/javarevisited/tracing-in-spring-boot3-097205dc08f4
👉@BookJava
Вспоминая свои первые годы работы, я несколько удивляюсь тому, как я устранял проблемы, связанные с продакшеном. Я работал над проектом, в котором занимался всем - от взаимодействия с клиентами до кода, развертывания и, естественно, решения проблем. Когда возникала проблема и у меня не было четкого решения, я брал дамп базы данных продакшена, запускал приложение на своей машине с этой базой данных, затем звонил заказчику и пытался повторить его действия, используя необходимые отладочные указатели и операторы печати, чтобы точно определить проблему. В то время этот метод оказался для меня эффективным. Приложение было небольшим, с ограниченной базой пользователей, и с ним вполне мог справиться один разработчик. Однако я еще не понимал важности протоколирования.
https://medium.com/javarevisited/tracing-in-spring-boot3-097205dc08f4
👉@BookJava
Как перейти на Scala: основы и особенности
Расскажет опытный эксперт — Алексей Воронец. На уроке вы:
- обсудите синтаксические особенности языка;
- узнаете, какие возможности языка позволяют комфортно использовать подходы функционального программирования;
- попрактикуетесь в написании функций и методов, создании иммутабельных конструкций;
- получите представление о возможностях композиции.
Занятие пройдёт 10 апреля в 20:00 мск в рамках курса «Scala-разработчик». Доступна рассрочка на обучение!
Регистрируйтесь прямо сейчас, чтобы посетить бесплатный урок и получить запись: https://vk.cc/cvVJsJ
Расскажет опытный эксперт — Алексей Воронец. На уроке вы:
- обсудите синтаксические особенности языка;
- узнаете, какие возможности языка позволяют комфортно использовать подходы функционального программирования;
- попрактикуетесь в написании функций и методов, создании иммутабельных конструкций;
- получите представление о возможностях композиции.
Занятие пройдёт 10 апреля в 20:00 мск в рамках курса «Scala-разработчик». Доступна рассрочка на обучение!
Регистрируйтесь прямо сейчас, чтобы посетить бесплатный урок и получить запись: https://vk.cc/cvVJsJ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Media is too big
VIEW IN TELEGRAM
Java 23: Восстановление баланса с помощью примитивных паттернов
Постоянное внедрение сопоставления шаблонов в Java привело к тому, что некоторые функции языка оказались более значимыми, чем другие, и разбалансировали язык. В Java 23 примитивные паттерны исправят эту ситуацию в отношении примитивных типов в
0:00 Intro
1:02 Existing Patterns
1:23 Type Patterns
1:32 Guarded Patterns
1:53 Record Patterns
2:09 Unnamed Patterns
2:29 Nested Patterns
2:50 Summary of Existing Patterns
3:38 Primitive Patterns in
5:17 Primitive Patterns in
6:30 Primitive Patterns when Nested
7:33 Upcoming Patterns
7:59 Deconstruction Patterns
8:40 Static Patterns
9:09 Instance Patterns
9:54 Constant Patterns
10:37 Try JDK 23 EA!
источник
👉@BookJava
Постоянное внедрение сопоставления шаблонов в Java привело к тому, что некоторые функции языка оказались более значимыми, чем другие, и разбалансировали язык. В Java 23 примитивные паттерны исправят эту ситуацию в отношении примитивных типов в
instanceof
и switch
. В этом эпизоде также рассматриваются другие грядущие паттерны ('deconstruction', 'static', 'instance' и 'constant') и показывается, как они будут развивать сопоставление паттернов в Java.0:00 Intro
1:02 Existing Patterns
1:23 Type Patterns
1:32 Guarded Patterns
1:53 Record Patterns
2:09 Unnamed Patterns
2:29 Nested Patterns
2:50 Summary of Existing Patterns
3:38 Primitive Patterns in
instanceof
5:17 Primitive Patterns in
switch
6:30 Primitive Patterns when Nested
7:33 Upcoming Patterns
7:59 Deconstruction Patterns
8:40 Static Patterns
9:09 Instance Patterns
9:54 Constant Patterns
10:37 Try JDK 23 EA!
источник
👉@BookJava
Советы по использованию Spring Framework 🚀
Используйте аспектно-ориентированное программирование (AOP) в SpringFramework для решения сквозных задач. Реализуйте протоколирование, безопасность и кэширование с помощью
и pointcuts. 🔥
👉@BookJava
Используйте аспектно-ориентированное программирование (AOP) в SpringFramework для решения сквозных задач. Реализуйте протоколирование, безопасность и кэширование с помощью
@Aspect
и pointcuts. 🔥
👉@BookJava
Хотите освоить среду выполнения wasm/wasi и запускать серверные приложения без привязки к операционной системе?
Присоединяйтесь к нашему бесплатному уроку «Wasm на сервере для высоконагруженных систем».
Дата: 09.04 в 20:00 мск
На уроке вы узнаете:
- Основы компиляции приложений в WebAssembly из различных технологий разработки: tinygo, emscripten, cargo.
- Как использовать Docker и NGINX Unit для публикации ваших wasm-приложений.
- Подключение wasm к envoy и публикация как функций в knative.
- Инструменты отладки и оценки производительности опубликованных wasm-приложений с использованием wzprof.
Не упустите возможность погрузиться в мир WebAssembly и трансформировать свою разработку серверных приложений!
После вебинара можно записаться на курс «Highload Architect» от Otus. Курс доступен для приобретения в рассрочку.
Пройдите короткий тест и начните обучение бесплатно: https://vk.cc/cvZDfr
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Присоединяйтесь к нашему бесплатному уроку «Wasm на сервере для высоконагруженных систем».
Дата: 09.04 в 20:00 мск
На уроке вы узнаете:
- Основы компиляции приложений в WebAssembly из различных технологий разработки: tinygo, emscripten, cargo.
- Как использовать Docker и NGINX Unit для публикации ваших wasm-приложений.
- Подключение wasm к envoy и публикация как функций в knative.
- Инструменты отладки и оценки производительности опубликованных wasm-приложений с использованием wzprof.
Не упустите возможность погрузиться в мир WebAssembly и трансформировать свою разработку серверных приложений!
После вебинара можно записаться на курс «Highload Architect» от Otus. Курс доступен для приобретения в рассрочку.
Пройдите короткий тест и начните обучение бесплатно: https://vk.cc/cvZDfr
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Дмитрий Тучс — The art of JUnit extensions
В режиме онлайн берем микросервисный проект (Spring Authorization Server, Spring OAuth 2.0 Resource Server) и строим полноценную инфраструктуру для работы с тестовыми данными, авторизацией и другим, используя JUnit Extensions. Только практические навыки, которые будут полезны большинству автоматизаторов на Java.
https://www.youtube.com/watch?v=NFHdzKcU5OU
👉@BookJava
В режиме онлайн берем микросервисный проект (Spring Authorization Server, Spring OAuth 2.0 Resource Server) и строим полноценную инфраструктуру для работы с тестовыми данными, авторизацией и другим, используя JUnit Extensions. Только практические навыки, которые будут полезны большинству автоматизаторов на Java.
https://www.youtube.com/watch?v=NFHdzKcU5OU
👉@BookJava
YouTube
Дмитрий Тучс — The art of JUnit extensions
Ближайшая конференция — Heisenbug 2025 Spring, 5—6 апреля (Москва + онлайн-трансляция).
Подробности и билеты: https://jrg.su/Tq0vcu
— —
В режиме онлайн берем микросервисный проект (Spring Authorization Server, Spring OAuth 2.0 Resource Server) и строим полноценную…
Подробности и билеты: https://jrg.su/Tq0vcu
— —
В режиме онлайн берем микросервисный проект (Spring Authorization Server, Spring OAuth 2.0 Resource Server) и строим полноценную…
Совет по Java 🚀
Если вам нужно работать с API, требующим
👉@BookJava
Если вам нужно работать с API, требующим
List<String>
, но вы хотите работать с текстовыми блоками Java 14, вы можете легко преобразовать их в List
. В Java 17 вы можете сначала вызвать lines()
для String
, который возвращает Stream
, а затем непосредственно toList()
, который выдает List
.👉@BookJava
⚡️ Тест по Java от OTUS
Проверь насколько хорошо ты знаешь Java
Ответишь — пройдешь на продвинутый курс «Java Developer. Professional» от OTUS по специальной цене + получишь доступ к записям открытых уроков курса курса🎁 .
👉 ПРОЙТИ ТЕСТ:
https://otus.pw/3EaK/?erid=LjN8K21s4
🎫 А ещё, сейчас действуют скидка на курс до 21.04. Возможна оплата в рассрочку! Предложение ограничено.
Хотите протестировать учебный процесс заранее? Регистрируйтесь на открытый урок «Знакомство с Micronaut» 11 апреля
Проверь насколько хорошо ты знаешь Java
Ответишь — пройдешь на продвинутый курс «Java Developer. Professional» от OTUS по специальной цене + получишь доступ к записям открытых уроков курса курса🎁 .
👉 ПРОЙТИ ТЕСТ:
https://otus.pw/3EaK/?erid=LjN8K21s4
🎫 А ещё, сейчас действуют скидка на курс до 21.04. Возможна оплата в рассрочку! Предложение ограничено.
Хотите протестировать учебный процесс заранее? Регистрируйтесь на открытый урок «Знакомство с Micronaut» 11 апреля
Как прочитать криптографический ключ?
Для чтения криптографического ключа необходимо использовать классы Java Cryptography Architecture (JCA). Пример кода для чтения криптографического ключа из файла вида PKCS#8 с помощью этих классов может выглядеть следующим образом:
// Используем ключ для выполнения криптографических операций
👉@BookJava
Для чтения криптографического ключа необходимо использовать классы Java Cryptography Architecture (JCA). Пример кода для чтения криптографического ключа из файла вида PKCS#8 с помощью этих классов может выглядеть следующим образом:
// Загружаем публичный ключ из файла
FileInputStream fis = new FileInputStream("public.pem");
BufferedInputStream bis = new BufferedInputStream(fis);
DataInputStream dis = new DataInputStream(bis);
byte[] keyBytes = new byte[dis.available()];
dis.readFully(keyBytes);
dis.close();
// Преобразуем байты в объект PublicKey
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey publicKey = kf.generatePublic(spec);
// Используем ключ для выполнения криптографических операций
👉@BookJava
Сравните репозитории Spring Data
Основная часть работы в Spring Data строится вокруг интерфейса
CrudRepository – базовый набор операций над сущностями: создание, чтение, изменение и удаление (CRUD).
PagingAndSortingRepository – добавляет к CRUD возможность постраничной загрузки данных с определенной сортировкой.
JpaRepository – расширение
MongoRepository – расширение
Вспомогательные методы, специфичные для конкретной модели данных, добавляются в пользовательские интерфейсы-наследники. Основываясь на именах добавляемых методов, фреймворк сам создаёт их реализацию.
👉@BookJava
Основная часть работы в Spring Data строится вокруг интерфейса
Repository
. Это маркерный интерфейс. От него наследуются интерфейсы-специализации, которые уже содержат методы для работы с сущностями базы данных. Все эти интерфейсы параметризуются двумя типами: самой сущности и её идентификатора.CrudRepository – базовый набор операций над сущностями: создание, чтение, изменение и удаление (CRUD).
PagingAndSortingRepository – добавляет к CRUD возможность постраничной загрузки данных с определенной сортировкой.
JpaRepository – расширение
PagingAndSortingRepository
, полноценно реализующее Java Persistence API. Добавляет ряд методов, таких как например flush и deleteInBatch.MongoRepository – расширение
PagingAndSortingRepository
, специфичное для MongoDB.Вспомогательные методы, специфичные для конкретной модели данных, добавляются в пользовательские интерфейсы-наследники. Основываясь на именах добавляемых методов, фреймворк сам создаёт их реализацию.
👉@BookJava
Регулярные выражения в Java
В Java регулярные выражения или Regex (сокращенно), можно использовать для поиска, манипулирования и редактирования строк в Java. Проверка электронной почты и паролей - вот несколько областей строк, где Regex широко используется для определения ограничений. Регулярные выражения в Java представлены в пакете java.util.regex. Он состоит из 3 классов и 1 интерфейса. Пакет java.util.regex в основном состоит из следующих трех классов, как показано ниже в табличной форме:
Pattern Class
Matcher Class
PatternSyntaxException Class
MatchResult Interface
https://www.geeksforgeeks.org/regular-expressions-in-java/
👉@BookJava
В Java регулярные выражения или Regex (сокращенно), можно использовать для поиска, манипулирования и редактирования строк в Java. Проверка электронной почты и паролей - вот несколько областей строк, где Regex широко используется для определения ограничений. Регулярные выражения в Java представлены в пакете java.util.regex. Он состоит из 3 классов и 1 интерфейса. Пакет java.util.regex в основном состоит из следующих трех классов, как показано ниже в табличной форме:
Pattern Class
Matcher Class
PatternSyntaxException Class
MatchResult Interface
https://www.geeksforgeeks.org/regular-expressions-in-java/
👉@BookJava
Дарим оберег от факапов на бесплатном вебинаре Миграция сервисов на Kubernetes и разбор факапов. Он пройдет 17 апреля, зарегистрироваться можно по ссылке
Заговор на комфортный переезд* сделает Виталий Лихачев, Senior software engineer в Avito.
Про какие факапы расскажет Виталий:
И другие факапы. Приходите на вебинар, чтобы разобраться в нюансах и расспросить спикера о деталях.
Когда: 17 апреля
Во сколько: 19:00 по МСК
Регистрация по ссылке
*не является публичной офертой
Реклама ООО «Слёрм» ИНН 3652901451
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
В Java 21 появилось множество новых функций и методов, которые помогут нам писать код более качественно. Но их легко не заметить или пропустить их использование, поскольку это относительно новая версия.
https://foojay.io/today/ensuring-the-right-usage-of-java-21-new-features/
👉@BookJava
https://foojay.io/today/ensuring-the-right-usage-of-java-21-new-features/
👉@BookJava
This media is not supported in your browser
VIEW IN TELEGRAM
🧠 Если у вас есть конфликты при мерже, не волнуйтесь!
Воспользуйтесь волшебной палочкой, чтобы разрешить простые конфликты. Убрав их, вы сможете сосредоточиться на разрешении остальных. #IntelliJIDEATips
👉@BookJava
Воспользуйтесь волшебной палочкой, чтобы разрешить простые конфликты. Убрав их, вы сможете сосредоточиться на разрешении остальных. #IntelliJIDEATips
👉@BookJava
Добавьте в свое портфолио кейс по решению задачи с микросервисной архитектурой бесплатно и всего за пару часов
На практическом уроке «Масштабируемая архитектура для систем обработки платежей».
На вебинаре:
- рассмотрим решение задачи по построению масштабируемой отказоустойчивой системы обработки платежей;
- обсудим применения шардирования, паттерна Saga, двухфазного коммита и выбор уровня изоляции транзакций;
- получим описание верхнеуровневой архитектуры.
Занятие пройдёт 24 апреля в 20:00 мск в рамках курса «Microservice Architecture». Доступна рассрочка на обучение!
Чтобы посетить открытый урок, зарегистрируйтесь: https://vk.cc/cwdNPs
На практическом уроке «Масштабируемая архитектура для систем обработки платежей».
На вебинаре:
- рассмотрим решение задачи по построению масштабируемой отказоустойчивой системы обработки платежей;
- обсудим применения шардирования, паттерна Saga, двухфазного коммита и выбор уровня изоляции транзакций;
- получим описание верхнеуровневой архитектуры.
Занятие пройдёт 24 апреля в 20:00 мск в рамках курса «Microservice Architecture». Доступна рассрочка на обучение!
Чтобы посетить открытый урок, зарегистрируйтесь: https://vk.cc/cwdNPs
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Когда используется StampedLock?
Во-первых, если блокировка
В
Не смотря на похожесть,
Итого, блокировка на штампах решает те же задачи, что
👉@BookJava
StampedLock
– примитив синхронизации, добавленный в Java с версии 8. Общий принцип его работы точно такой же, как у ReadWriteLock: захват неэксклюзивной блокировки (на чтение), и эксклюзивной (на запись). Но есть у этих классов ряд различий в деталях.Во-первых, если блокировка
ReadWriteLock
возвращает объекты типа Lock, то StampedLock
возвращает числа типа long
, которые и называется «штампами». Штамп служит идентификатором лока, он передается параметром в методы по работе с ранее захваченной блокировкой чтения или записи. Специальный штамп 0 означает неудавшийся захват.StampedLock
в отличие от ReentrantReadWriteLock – не реентрант. Это накладывает бóльшую ответственность на программиста: можно устроить дедлок на одном потоке.В
StampedLock
расширена функциональность. Новые методы с префиксом try* не висят в ожидании. Методы tryOptimistic* реализуют оптимистичную блокировку. Методы tryConvert* дают возможность изменять «уровень» заблокированности: можно попытаться превратить readLock во writeLock, и наоборот.Не смотря на похожесть,
StampedLock
не наследуется от ReadWriteLock
. Но для совместимости в нём предусмотрены методы-адаптеры asReadWriteLock
, asReadLock
и asWriteLock
.Итого, блокировка на штампах решает те же задачи, что
ReadWriteLock
, но дает больше возможностей и лучшую производительность.👉@BookJava
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 Пройди тест по Java и проверь свои знания.
Ответишь — пройдешь на продвинутый курс «Java Developer. Professional» от OTUS по специальной цене + получишь доступ к записям открытых уроков курса курса
🔝 Обновленная, расширенная программа
👉 ПРОЙТИ ТЕСТ: https://otus.pw/gvG3/?erid=LjN8KJAW3
Ответишь — пройдешь на продвинутый курс «Java Developer. Professional» от OTUS по специальной цене + получишь доступ к записям открытых уроков курса курса
🔝 Обновленная, расширенная программа
👉 ПРОЙТИ ТЕСТ: https://otus.pw/gvG3/?erid=LjN8KJAW3
Еще раз о перформансе стримов в Java
Время от времени я наблюдаю или даже бываю втянутым в спор о перформансе стримов в джаве. Общеизвестно, что стримы это компромисс между перформансом и удобством. Однако я не нашел вменяемого набора бенчмарков, которые бы показали, насколько именно медленны (или быстры) стримы. Поэтому я решил написать эти бенчмарки сам.
https://medium.com/@daniel.las/speed-of-java-stream-1cc3a94b44c2
👉@BookJava
Время от времени я наблюдаю или даже бываю втянутым в спор о перформансе стримов в джаве. Общеизвестно, что стримы это компромисс между перформансом и удобством. Однако я не нашел вменяемого набора бенчмарков, которые бы показали, насколько именно медленны (или быстры) стримы. Поэтому я решил написать эти бенчмарки сам.
https://medium.com/@daniel.las/speed-of-java-stream-1cc3a94b44c2
👉@BookJava