В чём разница между jar и war?
jar и war – расширения платформо-независимых файлов-архивов Java-приложения. Кроме них есть еще третий формат, ear. Все эти форматы – на самом деле просто zip-архивы с классами и другими частями приложения. Вы можете переименовать такой файл в .zip, разархивировать, и посмотреть, что внутри.
JAR – Java Archive. Содержит файлы классов, ресурсы, зависимые библиотеки, и другие необходимые для приложения файлы. Может содержать точку входа, и использоваться как цель для исполнения команды java.
WAR – Web Archive. Технически имеет ту же структуру, но другую роль – архив JavaEE web-компонента. Обычно содержит jar-ы с реализацией, JSP, статические файлы фронт-энда, и мета-информацию для сервлет-контейнера (web.xml). В основном используется как деплоймент web-приложения в сервлет-контейнер. С приходом Servlet API 3.0 и embedded-контейнеров, всё больше становится принято запаковывать и web-компоненты в самодостаточные jar (Лозунг Spring Boot: Make jar, not war).
EAR – Enterprise Archive. Для разработчиков, начавших карьеру уже во времена Spring Framework, может показаться совсем экзотичным. Это собранное воедино монолитное JavaEE приложение. Содержит дескрипторы деплоймента и JavaEE модули (веб-модули, EJB, клиентские модули, адаптеры ресурсов). Деплоится в JavaEE Application Server.
Все три типа файлов собираются утилитой jar из JDK.
👉@BookJava
jar и war – расширения платформо-независимых файлов-архивов Java-приложения. Кроме них есть еще третий формат, ear. Все эти форматы – на самом деле просто zip-архивы с классами и другими частями приложения. Вы можете переименовать такой файл в .zip, разархивировать, и посмотреть, что внутри.
JAR – Java Archive. Содержит файлы классов, ресурсы, зависимые библиотеки, и другие необходимые для приложения файлы. Может содержать точку входа, и использоваться как цель для исполнения команды java.
WAR – Web Archive. Технически имеет ту же структуру, но другую роль – архив JavaEE web-компонента. Обычно содержит jar-ы с реализацией, JSP, статические файлы фронт-энда, и мета-информацию для сервлет-контейнера (web.xml). В основном используется как деплоймент web-приложения в сервлет-контейнер. С приходом Servlet API 3.0 и embedded-контейнеров, всё больше становится принято запаковывать и web-компоненты в самодостаточные jar (Лозунг Spring Boot: Make jar, not war).
EAR – Enterprise Archive. Для разработчиков, начавших карьеру уже во времена Spring Framework, может показаться совсем экзотичным. Это собранное воедино монолитное JavaEE приложение. Содержит дескрипторы деплоймента и JavaEE модули (веб-модули, EJB, клиентские модули, адаптеры ресурсов). Деплоится в JavaEE Application Server.
Все три типа файлов собираются утилитой jar из JDK.
👉@BookJava
👍7🔥3
Совет по Spring MongoDB 💡
Определение выражений сортировки с использованием type-safe API 🔥
👉@BookJava
Определение выражений сортировки с использованием type-safe API 🔥
👉@BookJava
❤4👍1
Совет по Spring Boot💡
Улучшите сборку образа контейнера
https://paketo.io/docs/howto/java/#install-a-minimal-jre-with-jlink
#SpringBoot #Java
👉@BookJava
Улучшите сборку образа контейнера
@springboot
с помощью #Jlink! 🔥https://paketo.io/docs/howto/java/#install-a-minimal-jre-with-jlink
#SpringBoot #Java
👉@BookJava
❤5👍1
Аудит в Spring Data MongoDB💡
Используйте аннотации
#SpringData
👉@BookJava
Используйте аннотации
@CreatedBy
, @LastModifiedBy
, @CreatedDate
и @LastModifiedDate
для автоматического отслеживания времени создания и изменения сущностей, а также пользователя, ответственного за изменения. 🔥#SpringData
👉@BookJava
🥰5👍3
Советы по Spring Batch 💡
Оптимизируйте свои шаги в
#Java #SpringBatch
👉@BookJava
Оптимизируйте свои шаги в
@SpringBatch
с помощью параметра `startLimit
` и определите, сколько раз можно запустить шаг. 🔥#Java #SpringBatch
👉@BookJava
👍4
🚀 Совет по API Java 🚀
java.util.IdentityHashMap
В отличие от
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/IdentityHashMap.html
👉@BookJava
java.util.IdentityHashMap
В отличие от
HashMap
, этот класс использует равенство ссылок (==), а не равенство объектов (equals()
) для определения уникальности ключей, что делает его подходящим для конкретных случаев использования. 🔥https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/IdentityHashMap.html
👉@BookJava
Oracle
IdentityHashMap (Java SE 21 & JDK 21)
declaration: module: java.base, package: java.util, class: IdentityHashMap
👍6
Совет по SpringFramework 💡
Самый простой способ создания динамических SQL-запросов в JPA - это Query By Example. Вы создаете объект-пример, который оборачиваете в пример, а затем передаете его в ваш
хранилищу. JPA создаст WHERE только с теми полями, которые вы задали.
👉 @BookJava
Самый простой способ создания динамических SQL-запросов в JPA - это Query By Example. Вы создаете объект-пример, который оборачиваете в пример, а затем передаете его в ваш
@SpringData
хранилищу. JPA создаст WHERE только с теми полями, которые вы задали.
👉 @BookJava
👍7💩4
Как нельзя называть переменные?
Этот вопрос подразумевает ответ из двух частей. Нужно указать, какие есть технические ограничения, и какие стилистические. Стиль – слишком большая тема, не специфичная только для Java, не будем на ней останавливаться.
Технически компилятор налагает одинаковые ограничения на имена как переменных, так и классов, методов, и всего остального. Эти имена обобщенно называются идентификаторы.
Ограничений всего три:
1. Имя целиком не должно совпадать с зарезервированным словом;
2. Первый символ должен проходить проверку методом Character.isJavaIdentifierStart();
3. Остальные символы должны проходить проверку Character.isJavaIdentifierPart().
На практике проверки означают, что имя должно состоять из таких символов Unicode, как:
• Буквы (разных языков)
• Символы валют (такие как $)
• Соединительные символы (такие как _)
• Диакритика (combining mark, non-spacing mark)
• Методы, проходящие Character.isIdentifierIgnorable() (непечатаемые символы, в идентификаторе игнорируются компилятором)
• Цифры, числовые символы (такие как римские числа)
Последний пункт недопустим для первого символа имени. Тип конкретного символа можно узнать методом Character.getType().
Интересно зарезервированное слово var. Оно стоит особняком от других ключевых слов, потому что является зарезервированным только в контексте типа. Использовать var в качестве имени переменной можно.
👉@BookJava
Этот вопрос подразумевает ответ из двух частей. Нужно указать, какие есть технические ограничения, и какие стилистические. Стиль – слишком большая тема, не специфичная только для Java, не будем на ней останавливаться.
Технически компилятор налагает одинаковые ограничения на имена как переменных, так и классов, методов, и всего остального. Эти имена обобщенно называются идентификаторы.
Ограничений всего три:
1. Имя целиком не должно совпадать с зарезервированным словом;
2. Первый символ должен проходить проверку методом Character.isJavaIdentifierStart();
3. Остальные символы должны проходить проверку Character.isJavaIdentifierPart().
На практике проверки означают, что имя должно состоять из таких символов Unicode, как:
• Буквы (разных языков)
• Символы валют (такие как $)
• Соединительные символы (такие как _)
• Диакритика (combining mark, non-spacing mark)
• Методы, проходящие Character.isIdentifierIgnorable() (непечатаемые символы, в идентификаторе игнорируются компилятором)
• Цифры, числовые символы (такие как римские числа)
Последний пункт недопустим для первого символа имени. Тип конкретного символа можно узнать методом Character.getType().
Интересно зарезервированное слово var. Оно стоит особняком от других ключевых слов, потому что является зарезервированным только в контексте типа. Использовать var в качестве имени переменной можно.
👉@BookJava
👍5
Slim Docker Images для Java
Из этой статьи вы узнаете, как создавать слим Docker-образы для ваших Java-приложений с помощью Alpine Linux и Jlink.
https://piotrminkowski.com/2023/11/07/slim-docker-images-for-java/
👉@BookJava
Из этой статьи вы узнаете, как создавать слим Docker-образы для ваших Java-приложений с помощью Alpine Linux и Jlink.
https://piotrminkowski.com/2023/11/07/slim-docker-images-for-java/
👉@BookJava
👍4
Что такое механизм try-with-resources?
Данная конструкция, которая появилась в Java 7, позволяет использовать блок try-catch не заботясь о закрытии ресурсов, используемых в данном сегменте кода. Ресурсы объявляются в скобках сразу после try, а компилятор уже сам неявно создаёт секцию finally, в которой и происходит освобождение занятых в блоке ресурсов. Под ресурсами подразумеваются сущности, реализующие интерфейс java.lang.Autocloseable.
Стоит заметить, что блоки catch и явный finally выполняются уже после того, как закрываются ресурсы в неявном finally.
👉@BookJava
Данная конструкция, которая появилась в Java 7, позволяет использовать блок try-catch не заботясь о закрытии ресурсов, используемых в данном сегменте кода. Ресурсы объявляются в скобках сразу после try, а компилятор уже сам неявно создаёт секцию finally, в которой и происходит освобождение занятых в блоке ресурсов. Под ресурсами подразумеваются сущности, реализующие интерфейс java.lang.Autocloseable.
Стоит заметить, что блоки catch и явный finally выполняются уже после того, как закрываются ресурсы в неявном finally.
👉@BookJava
👍7🔥2
Советы по Java API 🚀
Синхронизация в Java - ReentrantLock
Усовершенствуйте синхронизацию потоков с помощью ReentrantLock в Java. Достигайте более тонкого контроля и продвинутых механизмов блокировки.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/concurrent/locks/ReentrantLock.html
👉@BookJava
Синхронизация в Java - ReentrantLock
Усовершенствуйте синхронизацию потоков с помощью ReentrantLock в Java. Достигайте более тонкого контроля и продвинутых механизмов блокировки.
class X {
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
lock.lock(); // block until condition holds
try {
// ... method body
} finally {
lock.unlock();
}
}
}
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/concurrent/locks/ReentrantLock.html
👉@BookJava
👍4👎1
Особенности работы класса Matcher
Как мы уже писали ранее, основная функциональность работы с регулярными выражениями представлена в Java классом
Во-первых, в общем случае матчер действует не по всей строке, а только внутри заданного «региона». Изначально регион совпадает со всей строкой, но его можно сужать и изменять в процессе работы. Методы
Свойство
Регулярные выражения используются для двух задач: поиска и замены. Поговорим о поиске.
Метод
Интерфейс
Есть еще пара свойств последнего поиска, которые актуальны не только для успешного результата, поэтому не вошли в интерфейс:
Метод
Для замены совпавших с регулярным выражением подстрок есть методы
При замене можно использовать
Есть более гибкий способ замены.
👉@BookJava
Как мы уже писали ранее, основная функциональность работы с регулярными выражениями представлена в Java классом
Matcher
. Рассмотрим его подробнее.Во-первых, в общем случае матчер действует не по всей строке, а только внутри заданного «региона». Изначально регион совпадает со всей строкой, но его можно сужать и изменять в процессе работы. Методы
regionStart
и regionEnd
возвращают текущие границы, а region
устанавливает новые.Свойство
transparentBounds
экземпляра матчера может разрешать регулярному выражению заглядывать при поиске за границы, при условии что итоговая совпавшая подстрока будет всё ещё в границах региона (lookahead
и lookbehind
). А выключив свойство anchoringBounds
можно перестать трактовать границы региона как границы строки (^ и $ в выражении).Регулярные выражения используются для двух задач: поиска и замены. Поговорим о поиске.
Метод
matches
проверяет, удовлетворяет ли выражению весь регион, lookingAt
– хотя бы его начало. Метод find
похож на next
итератора – он последовательно идет по строке, и находит следующие совпадения с выражением. Эту итерацию можно сдвинуть на определенную позицию строки, передав позицию как параметр.Matcher
реализует интерфейс MatchResult
. Через него предоставляется информация о последнем успешном поиске (любым из перечисленных методов). Если эту информацию необходимо сохранить, toMatchResult()
выделит её в отдельный иммутабельный объект. А если хочется обработать последовательность всех совпадений в виде стрима, поможет метод results()
.Интерфейс
MatchReslut
предоставляет методы group
, start
и end
. Они дают содержимое найденной подстроки и ее позицию в строке. Если этим методам параметром передать номер или имя группы, то результатом будет информация не о всей подстроке, а о ее группах. Общее количество групп хранится в свойстве groupCount
.Есть еще пара свойств последнего поиска, которые актуальны не только для успешного результата, поэтому не вошли в интерфейс:
hitEnd
и requireEnd
. hitEnd
сообщает, пришлось ли при последнем поиске дойти до конца региона. requireEnd
подскажет, мог ли измениться результат (успех/неудача) последнего поиска, если бы в конец региона был добавлен хвост.Метод
reset
сбрасывает всё это текущее состояние поиска. Передав в него параметр, можно заодно заменить строку, с которой работаем. Используемое регулярное выражение тоже можно заменить, методом usePattern
, но состояние поиска при этом не сбросится.Для замены совпавших с регулярным выражением подстрок есть методы
replaceFirst
и replaceAll
. В них можно передать как строку-замену, так и коллбэк, который будет вычислять её на лету. Оба метода сбрасывают состояние.При замене можно использовать
$
для ссылки на группы совпадения, а символ \
используется для escape
-последовательностей. Если требуется воспринимать эти символы без дополнительного смысла, необходимо обернуть строку-замену в вызов quoteReplacement
.Есть более гибкий способ замены.
Matcher
позволяет последовательно вручную выполнять поиск (всё теми же методами), а затем добавлять пройденный кусок строки с замененным совпадением в StringBuilder/StringBuffer
методом appendReplacement
. Оставшийся непройденный хвост добавляется методом appendTail
. То есть, последовательность вызовов m.find()
; m.appendReplacement()
; m.appendTail()
; эквивалентна вызову m.replaceFirst()
, а while(m.find()) m.appendReplacement()
; m.appendTail()
; – это m.replaceAll()
.👉@BookJava
👍8👏2❤1
🚀Совет Spring
Утилитный класс для сравнения объектов на основе их аннотаций
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/annotation/AnnotationAwareOrderComparator.html
👉@BookJava
AnnotationAwareOrderComparator
Утилитный класс для сравнения объектов на основе их аннотаций
@Order
или Ordered
. Он используется в ситуациях, когда нужно определить порядок выполнения компонентов. 🔥https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/annotation/AnnotationAwareOrderComparator.html
👉@BookJava
👍6
Что можно делать с классом Connection?
Итак, в результате соединения JDBC драйвера создается объект Connection – сессия работы с базой данных. Это главный класс при работе с JDBC. Основная роль этого класса – исполнение SQL-выражений (Statement) и получение их результатов в виде ResultSet.
Connection предоставляет в виде класса DatabaseMetaData мета-информацию о базе данных в целом: таблицы, поддерживаемая грамматика SQL, хранимые процедуры, возможности этого соединения, и т.д..
В коннекшне задается множество настройки самого соединения. Это уровень изоляции транзакций, режим авто-коммита, ключи шардирования, и многое другое. Маппинг типов данных SQL в Java-типы задается здесь же, свойством typeMap.
Помимо выполнения выражений, Connection предоставляет средства для управления транзакциями. Его методами можно создать Savepoint, откатиться к нему, закоммитить транзакцию когда авто-коммит отключен.
#SQL
👉@BookJava
Итак, в результате соединения JDBC драйвера создается объект Connection – сессия работы с базой данных. Это главный класс при работе с JDBC. Основная роль этого класса – исполнение SQL-выражений (Statement) и получение их результатов в виде ResultSet.
Connection предоставляет в виде класса DatabaseMetaData мета-информацию о базе данных в целом: таблицы, поддерживаемая грамматика SQL, хранимые процедуры, возможности этого соединения, и т.д..
В коннекшне задается множество настройки самого соединения. Это уровень изоляции транзакций, режим авто-коммита, ключи шардирования, и многое другое. Маппинг типов данных SQL в Java-типы задается здесь же, свойством typeMap.
Помимо выполнения выражений, Connection предоставляет средства для управления транзакциями. Его методами можно создать Savepoint, откатиться к нему, закоммитить транзакцию когда авто-коммит отключен.
#SQL
👉@BookJava
👍6🎉3
Совет по JUnit 5 🚀
Тестируйте методы-шаблоны с помощью
Используйте
https://junit.org/junit5/docs/current/api/org.junit.jupiter.api/org/junit/jupiter/api/TestTemplate.html
👉@BookJava
Тестируйте методы-шаблоны с помощью
@TestTemplate
Используйте
@TestTemplate
для определения методов-шаблонов, которые создают динамические тесты на основе входных данных. 🔥https://junit.org/junit5/docs/current/api/org.junit.jupiter.api/org/junit/jupiter/api/TestTemplate.html
👉@BookJava
junit.org
TestTemplate (JUnit 5.12.0 API)
declaration: module: org.junit.jupiter.api, package: org.junit.jupiter.api, annotation type: TestTemplate
👍3
JRE – Java Runtime Environment, Java-окружение времени выполнения. Это набор всего необходимого чтобы запустить скомпилированную Java-программу. Окружение состоит из виртуальной машины Java (JVM), библиотеки классов (Java Class Library), консольной команды java и прочей инфраструктуры. Тем не менее, JRE не достаточно чтобы создавать новые программы.
JDK – Java Development Kit, набор Java-разработчика. Это полнофункциональный SDK для Java. JDK включает в себя JRE, но кроме того содержит компилятор (javac) и другие инструменты разработки, такие как javadoc и jdb. С помощью JDK можно создавать и компилировать программы.
В большинстве случаев, если вам нужно только запускать Java программы, вы устанавливаете только JRE, если же вы планируете программировать на Java, вместо этого вам необходим JDK.
https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre/1906455#1906455
👉@BookJava
JDK – Java Development Kit, набор Java-разработчика. Это полнофункциональный SDK для Java. JDK включает в себя JRE, но кроме того содержит компилятор (javac) и другие инструменты разработки, такие как javadoc и jdb. С помощью JDK можно создавать и компилировать программы.
В большинстве случаев, если вам нужно только запускать Java программы, вы устанавливаете только JRE, если же вы планируете программировать на Java, вместо этого вам необходим JDK.
https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre/1906455#1906455
👉@BookJava
👍7
Совет
Если вы случайно уже используете генератор метамодели в своем проекте, вы можете использовать сгенерированные классы модели в атрибуте
👉@BookJava
Если вы случайно уже используете генератор метамодели в своем проекте, вы можете использовать сгенерированные классы модели в атрибуте
mappedBy
ваших отношений, чтобы обеспечить немного большую типобезопасность.👉@BookJava
👍6🎉2🤓1
Тестовое собеседование на Middle Java-разработчика завтра
Завтра, 28 августа в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
1. Роман Половинцев, ex-TeamLed в Сбер, Т-Банк, Райффайзенбанк и ВТБ позадает реальные вопросы и задачи разработчику-добровольцу
2. Роман будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
3. В конце можно будет задать любой вопрос Роману
Что узнаешь на прямом эфире от ШОРТКАТ:
- Чего ждут от кандидатов на Middle позиции в Java-разработке
- Какие вопросы задают на интервью и зачем
- Как подготовиться к собесу, чтобы получить оффер
Это бесплатно?
Бесплатно
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Завтра, 28 августа в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
1. Роман Половинцев, ex-TeamLed в Сбер, Т-Банк, Райффайзенбанк и ВТБ позадает реальные вопросы и задачи разработчику-добровольцу
2. Роман будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
3. В конце можно будет задать любой вопрос Роману
Что узнаешь на прямом эфире от ШОРТКАТ:
- Чего ждут от кандидатов на Middle позиции в Java-разработке
- Какие вопросы задают на интервью и зачем
- Как подготовиться к собесу, чтобы получить оффер
Это бесплатно?
Бесплатно
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
👍1
Media is too big
VIEW IN TELEGRAM
Java Virtual Threads
0:00 Intro
0:42 What are preview features, and how you can use them
3:34 What are Virtual Threads about?
4:21 Goals of Virtual Threads
5:11 Cost of a platform thread and CPU usage
7:49 How to use Virtual Threads
9:11 Using ExecutorServices with Virtual Threads
11:04 ThreadLocals and Synchronization
11:19 Synchronization, pinned threads and locks
13:14 Final words and outro
👉@BookJava
0:00 Intro
0:42 What are preview features, and how you can use them
3:34 What are Virtual Threads about?
4:21 Goals of Virtual Threads
5:11 Cost of a platform thread and CPU usage
7:49 How to use Virtual Threads
9:11 Using ExecutorServices with Virtual Threads
11:04 ThreadLocals and Synchronization
11:19 Synchronization, pinned threads and locks
13:14 Final words and outro
👉@BookJava
👍3
Media is too big
VIEW IN TELEGRAM
🎥 Java для начинающих | Уроки Java
#1 - Программирование на Java
#2 - Установка Java JDK и IntelliJ IDEA
#3 - Типы данных
#4 - Переменные
#5 - Арифметические операции
#6 - Условные операторы
#7 - циклы for, wile, do wile
#8 - Массивы в Java
#9 - Классы в Java
#10 - Тип данных String в Java
#11 - Наследование в Java
#12 - Java интерфейсы
#13 - Абстрактные классы java
#14 - Вложенные классы java
#15 - Пакеты в java
#16 - Перегрузка методов java
#17 - Основы ООП
#18 - Обработка исключений в java , try catch java / Java с нуля
Все видео доступны на youtube
👉@BookJava
#1 - Программирование на Java
#2 - Установка Java JDK и IntelliJ IDEA
#3 - Типы данных
#4 - Переменные
#5 - Арифметические операции
#6 - Условные операторы
#7 - циклы for, wile, do wile
#8 - Массивы в Java
#9 - Классы в Java
#10 - Тип данных String в Java
#11 - Наследование в Java
#12 - Java интерфейсы
#13 - Абстрактные классы java
#14 - Вложенные классы java
#15 - Пакеты в java
#16 - Перегрузка методов java
#17 - Основы ООП
#18 - Обработка исключений в java , try catch java / Java с нуля
Все видео доступны на youtube
👉@BookJava
👍3