<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="https://feeds.feedblitz.com/feedblitz_rss.xslt"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:webfeeds="http://webfeeds.org/rss/1.0"  xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
<channel>
	<title>Baeldung</title>
	<atom:link href="https://www.baeldung.com/feed" rel="self" type="application/rss+xml" />
	<link>https://www.baeldung.com</link>
	<description>Java, Spring and Web Development tutorials</description>
	<lastBuildDate>Tue, 12 May 2026 03:09:56 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
<meta xmlns="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
<item>
<feedburner:origLink>https://www.baeldung.com/java-bytebuffer-byte-array-conversion</feedburner:origLink>
		<title>Convert Between ByteBuffer and Byte Array in Java</title>
		<link>https://feeds.feedblitz.com/~/955773617/0/baeldung~Convert-Between-ByteBuffer-and-Byte-Array-in-Java</link>
					<comments>https://feeds.feedblitz.com/~/955773617/0/baeldung~Convert-Between-ByteBuffer-and-Byte-Array-in-Java#respond</comments>
		
		<dc:creator><![CDATA[Abderrahim Azhrioun]]></dc:creator>
		<pubDate>Tue, 12 May 2026 03:09:56 +0000</pubDate>
				<category><![CDATA[Core Java]]></category>
		<category><![CDATA[Java Bytecode]]></category>
		<guid isPermaLink="false">https://www.baeldung.com/java-bytebuffer-byte-array-conversion</guid>
					<description><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="max-width:100% !important;height:auto !important;float: left; margin-right: 5px;" fetchpriority="high" /><p>Explore various methods for converting between ByteBuffer and byte arrays in Java.</p>
The post <a rel="NOFOLLOW" href="https://feeds.feedblitz.com/~/955773617/0/baeldung~Convert-Between-ByteBuffer-and-Byte-Array-in-Java">Convert Between ByteBuffer and Byte Array in Java</a> first appeared on <a rel="NOFOLLOW" href="https://www.baeldung.com">Baeldung</a>.<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/955773617/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/955773617/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f07%2fJava-Featured-10-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/955773617/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/955773617/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/955773617/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/java-bytebuffer-byte-array-conversion#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/java-bytebuffer-byte-array-conversion/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</description>
										<content:encoded><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="float: left; margin-right: 5px;" decoding="async" srcset="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-1024x536.jpg 1024w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-300x157.jpg 300w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-768x402.jpg 768w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-100x52.jpg 100w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10.jpg 1200w" sizes="(max-width: 580px) 100vw, 580px" /><h2 id="bd-overview" data-id="overview">1. Overview</h2>
<div class="bd-anchor" id="overview"></div>
<p>In this tutorial, we&#8217;ll shed light on how to convert between <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-bytebuffer"><em>ByteBuffer</em></a> and <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-concatenate-byte-arrays"><em>Byte</em> arrays</a> in Java. Understanding how to convert between these two formats is essential for tasks such as file I/O handling and network communication.</p>
<p>We&#8217;ll look at different methods for converting a <em>ByteBuffer</em> to a <em>Byte[]</em> and vice versa, then we&#8217;ll discuss when to use each approach.</p>
<h2 id="bd-converting-bytebuffer-to-byte-array" data-id="converting-bytebuffer-to-byte-array">2. Converting <em>ByteBuffer</em> to <em>Byte</em> Array</h2>
<div class="bd-anchor" id="converting-bytebuffer-to-byte-array"></div>
<p>In Java, <em>ByteBuffer</em> is a core class from the <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-io-vs-nio#2-nio---javanio"><em>java.nio</em></a> package. It&#8217;s introduced to handle binary data in an efficient way. This is why it&#8217;s widely used in I/O operations.</p>
<p>First, let&#8217;s start by exploring how we can extract a <em>Byte</em> array from a <em>ByteBuffer</em>.</p>
<h3 id="bd-1-using-bytebufferarray" data-id="1-using-bytebufferarray">2.1. Using <em>ByteBuffer.array()</em></h3>
<div class="bd-anchor" id="1-using-bytebufferarray"></div>
<p>The simplest and most straightforward option is to use the <em>array()</em> method. <strong>Typically, this method returns the byte array that backs the buffer</strong>:</p>
<pre><code class="language-java">@Test
void whenUsingArrayMethod_thenConvertToByteArray() {
    byte[] givenBytes = {1, 6, 3};
    ByteBuffer buffer = ByteBuffer.wrap(givenBytes);
    byte[] bytes = buffer.array();
 
    assertArrayEquals(givenBytes, bytes);
}</code></pre>
<p>An important caveat here is that the <em>array()</em> method only works when the buffer has an accessible backing array. <strong>Otherwise, it throws <em>UnsupportedOperationException</em></strong>:</p>
<pre><code class="language-java">@Test
void givenBufferWithoutBackingArray_whenCallingArray_thenThrowUnsupportedOperationException() {
    ByteBuffer buffer = ByteBuffer.allocateDirect(4);
    assertThrows(UnsupportedOperationException.class, buffer::array);
}</code></pre>
<p><strong>It’s always safer to check whether the buffer has a backing array using the <em>hasArray() </em>method before calling <em>array()</em></strong>. It acts as a guard to prevent <em>UnsupportedOperationException.</em></p>
<p>Please note also that the <em>array()</em> method throws <em>ReadOnlyBufferException</em> if the buffer is read-only:</p>
<pre><code class="language-java">@Test
void givenReadOnlyBuffer_whenCallingArray_thenThrowReadOnlyBufferException() {
    ByteBuffer buffer = ByteBuffer.wrap(new byte[] {1, 2, 3});
    ByteBuffer readOnlyBuffer = buffer.asReadOnlyBuffer();
    assertThrows(ReadOnlyBufferException.class, readOnlyBuffer::array);
}</code></pre>
<p>As we can see, the <em>array()</em> method fails with<span style="margin: 0px;padding: 0px"> a <em>ReadOnlyBufferException</em></span>.</p>
<h3 id="bd-2-using-bytebufferget" data-id="2-using-bytebufferget">2.2. Using <em>ByteBuffer.get()</em></h3>
<div class="bd-anchor" id="2-using-bytebufferget"></div>
<p>Alternatively, we can use the <em>get()</em> method. <strong>It offers a more robust and flexible approach to extract a <em>Byte</em> array</strong>:</p>
<pre><code class="language-java">@Test
void whenUsingGetMethod_thenConvertToByteArray() {
    byte[] givenBytes = {5, 4, 2};
    ByteBuffer buffer = ByteBuffer.wrap(givenBytes);
    byte[] bytes = new byte[buffer.remaining()];
    buffer.get(bytes);
    assertArrayEquals(givenBytes, bytes);
}</code></pre>
<p>This method creates a new copy of the buffer&#8217;s data, which guarantees independence between the buffer and the returned byte array.</p>
<p><strong>Please note that we can specify an offset and a length for more precise control over how data is copied from the buffer</strong>:</p>
<pre><code class="language-java">@Test
void givenByteBuffer_whenUsingGetWithParamsMethod_thenConvertToByteArray() {
    byte[] givenBytes = {5, 4, 2, 7};
    ByteBuffer buffer = ByteBuffer.wrap(givenBytes);
    byte[] bytes = new byte[2];
    buffer.get(bytes, 0, 2);
 
    assertArrayEquals(new byte[] {5, 4}, bytes);
}</code></pre>
<p>Here, the destination array contains only 2 elements, matching the number of copied bytes.</p>
<h2 id="bd-converting-byte-array-tobytebuffer" data-id="converting-byte-array-tobytebuffer">3. Converting <em>Byte</em> Array to <em>ByteBuffer</em></h2>
<div class="bd-anchor" id="converting-byte-array-tobytebuffer"></div>
<p>Now, let&#8217;s go down the rabbit hole and see how to create a <em>ByteBuffer </em>from a byte array.</p>
<h3 id="bd-1-using-bytebufferwrap" data-id="1-using-bytebufferwrap">3.1. Using <em>ByteBuffer.wrap()</em></h3>
<div class="bd-anchor" id="1-using-bytebufferwrap"></div>
<p>The most common approach is using the method <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-bytebuffer#2-wrapping"><em>wrap()</em></a>. <strong>As the name implies, it wraps a given byte array into a buffer</strong>:</p>
<pre><code class="language-java">@Test
void whenUsingWrapMethod_thenConvertToByteBuffer() {
    byte[] givenBytes = {1, 2, 3};
    ByteBuffer buffer = ByteBuffer.wrap(givenBytes);
     
    assertArrayEquals(givenBytes, buffer.array());
}</code></pre>
<p>Notably, this method creates a buffer that directly uses the provided array as its backing storage. <strong>So, any change to the buffer will be reflected in the array and vice versa</strong>.</p>
<p><em>ByteBuffer</em> also provides <em>wrap(array, offset, length)</em>. <strong>However, instead of creating a new array starting at the offset, it wraps the entire original array and sets the position to the given offset</strong>:</p>
<pre><code class="language-java">@Test
void givenByteArray_whenUsingWrapWithParamsMethod_thenConvertToByteBuffer() {
    byte[] givenBytes = {1, 2, 3, 7, 8};
    ByteBuffer buffer = ByteBuffer.wrap(givenBytes, 1, 2);
        
    byte[] actualBytes = new byte[buffer.remaining()];
    buffer.get(actualBytes);
        
    assertArrayEquals(new byte[] {2, 3}, actualBytes);
}</code></pre>
<p>As shown above, <strong>we used <em>get()</em> to return the slice because the <em>wrap(array, offset, length)</em> method doesn&#8217;t control the underlying array</strong>.</p>
<h3 id="bd-2-using-bytebufferallocate" data-id="2-using-bytebufferallocate">3.2. Using <em>ByteBuffer.allocate()</em></h3>
<div class="bd-anchor" id="2-using-bytebufferallocate"></div>
<p>Similarly, we can use the <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-bytebuffer#1-allocation"><em>allocate()</em></a> method to convert a byte array to a <em>ByteBuffer</em>. We should use it combined with <em>put()</em>:</p>
<pre><code class="language-java">@Test
void whenUsingAllocateAndPutMethods_thenConvertToByteBuffer() {
    byte[] givenBytes = {1, 9, 7};
    ByteBuffer buffer = ByteBuffer.allocate(givenBytes.length);
    buffer.put(givenBytes);
    
    assertArrayEquals(givenBytes, buffer.array());
}</code></pre>
<p>In a nutshell, this approach allocates a new buffer and copies the data, which creates complete independence between the buffer and the original array.</p>
<p><strong>However, the buffer position moves to the end after writing with </strong><em><strong>put()</strong>.</em> So, we need to call <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-bytebuffer#3-clear-flip-rewind-and-compact"><em>flip()</em></a> to reset the buffer:</p>
<pre><code class="language-java">@Test
void givenByteArray_whenUsingPutWithFlip_thenReadWithoutException() {
    byte[] givenBytes = {3, 8};
    ByteBuffer buffer = ByteBuffer.allocate(givenBytes.length);
    buffer.put(givenBytes);
    buffer.flip();
        
    assertEquals(3, buffer.get());
}</code></pre>
<p>Otherwise, reading from the buffer using the <em>get()</em> method may lead to a <em>BufferUnderflowException</em>:</p>
<pre><code class="language-java">@Test
void givenByteArray_whenUsingPutWithoutFlip_thenThrowBufferUnderflowException() {
    byte[] givenBytes = {1, 5};
    ByteBuffer buffer = ByteBuffer.allocate(givenBytes.length);
    buffer.put(givenBytes);
    assertThrows(BufferUnderflowException.class, buffer::get);
}</code></pre>
<p>As expected, the test case confirms that the <em>get()</em> method throws <em>BufferUnderflowException</em> if we don&#8217;t use <em>flip()</em> to reset the buffer position.</p>
<h2 id="bd-conclusion" data-id="conclusion">4. Conclusion</h2>
<div class="bd-anchor" id="conclusion"></div>
<p>In this article, we explored various methods for converting between <em>ByteBuffer</em> and byte arrays in Java.</p>
<p>The full source is available <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-nio-3">over on GitHub</a>.</p>The post <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-bytebuffer-byte-array-conversion">Convert Between ByteBuffer and Byte Array in Java</a> first appeared on <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com">Baeldung</a>.<Img align="left" border="0" height="1" width="1" alt="" style="border:0;float:left;margin:0;padding:0;width:1px!important;height:1px!important;" hspace="0" src="https://feeds.feedblitz.com/~/i/955773617/0/baeldung">
<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/955773617/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/955773617/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f07%2fJava-Featured-10-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/955773617/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/955773617/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/955773617/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/java-bytebuffer-byte-array-conversion#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/java-bytebuffer-byte-array-conversion/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</content:encoded>
					
					<wfw:commentRss>https://feeds.feedblitz.com/~/955773617/0/baeldung~Convert-Between-ByteBuffer-and-Byte-Array-in-Java/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<webfeeds:featuredImage>https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-150x150.jpg</webfeeds:featuredImage></item>
<item>
<feedburner:origLink>https://www.baeldung.com/visual-studio-code-shortcut-snippets</feedburner:origLink>
		<title>How to Create Shortcut Snippets in Visual Studio Code?</title>
		<link>https://feeds.feedblitz.com/~/955768184/0/baeldung~How-to-Create-Shortcut-Snippets-in-Visual-Studio-Code</link>
					<comments>https://feeds.feedblitz.com/~/955768184/0/baeldung~How-to-Create-Shortcut-Snippets-in-Visual-Studio-Code#respond</comments>
		
		<dc:creator><![CDATA[Daniel Fintinariu]]></dc:creator>
		<pubDate>Tue, 12 May 2026 00:13:27 +0000</pubDate>
				<category><![CDATA[IDE]]></category>
		<category><![CDATA[VSCode]]></category>
		<guid isPermaLink="false">https://www.baeldung.com/?p=203692</guid>
					<description><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-12-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="max-width:100% !important;height:auto !important;float: left; margin-right: 5px;" /><p>Learn how to create and customize snippets in Visual Studio Code to reduce repetitive coding and improve development efficiency.</p>
The post <a rel="NOFOLLOW" href="https://feeds.feedblitz.com/~/955768184/0/baeldung~How-to-Create-Shortcut-Snippets-in-Visual-Studio-Code">How to Create Shortcut Snippets in Visual Studio Code?</a> first appeared on <a rel="NOFOLLOW" href="https://www.baeldung.com">Baeldung</a>.<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/955768184/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/955768184/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f07%2fJava-Featured-12-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/955768184/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/955768184/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/955768184/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/visual-studio-code-shortcut-snippets#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/visual-studio-code-shortcut-snippets/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</description>
										<content:encoded><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-12-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="float: left; margin-right: 5px;" decoding="async" loading="lazy" srcset="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-12-1024x536.jpg 1024w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-12-300x157.jpg 300w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-12-768x402.jpg 768w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-12-100x52.jpg 100w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-12.jpg 1200w" sizes="auto, (max-width: 580px) 100vw, 580px" /><h2 id="bd-introduction" data-id="introduction">1. Introduction</h2>
<div class="bd-anchor" id="introduction"></div>
<p>As developers, we usually repeat the same patterns while writing code. Although each repetition seems small, it gradually slows our workflow. Fortunately, <strong>Visual Studio Code provides user-defined snippets, which allow us to expand short triggers into full code templates</strong>. As a result, we can reduce repetitive typing, improve consistency, and focus more on solving problems.</p>
<p>In this tutorial, we&#8217;ll explain how snippets work in Visual Studio Code and demonstrate how to create and use them effectively.</p>
<h2 id="bd-code-snippets-in-vs-code" data-id="code-snippets-in-vs-code">2. Code Snippets in VS Code</h2>
<div class="bd-anchor" id="code-snippets-in-vs-code"></div>
<p><strong>A snippet is a reusable code template that expands when we type a specific keyword</strong>. VS Code stores snippets in JSON files, where each definition controls how the editor expands the template.</p>
<p>Typically, a snippet includes three main fields: the prefix, which acts as the trigger keyword; the body, which inserts the code; and the description, which provides a short explanation in IntelliSense.</p>
<p>Once we type the prefix and press <em>Tab</em> (or select it from suggestions), VS Code inserts the snippet into the editor.</p>
<p>VS Code also provides built-in snippets and extension-based snippet packs, so we should check existing options before creating new ones.</p>
<h2 id="bd-creating-a-simple-snippet" data-id="creating-a-simple-snippet">3. Creating a Simple Snippet</h2>
<div class="bd-anchor" id="creating-a-simple-snippet"></div>
<p>To start writing a snippet, we first need to <strong>open the snippet configuration interface</strong>. We can open it through the Command Palette (<em>Ctrl + Shift + P </em>on Windows or<em> Cmd + Shift + P </em>on Mac).</p>
<p>Next, we <strong>search for <em>Configure Snippets </em>and proceed to select the desired scope</strong>. There are several scopes to choose from, including global snippets that work across all file types and language-specific snippets that apply only to a particular language.</p>
<p>After we make the selection, VS Code lets us choose a name for the file and then opens a JSON file where we can define our snippets.</p>
<h3 id="bd-1-inserting-a-header-comment" data-id="1-inserting-a-header-comment">3.1. Inserting a Header Comment</h3>
<div class="bd-anchor" id="1-inserting-a-header-comment"></div>
<p>Let&#8217;s create a snippet that inserts a section header comment:</p>
<pre><code class="language-json">"Section Header": {
  "prefix": "sechead",
  "body": [
    "// ============================",
    "// ${1:Section Title}",
    "// ============================",
    "// ${2:Author}",
    "// ============================"
  ],
  "description": "Insert a section header comment"
}</code></pre>
<p>Here, <em>${1:Section Title}</em> and <em>${2:Author}</em> define placeholders and control cursor navigation order.</p>
<p>After saving the file, we can immediately try it out by typing the prefix <em>sechead</em> in a new file or, alternatively, by pressing <em>Ctrl + Space</em> on Windows or <em>Cmd + Space</em> on Mac to open the snippet dropdown. With the snippet selected, pressing <em>Tab</em> or <em>Enter</em> will insert our Section Header:</p>
<pre><code class="language-java">// ============================
// Section Title
// ============================
// Author
// ============================</code></pre>
<p>Once the snippet is added, the cursor immediately jumps to the first position. After entering the section title, we can press Tab to move it to the next position, which is the author.</p>
<h3 id="bd-2-snippet-shortcuts" data-id="2-snippet-shortcuts">3.2. Snippet Shortcuts</h3>
<div class="bd-anchor" id="2-snippet-shortcuts"></div>
<p>Snippets are especially useful for frequently typed statements. For instance, Java developers often write <em>System.out.println()</em> for debugging.</p>
<p>We can create a shortcut like this:</p>
<pre><code class="language-json">"System.out.println": {
  "prefix": "sysout",
  "body": [
    "System.out.println(${1:value});"
  ],
  "description": "Print a value to the console"
}</code></pre>
<p>After saving, we can type <em>sysout</em> and expand it. VS Code inserts:</p>
<pre><code class="language-java">System.out.println(value);</code></pre>
<p>The cursor appears inside the parentheses, allowing us to quickly replace the placeholder.</p>
<h2 id="bd-advanced-snippet-controls" data-id="advanced-snippet-controls">4. Advanced Snippet Controls</h2>
<div class="bd-anchor" id="advanced-snippet-controls"></div>
<p>Now that we’ve created basic snippets, we can <strong>explore more advanced features</strong> available in VS Code.</p>
<h3 id="bd-1-language-specific-snippets" data-id="1-language-specific-snippets">4.1. Language Specific Snippets</h3>
<div class="bd-anchor" id="1-language-specific-snippets"></div>
<p>Every snippet is scoped to one, several, or all (&#8220;global&#8221;) languages based on where it is defined.</p>
<p><strong>Single-language user-defined snippets are defined in a specific language’s snippet file (for example, java.json)</strong>, which we can access through Snippets: Configure Snippets using the language identifier.</p>
<p>For example, we can add a scope to our <em>sysout</em> snippet:</p>
<pre><code class="language-json">"scope": "java",</code></pre>
<p>By adding this line, we ensure the snippet is available only when we edit files in Java.</p>
<p><strong>Multi-language and global user-defined snippets are all defined in &#8220;global&#8221; snippet files (JSON with the file extension <em>.code-snippets</em>)</strong>. For example, we can add another language to the previously defined <em>scope</em>:</p>
<pre><code class="language-json">"scope": "java,kotlin"</code></pre>
<p>Now, <em>sysout</em> will appear when working with Java or Kotlin files only.</p>
<h3 id="bd-2-choices-and-variables" data-id="2-choices-and-variables">4.2. Choices and Variables</h3>
<div class="bd-anchor" id="2-choices-and-variables"></div>
<p><strong>Placeholders can include predefined choices. For example, we can define them using a comma-separated list inside pipe characters, such as <em>${1|one,two,three|}</em></strong>. When the snippet expands, the editor prompts us to select one of the values, so we can choose quickly instead of typing.</p>
<p>Additionally, <strong>we can insert variables using <em>$name</em> or <em>${name:default}</em></strong>. If the variable exists, the editor inserts its value. Otherwise, it uses the default or an empty string. However, if the variable is unknown, the editor inserts its name and turns it into an editable placeholder.</p>
<p>Let&#8217;s rewrite our sysout snippet to use choices and variables:</p>
<pre><code class="language-json">"Java Log with Choice and Variable": {
  "scope": "java,kotlin",
  "prefix": "sysout",
  "body": [
    "System.out.println(\"[${1|INFO,DEBUG,ERROR|}] ${TM_FILENAME_BASE}: ${2:message}\");"
  ],
  "description": "Log statement with level choice and filename variable"
}</code></pre>
<p>First, <em>${1|INFO,DEBUG,ERROR|}</em> allows us to select a value when the snippet expands, and we can cycle through the available options (INFO → DEBUG → ERROR).</p>
<p>Next, <em>${TM_FILENAME_BASE}</em> automatically inserts the current file name without the extension, so we don’t need to type it manually. VS Code provides many predefined variables that we can use in snippets.</p>
<p>Finally, <em>${2:message}</em> inserts a default value (message) while still allowing us to overwrite it immediately.</p>
<h3 id="bd-3-placeholder-transforms-regex-based-manipulation" data-id="3-placeholder-transforms-regex-based-manipulation">4.3. Placeholder Transforms (Regex-Based Manipulation)</h3>
<div class="bd-anchor" id="3-placeholder-transforms-regex-based-manipulation"></div>
<p>In addition to basic placeholders, <strong>VS Code supports placeholder transforms, which allow us to modify input using regular expressions</strong>. As a result, we can dynamically format text without rewriting it manually.</p>
<p>The syntax follows this structure:</p>
<pre><code class="language-json">${variable/regex/format/options}</code></pre>
<p>Let’s look at a practical example. Suppose we want to generate a Java getter method where the field name is automatically capitalized:</p>
<pre><code class="language-json">"Java Getter": {
  "scope": "java",
  "prefix": "getter",
  "body": [
    "public ${1:String} get${2/(.*)/${1:/capitalize}/}() {",
    "    return ${2:fieldName};",
    "}"
  ],
  "description": "Generate getter with capitalized field name"
}</code></pre>
<p>Here, <em>${2:fieldName}</em> defines the input placeholder. Then, <em>${2/(.*)/${1:/capitalize}/}</em> transforms that input by capitalizing its first letter.</p>
<p>For example, if we enter <em>userName</em>, the snippet expands to:</p>
<pre><code class="language-java">public String getUserName() {
    return userName;
}</code></pre>
<p>Therefore, we can reuse user input while automatically adjusting its format. This feature becomes especially useful when generating method names, constants, or formatted identifiers.</p>
<h3 id="bd-4-assigning-keyboard-shortcuts-to-snippets" data-id="4-assigning-keyboard-shortcuts-to-snippets">4.4. Assigning Keyboard Shortcuts to Snippets</h3>
<div class="bd-anchor" id="4-assigning-keyboard-shortcuts-to-snippets"></div>
<p>In addition to prefixes, <strong>we can trigger snippets using keyboard shortcuts</strong>. Let&#8217;s open the keybind file for our user by using the Command Palette and typing in Open Keyboard Shortcuts (JSON).</p>
<p>Here, we can define and possibly override existing default keybinds. For our scope, let&#8217;s use the shortcut <em>Ctrl + Alt +</em> P on Windows or <em>Cmd + Option + P</em> on Mac :</p>
<pre><code class="language-json">{
  "key": "ctrl+alt+p",
  "command": "editor.action.insertSnippet",
  "args": {
    "name": "Java Log with Choice and Variable"
  },
  "when": "editorTextFocus &amp;&amp; editorLangId == 'java'"
}</code></pre>
<p>Once the file has been saved, we can now quickly insert our custom snippet:</p>
<img decoding="async" class="alignnone size-full wp-image-64959" src="https://www.baeldung.com/wp-content/uploads/2026/05/sysout.png" alt="Example of snippet with choices and variables" />
<p>By assigning a keyboard shortcut, we can insert our custom snippet instantly, which improves both speed and workflow efficiency.</p>
<h2 id="bd-conclusion" data-id="conclusion">5. Conclusion</h2>
<div class="bd-anchor" id="conclusion"></div>
<p>In this article, we explored how to create and customize snippets in Visual Studio Code to reduce repetitive coding and improve development efficiency.</p>
<p>We first opened the snippet configuration and chose the appropriate scope.</p>
<p>Next, we defined snippets using a prefix, body, and description.</p>
<p>Then, we enhanced them with placeholders, tab stops, choices, variables, and regex-based transforms.</p>
<p>By investing a small amount of time in creating snippets, we can significantly improve our development speed and maintain consistent code across projects.</p>The post <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/visual-studio-code-shortcut-snippets">How to Create Shortcut Snippets in Visual Studio Code?</a> first appeared on <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com">Baeldung</a>.<Img align="left" border="0" height="1" width="1" alt="" style="border:0;float:left;margin:0;padding:0;width:1px!important;height:1px!important;" hspace="0" src="https://feeds.feedblitz.com/~/i/955768184/0/baeldung">
<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/955768184/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/955768184/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f07%2fJava-Featured-12-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/955768184/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/955768184/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/955768184/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/visual-studio-code-shortcut-snippets#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/visual-studio-code-shortcut-snippets/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</content:encoded>
					
					<wfw:commentRss>https://feeds.feedblitz.com/~/955768184/0/baeldung~How-to-Create-Shortcut-Snippets-in-Visual-Studio-Code/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<webfeeds:featuredImage>https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-12-150x150.jpg</webfeeds:featuredImage></item>
<item>
<feedburner:origLink>https://www.baeldung.com/java-synchronize-virtual-thread-no-pinning</feedburner:origLink>
		<title>Synchronize Virtual Thread Without Pinning</title>
		<link>https://feeds.feedblitz.com/~/955767131/0/baeldung~Synchronize-Virtual-Thread-Without-Pinning</link>
					<comments>https://feeds.feedblitz.com/~/955767131/0/baeldung~Synchronize-Virtual-Thread-Without-Pinning#respond</comments>
		
		<dc:creator><![CDATA[Saikat Chakraborty]]></dc:creator>
		<pubDate>Mon, 11 May 2026 23:46:04 +0000</pubDate>
				<category><![CDATA[JVM]]></category>
		<category><![CDATA[Threads]]></category>
		<guid isPermaLink="false">https://www.baeldung.com/java-synchronize-virtual-thread-no-pinning</guid>
					<description><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-13-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="max-width:100% !important;height:auto !important;float: left; margin-right: 5px;" loading="lazy" /><p>Learn various ways a the virtual thread gets pinned to the corresponding platform thread.</p>
The post <a rel="NOFOLLOW" href="https://feeds.feedblitz.com/~/955767131/0/baeldung~Synchronize-Virtual-Thread-Without-Pinning">Synchronize Virtual Thread Without Pinning</a> first appeared on <a rel="NOFOLLOW" href="https://www.baeldung.com">Baeldung</a>.<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/955767131/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/955767131/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f07%2fJava-Featured-13-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/955767131/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/955767131/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/955767131/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/java-synchronize-virtual-thread-no-pinning#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/java-synchronize-virtual-thread-no-pinning/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</description>
										<content:encoded><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-13-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="float: left; margin-right: 5px;" decoding="async" loading="lazy" srcset="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-13-1024x536.jpg 1024w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-13-300x157.jpg 300w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-13-768x402.jpg 768w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-13-100x52.jpg 100w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-13.jpg 1200w" sizes="auto, (max-width: 580px) 100vw, 580px" /><h2 id="bd-introduction" data-id="introduction">1. Introduction</h2>
<div class="bd-anchor" id="introduction"></div>
<p>With <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-virtual-thread-vs-thread">Virtual threads</a>, we can scale application performance for any I/O-intensive workflows. By contrast, with the platform threads, we had to carefully manage the expensive operating system resources and utilize non-blocking I/O, which involved complicated asynchronous code like <em><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-completablefuture">CompletableFuture</a></em>.</p>
<p>Even though virtual threads solve the scarcity problem with limited operating system threads, certain scenarios can cause platform thread blocking.</p>
<p>In this tutorial, we&#8217;ll learn different pinning scenarios with an example code. We&#8217;ll also debug and implement the fix for one such example. We&#8217;ll also learn the scenarios resolved in JDK 24.</p>
<h2 id="bd-virtual-thread-pinning-scenarios" data-id="virtual-thread-pinning-scenarios">2. Virtual Thread Pinning Scenarios</h2>
<div class="bd-anchor" id="virtual-thread-pinning-scenarios"></div>
<p>Virtual threads are a short-lived, lightweight thread construct that gets mounted onto the platform &#8220;carrier&#8221; thread by the JVM scheduler. It then executes the task and unmounts from the platform thread. The platform thread becomes available for the next task.</p>
<p>However, <strong>there are situations where the virtual thread and the corresponding carrier thread get blocked</strong> for a longer duration.</p>
<p>While this does not affect the business logic, it hampers the application&#8217;s scalability. A few common reasons are running heavy CPU-related tasks, waiting while holding a lock, or being blocked within a native method execution.</p>
<p>Though we should avoid using the virtual threads for any CPU-intensive operation. We&#8217;ll still need to understand other scenarios.</p>
<h3 id="bd-1-synchronized-method-or-block" data-id="1-synchronized-method-or-block">2.1. Synchronized Method or Block</h3>
<div class="bd-anchor" id="1-synchronized-method-or-block"></div>
<p>Let&#8217;s imagine a real-world example of adding products to the shopping cart.</p>
<p>We&#8217;ll implement the <em>CartService</em> class with an <em>update</em> method with the <em>productId</em> as a lock:</p>
<pre><code class="language-java">public class CartService {
    private final Map&lt;String, Integer&gt; products;
    private final Map&lt;String, Object&gt; locks = new ConcurrentHashMap&lt;&gt;();
    public void update(String productId, int quantity) {
        Object lock = locks.computeIfAbsent(productId, k -&gt; new Object());
        synchronized (lock) {
            simulateAPI();
            products.merge(productId, quantity, Integer::sum);
        }
        LOGGER.info("Updated Cart for {} {}", productId, quantity);
    }
}</code></pre>
<p>In the above code, we&#8217;re calling a simulated API instead of an actual one for demonstration purposes.</p>
<p>We&#8217;ll simulate the downstream API call with a <em>thread</em> <em>sleep</em> method:</p>
<pre><code class="language-java">private void simulateAPI() {
    try {
        Thread.sleep(50);
    } catch (InterruptedException ex) {
        throw new RuntimeException(ex);
    }
}</code></pre>
<p>Next, we&#8217;ll try to debug the above code.</p>
<h3 id="bd-2-debug-pinning" data-id="2-debug-pinning">2.2. Debug Pinning</h3>
<div class="bd-anchor" id="2-debug-pinning"></div>
<p><span style="font-size: 16px">Let&#8217;s test the above code using the <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-flight-recorder-monitoring">Java flight recorder</a>.</span></p>
<p>We&#8217;ll verify the pinning by running the <em>CartService</em> <em>update</em> method inside a virtual thread and assert the JFR events:</p>
<pre><code class="language-java">@Test
void givenJFRIsEnabled_whenVThreadIsBlocked_thenDetectVThreadPinned() throws Exception {
    Path file = Path.of("pinning.jfr");
    try (Recording recording = new Recording()) {
        recording.enable("jdk.VirtualThreadPinned")
          .withThreshold(Duration.ofMillis(1));
        recording.start();
        Thread th = Thread.ofVirtual().start(() -&gt;
            cartService.update("test1", 2));
        th.join();
        recording.stop();
        recording.dump(file);
}
    try (RecordingFile rf = new RecordingFile(file)) {
        assertTrue(rf.hasMoreEvents());
        while (rf.hasMoreEvents()) {
            RecordedEvent event = rf.readEvent();
            System.out.println(event);
            assertEquals("jdk.VirtualThreadPinned", event.getEventType().getName());
            assertEquals("Virtual Thread Pinned", event.getEventType().getLabel());
        }
    }
    Files.delete(file);
}
</code></pre>
<p>In the above test, we assert that the <em>RecordedEvent</em> includes the <em>jdk.VirtualThreadPinned</em> event.
<br>
Also, we can see the <em>jdk.VirtualThreadPinned</em> event in the console log:</p>
<pre><code class="language-bash">jdk.VirtualThreadPinned {
  startTime = 13:28:30.738 (2026-03-29)
  duration = 101 ms
  eventThread = "" (javaThreadId = 32, virtual)
}</code></pre>
<p>Additionally, we can view the pinned event in the JDK Mission Control dashboard:</p>
<a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/wp-content/uploads/2026/05/Virtuah_Thread_Pinned.png"><img decoding="async" class="size-large wp-image-242225 aligncenter" src="https://www.baeldung.com/wp-content/uploads/2026/05/Virtuah_Thread_Pinned-1024x712.png" alt="Vortua;_Thread_Pinned_Image" /></a>
<p>Alternatively, we can <strong>detect pinning using the <em>-Djdk.tracePinnedThreads=full </em>VM flag</strong>:</p>
<pre><code class="language-bash">VirtualThread[#21]/runnable@ForkJoinPool-1-worker-1 reason:MONITOR
    java.base/java.lang.VirtualThread$VThreadContinuation.onPinned(VirtualThread.java:199)
    java.base/jdk.internal.vm.Continuation.onPinned0(Continuation.java:393)
    java.base/java.lang.VirtualThread.parkNanos(VirtualThread.java:635)
    java.base/java.lang.VirtualThread.sleepNanos(VirtualThread.java:807)
    java.base/java.lang.Thread.sleep(Thread.java:507)
    com.baeldung.virtualthread.synchronize.CartService.simulateAPI(CartService.java:35)
    com.baeldung.virtualthread.synchronize.CartService.update(CartService.java:22) &lt;== monitors:1</code></pre>
<p>The above logs confirm that the platform thread is blocked.</p>
<p>Additionally, any code with<strong> Method-level synchronization, synchronization with<em> wait</em>, or the <em>LockSupport.park</em> method causes the pinning</strong>.</p>
<h3 id="bd-3-native-method" data-id="3-native-method">2.3. Native Method</h3>
<div class="bd-anchor" id="3-native-method"></div>
<p>The pinning can also occur in the native method calls. The native method can block either for any I/O operation or callbacks to Java code, which in turn blocks on a monitor.</p>
<p>We&#8217;ll implement a simple native method:</p>
<pre><code class="language-java">public class NativeDemo {
    static {
        System.loadLibrary("native-lib");
    }
    public native String nativeCall();
}</code></pre>
<p>The reason for the pinning is that the thread has no control on native stack and needs to wait for the native method call to return.</p>
<p>Similarly, we can expect the same when running the native function using the <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-foreign-memory-access">Foreign Function</a> API:</p>
<pre><code class="language-java">public void execute() {
    LOGGER.info("Running foreign function sleep...");
    Linker linker = Linker.nativeLinker();
    SymbolLookup stdlib = linker.defaultLookup();
    MethodHandle sleep = linker.downcallHandle(stdlib.find("sleep")
      .orElseThrow(), FunctionDescriptor.of(JAVA_INT, JAVA_LONG));
    try {
        sleep.invoke(100);
    } catch (Throwable ex) {
        throw new RuntimeException(ex);
    }
}</code></pre>
<p>In the above code, the foreign function <em>sleep</em> method is defined by first creating the <em>Linker</em> object and then including the downcall <em>MethodHandle </em>instance.</p>
<p>As of JDK 21/24<strong>, JFR does not emit the <em>jdk.VirtualThreadPinned</em> event for blocking that occurs within native</strong> or FFM code.</p>
<p>Still, we can confirm the pinning by analyzing the thread dump and its impact on other virtual threads.</p>
<h3 id="bd-4-static-initializer-block" data-id="4-static-initializer-block">2.4. Static Initializer Block</h3>
<div class="bd-anchor" id="4-static-initializer-block"></div>
<p>Let&#8217;s imagine a class with a static initializer block.</p>
<p>We&#8217;ll implement a static initializer block with a <em>Thread.sleep</em> method to block the platform thread:</p>
<pre><code class="language-java">public class HeavyClass {
    static {
        try {
            Thread.sleep(100);
        } catch (InterruptedException ex) {
            throw new RuntimeException(ex);
        }
        LOGGER.info("static initialization done");
    }
}</code></pre>
<p>In the above code, we expect the virtual thread to get pinned as the static initializer holds an intrinsic lock.</p>
<h3 id="bd-5-custom-class-loader" data-id="5-custom-class-loader">2.5. Custom Class Loader</h3>
<div class="bd-anchor" id="5-custom-class-loader"></div>
<p>We&#8217;ll implement a custom class loader to verify virtual thread pinning in the above scenario.</p>
<p>First, let&#8217;s implement a <em>CustomClassLoader</em> class by extending the <em>ClassLoader</em> class and overriding the <em>findClass</em> method:</p>
<pre><code class="language-java">class CustomClassLoader extends ClassLoader {
    private final Path classDir;
    @Override
    protected Class&lt;?&gt; findClass(String name) throws ClassNotFoundException {
        LOGGER.info("Finding class for {}", name);
        try {
            Path file = classDir.resolve(name.replace('.', '/') + ".class");
            byte[] bytes = java.nio.file.Files.readAllBytes(file);
            Thread.sleep(100);
            return defineClass(name, bytes, 0, bytes.length);
        } catch (InterruptedException | IOException ex) {
            LOGGER.error("Error while finding class file {}", ex.getMessage());
            throw new ClassNotFoundException(ex.getMessage(), ex);
        }
    }
}</code></pre>
<p>Then, we&#8217;ll need to implement the <em>loadClass</em> method to override the system <em>classloader</em>:</p>
<pre><code class="language-java">@Override
protected Class&lt;?&gt; loadClass(String name, boolean resolve) throws ClassNotFoundException {
    LOGGER.info("Load class for {}", name);
    Class&lt;?&gt; clazz = findLoadedClass(name);
    if (clazz == null) {
        try {
            clazz = findClass(name);
        } catch (ClassNotFoundException ex) {
            clazz = super.loadClass(name, resolve);
        }
    }
    if (resolve) {
        resolveClass(clazz);
    }
    return clazz;
}</code></pre>
<p>We&#8217;ll run a similar test for this class loader with the JFR recording enabled and verify the pinned thread event.</p>
<p>This is also true for any virtual thread that uses the same class while another thread initializes it.</p>
<h2 id="bd-implement-synchronization-without-pinning" data-id="implement-synchronization-without-pinning">3. Implement Synchronization Without Pinning</h2>
<div class="bd-anchor" id="implement-synchronization-without-pinning"></div>
<p>Although the JVM tries to compensate for the pinning by temporarily increasing the parallelism of the virtual thread scheduler, subjected to the default maximum of 256.
<br>
Still, we can overcome this with Java&#8217;s advanced concurrency control support.</p>
<p>We can use the <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/openjdk-project-loom">Loom-aware</a> locking mechanism, such as the <em>ReentrantLock</em> or <em>ReadWriteLock </em>class. The lock implementation within the <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-concurrent-locks"><em>java.util.concurrent.locks</em></a> package does not cause the pinning.</p>
<p>We&#8217;ll implement the above <em>CartService&#8217;s</em> <em>update</em> method using the <em>ReentrantLock</em> lock:</p>
<pre><code class="language-java">public void update(String productId, int quantity) {
    Lock lock = locks.computeIfAbsent(productId, k -&gt; new ReentrantLock());
    try {
        if (lock.tryLock(500, TimeUnit.MILLISECONDS)) {
            try {
                simulateAPI();
                products.merge(productId, quantity, Integer::sum);
            } finally{
                lock.unlock();
            }
            LOGGER.info("Updated Cart for {} {}", productId, quantity);
        }
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
}</code></pre>
<p>If we run the earlier test again with the fixed version, we don&#8217;t observe any thread pinning event and blocking in the other threads.</p>
<p>Another approach to resolving the unnecessary pinning is to upgrade to JDK 24 or newer versions, where developers have fixed the issue.
<br>
We recommend <span style="margin: 0px;padding: 0px"><strong>upgrading</strong></span><strong> the Java version if the upgrading effort is significantly smaller than reimplementing the code across services</strong>.</p>
<h2 id="bd-pinning-scenarios-resolved-in-jdk-24" data-id="pinning-scenarios-resolved-in-jdk-24">4. Pinning Scenarios Resolved in JDK 24</h2>
<div class="bd-anchor" id="pinning-scenarios-resolved-in-jdk-24"></div>
<p>As part of <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://openjdk.org/jeps/491">JEP-491</a>, the pinning issue is resolved for the synchronize method and block.
<br>
The Java team changed the implementation of the <em>synchronized</em> keyword, and now the virtual thread can acquire, hold, and release the lock independently of its carrier thread.</p>
<p>The system still expects pinning in the native method, class loader, and class initializer.</p>
<h2 id="bd-benchmark" data-id="benchmark">5. Benchmark</h2>
<div class="bd-anchor" id="benchmark"></div>
<p>We&#8217;ll implement a <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-microbenchmark-harness">JMH benchmark</a> test for the earlier <em>CartService</em> <em>update</em> method with the <em>AverageTime</em> and <em>Throughput</em> modes:</p>
<pre><code class="language-java">@BenchmarkMode({ Mode.AverageTime, Mode.Throughput })
@OutputTimeUnit(TimeUnit.SECONDS)
@Warmup(iterations = 1, time = 5, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 3, time = 5, timeUnit = TimeUnit.SECONDS)
@Fork(value = 2)
@State(Scope.Benchmark)
public class BenchmarkVirtualThread {
    private final CartService cartService = new CartService();
    @Param({"100", "1000", "10000"})
    private int CONCURRENCY;
    @Benchmark
    public void benchmark() throws InterruptedException, IOException {
        List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();
        IntStream.range(0, CONCURRENCY).forEach(i -&gt;
            threads.add(Thread.startVirtualThread(() -&gt; cartService.update(UUID.randomUUID().toString(), 2))));
        threads.forEach(th -&gt; {
            try {
                th.join();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });
    }
}</code></pre>
<p>In the above test, we&#8217;re using the benchmark parameter for concurrency control, and iterating the method 3 times after the initial warm-up.</p>
<p>We&#8217;ll now execute the above benchmark test in both JDK 21 and 25 versions.</p>
<p>First, we&#8217;ll see the performance report for JDK 21 version:</p>
<pre><code class="language-bash">Benchmark                         (CONCURRENCY)   Mode  Cnt   Score    Error  Units
BenchmarkVirtualThread.benchmark            100  thrpt    6   2.081 ±  0.008  ops/s
BenchmarkVirtualThread.benchmark           1000  thrpt    6   0.214 ±  0.058  ops/s
BenchmarkVirtualThread.benchmark          10000  thrpt    6   0.023 ±  0.001  ops/s
BenchmarkVirtualThread.benchmark            100   avgt    6   0.479 ±  0.011   s/op
BenchmarkVirtualThread.benchmark           1000   avgt    6   4.468 ±  0.033   s/op
BenchmarkVirtualThread.benchmark          10000   avgt    6  44.056 ±  0.279   s/op</code></pre>
<p>Then, let&#8217;s confirm the report for JDK 25 version:</p>
<pre><code class="language-bash">Benchmark                         (CONCURRENCY)   Mode  Cnt   Score   Error  Units
BenchmarkVirtualThread.benchmark            100  thrpt    6  18.392 ± 0.206  ops/s
BenchmarkVirtualThread.benchmark           1000  thrpt    6  10.061 ± 0.170  ops/s
BenchmarkVirtualThread.benchmark          10000  thrpt    6   1.005 ± 0.029  ops/s
BenchmarkVirtualThread.benchmark            100   avgt    6   0.058 ± 0.015   s/op
BenchmarkVirtualThread.benchmark           1000   avgt    6   0.108 ± 0.036   s/op
BenchmarkVirtualThread.benchmark          10000   avgt    6   0.962 ± 0.030   s/op</code></pre>
<p>From the above data, we can confirm that <strong>the throughput and average time have significantly improved in the latest JDK version</strong>.</p>
<h2 id="bd-conclusion" data-id="conclusion">6. Conclusion</h2>
<div class="bd-anchor" id="conclusion"></div>
<p>In this article, we&#8217;ve learned. We&#8217;ve implemented a fix for the synchronized method scenario. Also, we&#8217;ve explored how, in the later version, some of the pinning issues are resolved.</p>
<p>As always, the example code can be found <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-concurrency-advanced-7">over on GitHub</a>.</p>The post <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-synchronize-virtual-thread-no-pinning">Synchronize Virtual Thread Without Pinning</a> first appeared on <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com">Baeldung</a>.<Img align="left" border="0" height="1" width="1" alt="" style="border:0;float:left;margin:0;padding:0;width:1px!important;height:1px!important;" hspace="0" src="https://feeds.feedblitz.com/~/i/955767131/0/baeldung">
<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/955767131/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/955767131/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f07%2fJava-Featured-13-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/955767131/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/955767131/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/955767131/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/java-synchronize-virtual-thread-no-pinning#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/java-synchronize-virtual-thread-no-pinning/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</content:encoded>
					
					<wfw:commentRss>https://feeds.feedblitz.com/~/955767131/0/baeldung~Synchronize-Virtual-Thread-Without-Pinning/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<webfeeds:featuredImage>https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-13-150x150.jpg</webfeeds:featuredImage></item>
<item>
<feedburner:origLink>https://www.baeldung.com/java-25-key-derivation-function-api</feedburner:origLink>
		<title>Key Derivation Function API in Java 25</title>
		<link>https://feeds.feedblitz.com/~/955766681/0/baeldung~Key-Derivation-Function-API-in-Java</link>
					<comments>https://feeds.feedblitz.com/~/955766681/0/baeldung~Key-Derivation-Function-API-in-Java#respond</comments>
		
		<dc:creator><![CDATA[Bhaskar Ghosh]]></dc:creator>
		<pubDate>Mon, 11 May 2026 23:20:37 +0000</pubDate>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[>= Java 25]]></category>
		<guid isPermaLink="false">https://www.baeldung.com/?p=203681</guid>
					<description><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-13-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="max-width:100% !important;height:auto !important;float: left; margin-right: 5px;" loading="lazy" /><p>Learn about Key Derivation Function API in Java 25.</p>
The post <a rel="NOFOLLOW" href="https://feeds.feedblitz.com/~/955766681/0/baeldung~Key-Derivation-Function-API-in-Java">Key Derivation Function API in Java 25</a> first appeared on <a rel="NOFOLLOW" href="https://www.baeldung.com">Baeldung</a>.<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/955766681/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/955766681/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f07%2fJava-Featured-13-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/955766681/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/955766681/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/955766681/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/java-25-key-derivation-function-api#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/java-25-key-derivation-function-api/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</description>
										<content:encoded><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-13-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="float: left; margin-right: 5px;" decoding="async" loading="lazy" srcset="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-13-1024x536.jpg 1024w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-13-300x157.jpg 300w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-13-768x402.jpg 768w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-13-100x52.jpg 100w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-13.jpg 1200w" sizes="auto, (max-width: 580px) 100vw, 580px" /><h2 id="bd-introduction" data-id="introduction">1. Introduction</h2>
<div class="bd-anchor" id="introduction"></div>
<p>Cryptographic key management has always been a central concern in secure application development using Java.</p>
<p>Java 25 introduced the Key Derivation Function (KDF) API after its first preview in JDK 24 under <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://openjdk.org/jeps/478">JEP 478</a>. This new API introduces a clean, extensible model for deriving cryptographic keys from initial key material using well-established algorithms.</p>
<p>In this article, we&#8217;ll explore the motivation behind the <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/cs/kdf-cryptography">Key Derivation Function</a> (KDF) API, the architecture of the new API and its core components.</p>
<h2 id="bd-motivation-behind-kdfs" data-id="motivation-behind-kdfs">2. Motivation Behind KDFs</h2>
<div class="bd-anchor" id="motivation-behind-kdfs"></div>
<p><strong>A Key Derivation Function takes some initial key material (IKM) and derives one or more cryptographically strong keys from it.</strong></p>
<p>We can think of IKM as the raw cryptographic seed fed into the function. IKMs can be a shared secret negotiated over a network, a user-supplied password, or entropy produced by a key agreement protocol.</p>
<p>Let&#8217;s see where KDFs are useful:</p>
<ul>
<li><strong>TLS and protocol handshakes</strong>: After a Diffie-Hellman or ECDH exchange, the raw shared secret shouldn&#8217;t be used directly. A KDF transforms it into session keys with the required length and entropy.</li>
<li><strong>Password-based encryption</strong>: Raw passwords are weak keys. Algorithms like <em>PBKDF2</em> stretch and salt passwords to produce secure cryptographic material.</li>
<li><strong>Key diversification</strong>: A single master key can be safely expanded into multiple purpose-specific sub-keys without compromising the original.</li>
</ul>
<p>Before Java 25, there was no unified API to express any of these use cases. Therefore, developers either relied on low-level MAC-based constructions, vendor-specific provider APIs, or embedded third-party libraries such as Bouncy Castle.</p>
<p><strong>The new KDF API solves this by offering a standard, JCA-integrated interface that is both algorithm-agnostic and provider-extensible.</strong></p>
<h2 id="bd-architecture-of-the-new-kdf-api" data-id="architecture-of-the-new-kdf-api">3. Architecture of the New KDF API</h2>
<div class="bd-anchor" id="architecture-of-the-new-kdf-api"></div>
<p><strong>The KDF API lives in the <em>javax.crypto</em> package and follows the same factory-method pattern that Java&#8217;s existing cryptographic APIs use:</strong></p>
<pre><code class="language-java">KDF kdf = KDF.getInstance("HKDF-SHA256");</code></pre>
<p>The <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-factory-pattern">factory pattern</a> is a creational design pattern. It provides a way to create objects, generally with the <em>getInstance()</em> method, without having to specify the class of the object that will be created.</p>
<p>In our case <em>getInstance()</em> method accepts an algorithm name and, optionally, a <em>Provider</em>. <strong>This keeps the API consistent with the broader <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-security-overview">JCA</a> architecture and allows alternative implementations to be plugged in without changing application code.</strong></p>
<p>Once obtained, a KDF instance can derive either a typed <em>SecretKey</em> or raw byte material as follows:</p>
<pre><code class="language-java">SecretKey key = kdf.deriveKey("AES", paramSpec);
byte[] rawKeyMaterial = kdf.deriveData(paramSpec);</code></pre>
<h2 id="bd-derivation-methods" data-id="derivation-methods">4. Derivation Methods</h2>
<div class="bd-anchor" id="derivation-methods"></div>
<p>Let&#8217;s discuss how the KDF class exposes the primary derivation methods:</p>
<h3 id="bd-1-derivekeystring-alg-algorithmparameterspec-params" data-id="1-derivekeystring-alg-algorithmparameterspec-params">4.1. <em>deriveKey(String alg, AlgorithmParameterSpec params)</em></h3>
<div class="bd-anchor" id="1-derivekeystring-alg-algorithmparameterspec-params"></div>
<p>The first method <em>deriveKey(), </em>as the name suggests, <strong>derives a SecretKey for the specified target algorithm</strong>. Internally, the provider uses the params to determine the required key length and derivation inputs. The returned key is then ready to be used with the corresponding JCA algorithm:</p>
<pre><code class="language-java">SecretKey aesKey = kdf.deriveKey("AES", hkdfParams);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, aesKey, gcmSpec);</code></pre>
<h3 id="bd-2-derivedataalgorithmparameterspec-params" data-id="2-derivedataalgorithmparameterspec-params">4.2. <em>deriveData(AlgorithmParameterSpec params)</em></h3>
<div class="bd-anchor" id="2-derivedataalgorithmparameterspec-params"></div>
<p>The <em>deriveData()</em> method, on the other hand, <strong>returns the derived bytes directly as a<em> byte[]</em></strong>. It&#8217;s useful when the downstream consumer isn&#8217;t a JCA algorithm, for example, when feeding the output into a MAC or a custom protocol:</p>
<pre><code class="language-java">byte[] okm = kdf.deriveData(hkdfParams);</code></pre>
<p>We should note that both methods throw the <em>InvalidAlgorithmParameterException</em> if the parameter specification is incompatible with the chosen algorithm, and <em>NoSuchAlgorithmException</em> propagates from the <em>getInstance()</em> method if the algorithm isn&#8217;t available from any loaded provider.</p>
<h2 id="bd-input-parameters" data-id="input-parameters">5. Input Parameters</h2>
<div class="bd-anchor" id="input-parameters"></div>
<p>In this section, let&#8217;s understand what input parameters are required to apply and use the KDF API.</p>
<p><strong>The KDF API uses <em>AlgorithmParameterSpec</em> implementations to carry derivation inputs. </strong></p>
<p>For HKDF, the JDK provides a class that models the three distinct phases of the HKDF specification (RFC 5869): <em>Extract</em>, <em>Expand</em>, and the combined <em>Extract-then-Expand</em>. <em>HKDFParameterSpec</em> class is at the centre of this.</p>
<p>Each method comes with a different set of methods chained and expects a different set of parameters.</p>
<h3 id="bd-1-extract-then-expand" data-id="1-extract-then-expand">5.1. Extract-then-Expand</h3>
<div class="bd-anchor" id="1-extract-then-expand"></div>
<p>The first approach is an extract followed by an expand based approach:</p>
<pre><code class="language-java">HKDFParameterSpec params = HKDFParameterSpec
  .ofExtract()
  .addIKM(ikm)
material.addSalt(salt) // optional, randomizes extraction
  .thenExpand(info, 32);</code></pre>
<p>It exposes an <i>extract() method that</i> returns a builder. We then call <em>thenExpand()</em> on it and seal the spec. This signals that both phases should run together.</p>
<p>The info parameter is a context-binding byte array that ties the derived key to a specific purpose (e.g. encryption vs authentication).</p>
<h3 id="bd-2-extract-only" data-id="2-extract-only">5.2. Extract-only</h3>
<div class="bd-anchor" id="2-extract-only"></div>
<p>In this approach, the <em>HKDFParameterSpec</em> only utilises extraction:</p>
<pre><code class="language-java">HKDFParameterSpec extractOnly = HKDFParameterSpec
  .ofExtract()
  .addIKM(ikm)
  .addSalt(salt)
  .extractOnly();</code></pre>
<p><strong>This produces a pseudorandom key (PRK) from the IKM and salt without expanding it</strong>. We can then store or pass the PRK to a subsequent Expand-only step.</p>
<h3 id="bd-3-expand-only" data-id="3-expand-only">5.3. Expand-only</h3>
<div class="bd-anchor" id="3-expand-only"></div>
<p>Finally, let&#8217;s talk about the expand-only scenario:</p>
<pre><code class="language-java">HKDFParameterSpec expandOnly = HKDFParameterSpec
  .expandOnly(prk, info, 64);</code></pre>
<p>Here, <em>prk</em> is a previously derived <em>SecretKey</em>. This is useful in protocols that separate the extract and expand phases across different stages of a handshake.</p>
<h2 id="bd-supported-algorithms-in-java-25" data-id="supported-algorithms-in-java-25">6. Supported Algorithms in Java 25</h2>
<div class="bd-anchor" id="supported-algorithms-in-java-25"></div>
<p>Java 25 ships with built-in support for the HKDF family of algorithms through the default <em>SunJCE</em> provider.</p>
<p>The supported algorithm names are:</p>
<ul>
<li>HKDF-SHA256</li>
<li>HKDF-SHA384</li>
<li>HKDF-SHA512</li>
</ul>
<p><strong>All three follow the HMAC-based Extract-and-Expand construction defined in RFC 5869.</strong> The maximum output length for each variant is 255 times the hash output length, as mandated by the specification.</p>
<h2 id="bd-comparing-the-old-and-the-new" data-id="comparing-the-old-and-the-new">7. Comparing the Old and the New</h2>
<div class="bd-anchor" id="comparing-the-old-and-the-new"></div>
<p>Before the KDF API, deriving a key using HKDF required implementing the <em>Extract</em> and <em>Expand</em> steps manually using <em>javax.crypto.Mac</em>:</p>
<pre><code class="language-java">
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(salt, "HmacSHA256"));
byte[] prk = mac.doFinal(ikm);
mac.init(new SecretKeySpec(prk, "HmacSHA256"));
byte[] t = new byte[0];
byte[] okm = new byte[32];
byte counter = 1;
mac.update(t);
mac.update(info);
mac.update(counter);
t = mac.doFinal();
System.arraycopy(t, 0, okm, 0, 32);
SecretKey aesKey = new SecretKeySpec(okm, "AES");</code></pre>
<p>This is fragile, verbose, and easy to get wrong. Additionally, it also conflates cryptographic logic with application code, making audits harder.</p>
<p><strong>The new API reduces the same operation to a self-documenting, three-line construct:</strong></p>
<pre><code class="language-java">KDF hkdf = KDF.getInstance("HKDF-SHA256");
SecretKey aesKey = hkdf.deriveKey("AES",
HKDFParameterSpec.ofExtract()
  .addIKM(ikm)
  .addSalt(salt)
  .thenExpand(info, 32));</code></pre>
<p>The algorithm name is validated at instantiation time, not buried in a string passed to <em>Mac.getInstance()</em>.</p>
<p>Finally, let&#8217;s talk a little bit about error handling. Parameter errors surface as typed exceptions rather than silent data corruption. This was a missing piece in the older approach.</p>
<p>Since KDF has a provider-backed implementation, a security team can exchange the underlying algorithmic implementation, for example, to a FIPS-compliant provider without touching application code. This makes the new KDF Spec design much more robust.</p>
<h2 id="bd-conclusion" data-id="conclusion">8. Conclusion</h2>
<div class="bd-anchor" id="conclusion"></div>
<p>In this article, we explored the Key Derivation Function API introduced in Java 25. We looked at why KDFs are essential in modern cryptographic workflows, how the KDF class fits into the existing JCA architecture, and how <em>HKDFParameterSpec</em> models the Extract and Expand phases of the HKDF specification.</p>
<p>We also saw how the new API eliminates the manual, error-prone workarounds that developers previously had to write, replacing them with a clean, algorithm-agnostic, and provider-extensible interface.</p>
<p>The full source code for the examples in this article is available <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-25/src/main/java/com/baeldung">over on GitHub</a>.</p>The post <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-25-key-derivation-function-api">Key Derivation Function API in Java 25</a> first appeared on <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com">Baeldung</a>.<Img align="left" border="0" height="1" width="1" alt="" style="border:0;float:left;margin:0;padding:0;width:1px!important;height:1px!important;" hspace="0" src="https://feeds.feedblitz.com/~/i/955766681/0/baeldung">
<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/955766681/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/955766681/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f07%2fJava-Featured-13-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/955766681/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/955766681/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/955766681/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/java-25-key-derivation-function-api#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/java-25-key-derivation-function-api/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</content:encoded>
					
					<wfw:commentRss>https://feeds.feedblitz.com/~/955766681/0/baeldung~Key-Derivation-Function-API-in-Java/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<webfeeds:featuredImage>https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-13-150x150.jpg</webfeeds:featuredImage></item>
<item>
<feedburner:origLink>https://www.baeldung.com/spring-ai-anthropic-agent-skills</feedburner:origLink>
		<title>Anthropic Agent Skills Support in Spring AI</title>
		<link>https://feeds.feedblitz.com/~/955766684/0/baeldung~Anthropic-Agent-Skills-Support-in-Spring-AI</link>
					<comments>https://feeds.feedblitz.com/~/955766684/0/baeldung~Anthropic-Agent-Skills-Support-in-Spring-AI#respond</comments>
		
		<dc:creator><![CDATA[Manfred Ng]]></dc:creator>
		<pubDate>Mon, 11 May 2026 23:14:10 +0000</pubDate>
				<category><![CDATA[Spring AI]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[PDF]]></category>
		<guid isPermaLink="false">https://www.baeldung.com/spring-ai-anthropic-agent-skills</guid>
					<description><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="max-width:100% !important;height:auto !important;float: left; margin-right: 5px;" loading="lazy" /><p>Learn how to use Anthropic with agent skills for structured output in specific formats via Spring AI.</p>
The post <a rel="NOFOLLOW" href="https://feeds.feedblitz.com/~/955766684/0/baeldung~Anthropic-Agent-Skills-Support-in-Spring-AI">Anthropic Agent Skills Support in Spring AI</a> first appeared on <a rel="NOFOLLOW" href="https://www.baeldung.com">Baeldung</a>.<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/955766684/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/955766684/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f07%2fJava-Featured-10-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/955766684/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/955766684/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/955766684/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/spring-ai-anthropic-agent-skills#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/spring-ai-anthropic-agent-skills/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</description>
										<content:encoded><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="float: left; margin-right: 5px;" decoding="async" loading="lazy" srcset="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-1024x536.jpg 1024w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-300x157.jpg 300w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-768x402.jpg 768w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-100x52.jpg 100w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10.jpg 1200w" sizes="auto, (max-width: 580px) 100vw, 580px" /><h2 id="bd-overview" data-id="overview">1. Overview</h2>
<div class="bd-anchor" id="overview"></div>
<p>Large Language Models (LLMs) have advanced to agentic systems capable of executing tasks more complex than simply generating text. One of the emerging areas is agent skills as introduced by Antropic.</p>
<p>Agent skills enable LLM to produce document files without an additional API, such as Apache POI. They invoke the built-in capabilities that generate documents on the provider server and return them via file identifiers. <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/spring-ai">Spring AI</a> supports skills with the Anthropic models, making it easy to integrate with Java applications.</p>
<p>In this tutorial, we&#8217;ll explore what Anthropic provides in terms of agent skills and how we integrate them with Spring AI.</p>
<h2 id="bd-anthropic-pre-built-skills" data-id="anthropic-pre-built-skills">2. Anthropic Pre-built Skills</h2>
<div class="bd-anchor" id="anthropic-pre-built-skills"></div>
<p><strong>Anthropic provides a set of pre-built agent skills that can generate a document and populate it with content</strong>. Thus, the model can return a document file rather than plain text.</p>
<p>Of course, <strong>there are a few document formats that Anthropic currently supports</strong>:</p>
<ul>
<li>DOCX: Word documents with formatting</li>
<li>PDF: Formatted PDF reports</li>
<li>PPTX: PowerPoint slides</li>
<li>XLSX: Excel spreadsheets</li>
</ul>
<p>In Spring AI, we can use these Anthropic pre-built skills by applying them via chat options.</p>
<h2 id="bd-configuration" data-id="configuration">3. Configuration</h2>
<div class="bd-anchor" id="configuration"></div>
<p>To get started with the Anthropic skills, let&#8217;s add the required <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://mvnrepository.com/artifact/org.springframework.ai/spring-ai-starter-model-anthropic">dependency</a> to <em>pom.xml</em>:</p>
<pre><code class="language-xml">&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.ai&lt;/groupId&gt;
    &lt;artifactId&gt;spring-ai-starter-model-anthropic&lt;/artifactId&gt;
&lt;/dependency&gt;</code></pre>
<p>Next, we configure the Anthropic API key in <em>application.yml</em> to use Anthropic models:</p>
<pre><code class="language-yaml">spring:
  ai:
    anthropic:
      api-key: "${ANTHROPIC_API_KEY}"</code></pre>
<p>This way, we don&#8217;t need to supply the key separately.</p>
<h2 id="bd-sample-implementation" data-id="sample-implementation">4. Sample Implementation</h2>
<div class="bd-anchor" id="sample-implementation"></div>
<p>To demonstrate the features, let&#8217;s build a simple web application that generates a sales report. Moreover, the implementation enables us to output a specific document format supported by the pre-built skills via the request prompt.</p>
<h3 id="bd-1-data-service" data-id="1-data-service">4.1. Data Service</h3>
<div class="bd-anchor" id="1-data-service"></div>
<p>To begin with, we need to provide a model to represent the data sent to the chat model:</p>
<pre><code class="language-java">public record MonthlySale(String product, int year, Month month, BigDecimal amount) {
}</code></pre>
<p>For demonstration purposes, we create a simple data service layer to return hardcoded data. In this case, the service returns a <em>List</em> of <em>MonthlySale</em> containing 12 months of sales for product A and product B:</p>
<pre><code class="language-java">@Service
public class MonthlySalesService {
    public List&lt;MonthlySale&gt; getMonthlySalesForYear(int year) {
        return List.of(
            // Product A monthly sales
            new MonthlySale("Product A", year, Month.JANUARY, new BigDecimal("1200")),
            new MonthlySale("Product A", year, Month.FEBRUARY, new BigDecimal("1325")),
            ...
            // Product B monthly sales
            ...
            new MonthlySale("Product B", year, Month.NOVEMBER, new BigDecimal("1330")),
            new MonthlySale("Product B", year, Month.DECEMBER, new BigDecimal("1395"))
        );
    }
}</code></pre>
<p>In reality, we could replace it with an <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/spring-ai-model-context-protocol-mcp">MCP tool</a> to retrieve the sales data from the database and integrate it with the chat model.</p>
<h3 id="bd-2-controller" data-id="2-controller">4.2. Controller</h3>
<div class="bd-anchor" id="2-controller"></div>
<p>Next, we expose an HTTP endpoint to accept a request prompt that shapes the document content and format.</p>
<p><strong>Since the document format isn&#8217;t known in advance, we return the mime type, which is determined from the chat model, to the client</strong>:</p>
<pre><code class="language-java">@RestController
@RequestMapping("/agent-skills")
@Validated
public class AgentSkillsController {
    private final AgentSkillsService agentSkillsService;
    public AgentSkillsController(AgentSkillsService agentSkillsService) {
        this.agentSkillsService = agentSkillsService;
    }
    @GetMapping("/report")
    public ResponseEntity&lt;byte[]&gt; genReport(@RequestBody @Valid ReportRequest reportRequest) {
        AnthropicDocument document = agentSkillsService.genReport(reportRequest);
        return ResponseEntity.ok()
          .contentType(MediaType.parseMediaType(document.mimeType()))
          .header(HttpHeaders.CONTENT_DISPOSITION,
            ContentDisposition.attachment()
              .filename(document.fileName())
              .build()
              .toString())
          .body(document.content());
    }
}</code></pre>
<p>Let&#8217;s introduce a simple placeholder record:</p>
<pre><code class="language-java">public record ReportRequest(@NotNull String prompt) {
}</code></pre>
<p>This holds the prompt message input by the user, which gets passed to the <em>AgentSkillService</em>.</p>
<h3 id="bd-3-agent-skill-service" data-id="3-agent-skill-service">4.3. Agent Skill Service</h3>
<div class="bd-anchor" id="3-agent-skill-service"></div>
<p>Now, we create a service to generate a document using the Anthropic chat model with the pre-built skills. <strong>The Anthropic chat options can support multiple skills. </strong></p>
<p>In this example, we put all the available pre-built skills into the chat model, and employ the user prompt to control what document format we would like to produce. <strong>This aims to demonstrate that the chat model can select the appropriate skill based on the prompt.</strong></p>
<p>However, it&#8217;s usually better to enable the required skills only to reduce the chance of outputting an unpredictable format:</p>
<pre><code class="language-java">@Service
public class AgentSkillsService {
    private final AnthropicChatModel chatModel;
    private final AnthropicApi anthropicApi;
    private final MonthlySalesService monthlySalesService;
    public AgentSkillsService(
      AnthropicChatModel chatModel,
      AnthropicApi anthropicApi, 
      MonthlySalesService monthlySalesService) {
        this.chatModel = chatModel;
        this.anthropicApi = anthropicApi;
        this.monthlySalesService = monthlySalesService;
    }
    public AnthropicDocument genReport(ReportRequest reportRequest) {
        ChatResponse response = ChatClient.create(chatModel)
          .prompt()
          .system( "Given the dataset of monthly sales for our product: " 
            + monthlySalesService.getMonthlySalesForYear(2025))
          .user(reportRequest.prompt())
          .options(AnthropicChatOptions.builder()
            .model("claude-sonnet-4-5")
            .skill(AnthropicApi.AnthropicSkill.DOCX)
            .skill(AnthropicApi.AnthropicSkill.PDF)
            .skill(AnthropicApi.AnthropicSkill.PPTX)
            .skill(AnthropicApi.AnthropicSkill.XLSX)
            maxTokens(4096)
            .build())
          .call()
          .chatResponse();
        List fileIds = AnthropicSkillsResponseHelper.extractFileIds(response);
        if (fileIds.isEmpty()) {
            throw new IllegalStateException("No document was generated by the skill");
        }
        return downloadReport(fileIds.get(0));
    }
    public AnthropicDocument downloadReport(String fileId) {
        AnthropicApi.FileMetadata metadata = anthropicApi.getFileMetadata(fileId);
        byte[] content = anthropicApi.downloadFile(fileId);
        return new AnthropicDocument(metadata.filename(), metadata.mimeType(), content);
    }
}</code></pre>
<p>Notably, <strong>we set the <em>maxTokens</em> to <em>4096</em> to control the maximum amount of content that could be generated in a response</strong>. As a rule of thumb, one (1) token is roughly equal to four (4) characters. In this case, 4096 should be more than sufficient. However, we could extend it to a larger size if we expect a lengthy report.</p>
<p>Once we receive the response from the chat model, we can use the <em>AnthropicSkillsResponseHelper</em> to extract the file ID from that response. This file ID uniquely identifies the generated file stored on the Anthropic server.</p>
<p><strong>Let&#8217;s check the files in the Claude console</strong>:</p>
<a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/wp-content/uploads/2026/05/claude_console_files.jpg"><img loading="lazy" decoding="async" class="alignnone wp-image-244312" src="https://www.baeldung.com/wp-content/uploads/2026/05/claude_console_files.jpg" alt="" width="1056" height="266" /></a>
<p>Thus, <strong>we use the <em>AnthropicAPI</em> provided by Spring AI to obtain the file information based on the file ID</strong>. Of course, the <em>AnthropicApi.FileMetadata</em> contains details about the file:</p>
<ul>
<li>file name</li>
<li>file size</li>
<li>creation date</li>
<li>MIME type</li>
</ul>
<p>While <em>AnthropicDocument</em> is a simple Java record to store the file name, the mime type and the file content, it returns them to the client via the controller:</p>
<pre><code class="language-java">public record AnthropicDocument(String fileName, String, mimeType, byte[] content) {
}</code></pre>
<p>Thus, we have the basic application ready for testing.</p>
<h2 id="bd-test-run" data-id="test-run">5. Test Run</h2>
<div class="bd-anchor" id="test-run"></div>
<p>Everything is set, and we can start testing. To that end, let&#8217;s call the endpoint using Postman to trigger the request.</p>
<h3 id="bd-1-pdf-report" data-id="1-pdf-report">5.1. PDF Report</h3>
<div class="bd-anchor" id="1-pdf-report"></div>
<p>To begin with, <strong>we create an example request for generating a sales report with a summary and a table in PDF format</strong>:</p>
<a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/wp-content/uploads/2026/05/agent-skills-postman-call-01.jpg"><img loading="lazy" decoding="async" class="alignnone wp-image-244314" src="https://www.baeldung.com/wp-content/uploads/2026/05/agent-skills-postman-call-01.jpg" alt="" width="774" height="339" /></a>
<p>At this point, we see the content, including the monthly sales table and a summary in the generated file:</p>
<a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/wp-content/uploads/2026/05/anthropic-skills-docx-sample.jpg"><img loading="lazy" decoding="async" class="alignnone wp-image-242187" src="https://www.baeldung.com/wp-content/uploads/2026/05/anthropic-skills-docx-sample.jpg" alt="" width="853" height="1038" /></a>
<p>So, all information is there and in a structured format.</p>
<h3 id="bd-2-excel-spreadsheet" data-id="2-excel-spreadsheet">5.2. Excel Spreadsheet</h3>
<div class="bd-anchor" id="2-excel-spreadsheet"></div>
<p>Let&#8217;s change the prompt to generate an Excel spreadsheet instead, with a bar chart instead of a summary:</p>
<pre><code class="language-json">{
    "prompt": "Create a Excel spreadsheet for our product monthly sales. Include a monthly sales table, and a monthly bar chart next to the table."
}</code></pre>
<p>Now, the report reflects the format change:</p>
<a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/wp-content/uploads/2026/05/agent-skills-xlsx.jpg"><img loading="lazy" decoding="async" class="alignnone wp-image-244315" src="https://www.baeldung.com/wp-content/uploads/2026/05/agent-skills-xlsx.jpg" alt="" width="954" height="565" /></a>
<p>So, we see the spreadsheet with the correct data and formatting.</p>
<h2 id="bd-conclusion" data-id="conclusion">6. Conclusion</h2>
<div class="bd-anchor" id="conclusion"></div>
<p>In this article, we explored how to integrate the pre-built agent skills of Anthropic with a chat model to generate various documents using Spring AI.</p>
<p>Furthermore, we demonstrated how to use a prompt to control the actual output document format. In particular, this provides flexibility to generate different document formats without changing the application logic.</p>
<p>As usual, the complete code examples are available <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/eugenp/tutorials/tree/master/spring-ai-modules/spring-ai-agent-skills">over on GitHub</a>.</p>The post <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/spring-ai-anthropic-agent-skills">Anthropic Agent Skills Support in Spring AI</a> first appeared on <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com">Baeldung</a>.<Img align="left" border="0" height="1" width="1" alt="" style="border:0;float:left;margin:0;padding:0;width:1px!important;height:1px!important;" hspace="0" src="https://feeds.feedblitz.com/~/i/955766684/0/baeldung">
<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/955766684/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/955766684/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f07%2fJava-Featured-10-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/955766684/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/955766684/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/955766684/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/spring-ai-anthropic-agent-skills#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/spring-ai-anthropic-agent-skills/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</content:encoded>
					
					<wfw:commentRss>https://feeds.feedblitz.com/~/955766684/0/baeldung~Anthropic-Agent-Skills-Support-in-Spring-AI/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<webfeeds:featuredImage>https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-150x150.jpg</webfeeds:featuredImage></item>
<item>
<feedburner:origLink>https://www.baeldung.com/java-weekly-645</feedburner:origLink>
		<title>Java Weekly, Issue 645</title>
		<link>https://feeds.feedblitz.com/~/955547105/0/baeldung~Java-Weekly-Issue</link>
					<comments>https://feeds.feedblitz.com/~/955547105/0/baeldung~Java-Weekly-Issue#respond</comments>
		
		<dc:creator><![CDATA[baeldung]]></dc:creator>
		<pubDate>Fri, 08 May 2026 12:10:36 +0000</pubDate>
				<category><![CDATA[Weekly Review]]></category>
		<category><![CDATA[no-ads]]></category>
		<category><![CDATA[no-after-post]]></category>
		<category><![CDATA[no-before-post]]></category>
		<category><![CDATA[no-optins]]></category>
		<guid isPermaLink="false">https://www.baeldung.com/?p=203726</guid>
					<description><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2016/10/social-Weekly-Reviews-4.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="max-width:100% !important;height:auto !important;float: left; margin-right: 5px;" loading="lazy" /><p>Evolving and adapting in the age of AI - some interesting pieces this week.</p>
The post <a rel="NOFOLLOW" href="https://feeds.feedblitz.com/~/955547105/0/baeldung~Java-Weekly-Issue">Java Weekly, Issue 645</a> first appeared on <a rel="NOFOLLOW" href="https://www.baeldung.com">Baeldung</a>.<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/955547105/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/955547105/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2016%2f10%2fsocial-Weekly-Reviews-4.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/955547105/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/955547105/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/955547105/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/java-weekly-645#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/java-weekly-645/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</description>
										<content:encoded><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2016/10/social-Weekly-Reviews-4.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="float: left; margin-right: 5px;" decoding="async" loading="lazy" srcset="https://www.baeldung.com/wp-content/uploads/2016/10/social-Weekly-Reviews-4.jpg 952w, https://www.baeldung.com/wp-content/uploads/2016/10/social-Weekly-Reviews-4-300x157.jpg 300w, https://www.baeldung.com/wp-content/uploads/2016/10/social-Weekly-Reviews-4-768x402.jpg 768w" sizes="auto, (max-width: 580px) 100vw, 580px" /><h2 style="text-align: left;" id="bd-spring-and-java" data-id="spring-and-java">1.<strong> Spring and Java</strong></h2>
<div class="bd-anchor" id="spring-and-java"></div>
<p><strong><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://blog.jetbrains.com/idea/2026/05/teaching-an-ai-agent-to-debug-flaky-tests/">&gt;&gt; Teaching an AI Agent to Debug Flaky Tests</a></strong> [<span style="color: #993300;">jetbrains.com</span>]</p>
<p>A practical look at how JetBrains is training an AI agent to triage flaky tests. All about pinpointing the actual root cause and proposing a fix, rather than leaving developers to chase intermittent red builds. A interesting data point of where AI tooling is genuinely moving the needle in day-to-day Java development.</p>
<h4><strong>Also worth reading:</strong></h4>
<ul>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://foojay.io/today/boxlang-ai-deep-dive-part-6-of-7-memory-systems-rag-building-ai-that-remembers/" target="_blank" rel="noopener"><strong>BoxLang AI Deep Dive — Part 6 of 7: Memory Systems &amp; RAG</strong></a> [<span style="color: #800000;">foojay.io</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://foojay.io/today/ai-shepherd-senior-developer/" target="_blank" rel="noopener"><strong>The Code Was Always the Door</strong></a> [<span style="color: #800000;">foojay.io</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.infoq.com/news/2026/05/clawrunr/" target="_blank" rel="noopener"><strong>JobRunr Introduces ClawRunr, an Open-Source Java AI Agent</strong></a> [<span style="color: #800000;">infoq.com</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://quarkus.io/blog/introducing-agent-mcp/" target="_blank" rel="noopener"><strong>Introducing Quarkus Agent MCP</strong></a> [<span style="color: #800000;">quarkus.io</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://quarkus.io/blog/semeru-scc/" target="_blank" rel="noopener"><strong>Faster Startup on IBM Semeru with OpenJ9 Shared Classes Cache</strong></a> [<span style="color: #800000;">quarkus.io</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://blog.frankel.ch/design-team-agents/" target="_blank" rel="noopener"><strong>Designing a team of agents</strong></a> [<span style="color: #800000;">frankel.ch</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.wildfly.org/news/2026/05/01/The-HashiCorp-Vault-integration-is-available-for-provisioning-with-WildFly-40-Beta/" target="_blank" rel="noopener"><strong>The HashiCorp Vault integration for WildFly 40 Beta</strong></a> [<span style="color: #800000;">wildfly.org</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://in.relation.to/2026/05/04/hibernate-tools-moves-to-orm/" target="_blank" rel="noopener"><strong>Hibernate Tools Moves to Hibernate ORM—and Eclipse Tooling Retires</strong></a> [<span style="color: #800000;">in.relation.to</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://blog.jooq.org/why-join-using-can-lead-to-errors-in-sql/" target="_blank" rel="noopener"><strong>Why JOIN USING Can Lead to Errors in SQL</strong></a> [<span style="color: #800000;">jooq.org</span>]</li>
</ul>
<h4><strong>Webinars and presentations:</strong></h4>
<ul>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://foojay.io/today/foojay-podcast-94-more-than-a-blog-how-foojay-connects-sustains-and-evolves-the-java-community/" target="_blank" rel="noopener"><strong>Foojay Podcast #94: More Than a Blog</strong></a> [<span style="color: #800000;">foojay.io</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.infoq.com/podcasts/leveraging-quarkus-build-static-sites/" target="_blank" rel="noopener"><strong>Podcast: Roq: Leveraging Quarkus to Build Static Sites at the Speed of Go</strong></a> [<span style="color: #800000;">infoq.com</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://inside.java/2026/05/05/podcast-057/" target="_blank" rel="noopener"><strong>Episode 57 “Make Java Safer with Flexible Constructor Bodies”</strong></a> [<span style="color: #800000;">inside.java</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://spring.io/blog/2026/05/04/spring-office-hours-podcast-S5E14" target="_blank" rel="noopener"><strong>Spring Office Hours Podcast: S5E14 &#8211; Spec Driven Development with Simon Martinelli</strong></a> [<span style="color: #800000;">spring.io</span>]</li>
</ul>
<h4><strong>Time to upgrade:</strong></h4>
<ul>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://blog.jetbrains.com/idea/2026/05/intellij-idea-2025-3-5/" target="_blank" rel="noopener"><strong>IntelliJ IDEA 2025.3.5 is Out!</strong></a> [<span style="color: #800000;">jetbrains.com</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://quarkus.io/blog/quarkus-3-35-released/" target="_blank" rel="noopener"><strong>Quarkus 3.35 &#8211; JAR tree-shaking, PGO for native, Semeru AOT</strong></a> [<span style="color: #800000;">quarkus.io</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://quarkus.io/blog/CVE-2026-39852/" target="_blank" rel="noopener"><strong>Emergency releases to fix CVE-2026-39852 in all supported streams</strong></a> [<span style="color: #800000;">quarkus.io</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.wildfly.org/news/2026/05/01/New-WildFly-40-Beta-release/" target="_blank" rel="noopener"><strong>New WildFly 40 Beta release</strong></a> [<span style="color: #800000;">wildfly.org</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/jetty/jetty.project/releases/tag/jetty-12.1.9" target="_blank" rel="noopener"><strong>Jetty 12.1.9</strong></a> and <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/jetty/jetty.project/releases/tag/jetty-12.0.35" target="_blank" rel="noopener"><strong>12.0.35</strong></a> [<span style="color: #800000;">github.com/jetty</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/elastic/elasticsearch/releases/tag/v9.4.0" target="_blank" rel="noopener"><strong>Elasticsearch 9.4.0</strong></a>, <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/elastic/elasticsearch/releases/tag/v9.3.4" target="_blank" rel="noopener"><strong>9.3.4</strong></a> and <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/elastic/elasticsearch/releases/tag/v8.19.15" target="_blank" rel="noopener"><strong>8.19.15</strong></a> [<span style="color: #800000;">github.com/elastic</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/Netflix/zuul/releases/tag/v3.6.3" target="_blank" rel="noopener"><strong>Zuul 3.6.3</strong></a> [<span style="color: #800000;">github.com/Netflix</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/grails/grails-core/releases/tag/v7.1.1" target="_blank" rel="noopener"><strong>Grails 7.1.1</strong></a> and <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/grails/grails-core/releases/tag/v7.0.11" target="_blank" rel="noopener"><strong>7.0.11</strong></a> [<span style="color: #800000;">github.com/grails</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/micronaut-projects/micronaut-core/releases/tag/v4.10.23" target="_blank" rel="noopener"><strong>Micronaut Core 4.10.23</strong></a> [<span style="color: #800000;">github.com/micronaut-projects</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://openjdk.org/jeps/533" target="_blank" rel="noopener"><strong>JEP 533: Structured Concurrency (Seventh Preview)</strong></a> [<span style="color: #800000;">openjdk.org</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://openjdk.org/jeps/531" target="_blank" rel="noopener"><strong>JEP 531: Lazy Constants (Third Preview)</strong></a> [<span style="color: #800000;">openjdk.org</span>]</li>
</ul>
<h2 style="text-align: left;" id="bd-technical-amp-musings" data-id="technical-amp-musings">2.<strong> Technical &amp; Musings</strong></h2>
<div class="bd-anchor" id="technical-amp-musings"></div>
<h4><strong>Also worth reading:</strong></h4>
<ul>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://lucumr.pocoo.org/2026/5/4/content-for-contents-sake/" target="_blank" rel="noopener"><strong>Content for Content’s Sake</strong></a> [<span style="color: #800000;">lucumr.pocoo.org</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://netflixtechblog.com/democratizing-machine-learning-at-netflix-building-the-model-lifecycle-graph-5cc6d5828bb1" target="_blank" rel="noopener"><strong>Democratizing Machine Learning at Netflix: Building the Model Lifecycle Graph</strong></a> [<span style="color: #800000;">netflixtechblog.com</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://netflixtechblog.com/state-of-routing-in-model-serving-16e22fe18741" target="_blank" rel="noopener"><strong>State of Routing in Model Serving</strong></a> [<span style="color: #800000;">netflixtechblog.com</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://blog.christianposta.com/avoiding-mcp-confused-deputy-with-aauth/" target="_blank" rel="noopener"><strong>Avoiding MCP Confused Deputy With AAuth</strong></a> [<span style="color: #800000;">christianposta.com</span>]</li>
</ul>
<h2 style="text-align: left;" id="bd-pick-of-the-week" data-id="pick-of-the-week">3.<strong> Pick of the Week</strong></h2>
<div class="bd-anchor" id="pick-of-the-week"></div>
<p><strong><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.paulgraham.com/do.html">&gt;&gt; What to Do</a></strong> [<span style="color: #993300;">paulgraham.com</span>]</p>The post <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-weekly-645">Java Weekly, Issue 645</a> first appeared on <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com">Baeldung</a>.<Img align="left" border="0" height="1" width="1" alt="" style="border:0;float:left;margin:0;padding:0;width:1px!important;height:1px!important;" hspace="0" src="https://feeds.feedblitz.com/~/i/955547105/0/baeldung">
<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/955547105/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/955547105/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2016%2f10%2fsocial-Weekly-Reviews-4.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/955547105/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/955547105/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/955547105/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/java-weekly-645#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/java-weekly-645/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</content:encoded>
					
					<wfw:commentRss>https://feeds.feedblitz.com/~/955547105/0/baeldung~Java-Weekly-Issue/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<webfeeds:featuredImage>https://www.baeldung.com/wp-content/uploads/2016/10/social-Weekly-Reviews-4-150x150.jpg</webfeeds:featuredImage></item>
<item>
<feedburner:origLink>https://www.baeldung.com/java-camel-observability-services</feedburner:origLink>
		<title>A Guide to Camel Observability Services</title>
		<link>https://feeds.feedblitz.com/~/955428392/0/baeldung~A-Guide-to-Camel-Observability-Services</link>
					<comments>https://feeds.feedblitz.com/~/955428392/0/baeldung~A-Guide-to-Camel-Observability-Services#respond</comments>
		
		<dc:creator><![CDATA[Emmanouil Varvarigos]]></dc:creator>
		<pubDate>Wed, 06 May 2026 22:20:39 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring Boot]]></category>
		<category><![CDATA[Apache Camel]]></category>
		<category><![CDATA[Micrometer]]></category>
		<category><![CDATA[Observability]]></category>
		<guid isPermaLink="false">https://www.baeldung.com/java-camel-observability-services</guid>
					<description><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-11-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="max-width:100% !important;height:auto !important;float: left; margin-right: 5px;" loading="lazy" /><p>Learn how to monitor a Camel Standalone or Spring Boot application via Apache Camel in Java.</p>
The post <a rel="NOFOLLOW" href="https://feeds.feedblitz.com/~/955428392/0/baeldung~A-Guide-to-Camel-Observability-Services">A Guide to Camel Observability Services</a> first appeared on <a rel="NOFOLLOW" href="https://www.baeldung.com">Baeldung</a>.<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/955428392/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/955428392/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f07%2fJava-Featured-11-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/955428392/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/955428392/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/955428392/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/java-camel-observability-services#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/java-camel-observability-services/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</description>
										<content:encoded><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-11-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="float: left; margin-right: 5px;" decoding="async" loading="lazy" srcset="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-11-1024x536.jpg 1024w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-11-300x157.jpg 300w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-11-768x402.jpg 768w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-11-100x52.jpg 100w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-11.jpg 1200w" sizes="auto, (max-width: 580px) 100vw, 580px" /><h2 id="bd-introduction" data-id="introduction">1. Introduction</h2>
<div class="bd-anchor" id="introduction"></div>
<p><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/apache-camel-intro">Apache Camel</a> is a Java-based integration framework that implements Enterprise Integration Patterns (EIPs).</p>
<p>In this article, we&#8217;ll demonstrate how to use Apache Camel <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/distributed-systems-observability">observability-related</a> components to monitor application health and performance.</p>
<h2 id="bd-maven-dependencies" data-id="maven-dependencies">2. Maven Dependencies</h2>
<div class="bd-anchor" id="maven-dependencies"></div>
<p>The two variants of this application, Spring Boot and Standalone, send spans and traces by utilizing different tools. To that end, it&#8217;s crucial to present the dependency lists separately.</p>
<h3 id="bd-1-spring-boot" data-id="1-spring-boot">2.1. Spring Boot</h3>
<div class="bd-anchor" id="1-spring-boot"></div>
<p>To start, for the Spring Boot examples, we need to define the dependencies for <em>spring-boot-starter</em>, <em>camel-spring-boot-starter</em>, <em>spring-boot-starter-actuator</em>, <em>camel-observation-starter</em>, <em>micrometer</em>, and <em>zipkin</em>:</p>
<pre><code class="language-xml">&lt;dependencies&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
        &lt;artifactId&gt;spring-boot-starter&lt;/artifactId&gt;
        &lt;version&gt;3.5.11&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
        &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
        &lt;version&gt;3.5.11&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.apache.camel.springboot&lt;/groupId&gt;
        &lt;artifactId&gt;camel-spring-boot-starter&lt;/artifactId&gt;
        &lt;version&gt;4.18.0&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
        &lt;artifactId&gt;spring-boot-starter-actuator&lt;/artifactId&gt;
        &lt;version&gt;3.5.11&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
        &lt;artifactId&gt;spring-boot-actuator-autoconfigure&lt;/artifactId&gt;
        &lt;version&gt;3.5.11&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.apache.camel.springboot&lt;/groupId&gt;
        &lt;artifactId&gt;camel-observation-starter&lt;/artifactId&gt;
        &lt;version&gt;4.18.0&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;io.micrometer&lt;/groupId&gt;
        &lt;artifactId&gt;micrometer-tracing&lt;/artifactId&gt;
        &lt;version&gt;1.5.0&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;io.micrometer&lt;/groupId&gt;
        &lt;artifactId&gt;micrometer-tracing-bridge-brave&lt;/artifactId&gt;
        &lt;version&gt;1.5.0&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;io.zipkin.reporter2&lt;/groupId&gt;
        &lt;artifactId&gt;zipkin-reporter-brave&lt;/artifactId&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;io.micrometer&lt;/groupId&gt;
        &lt;artifactId&gt;micrometer-registry-prometheus&lt;/artifactId&gt;
        &lt;version&gt;1.5.0&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;io.micrometer&lt;/groupId&gt;
        &lt;artifactId&gt;micrometer-core&lt;/artifactId&gt;
        &lt;version&gt;1.15.9&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;ch.qos.logback&lt;/groupId&gt;
        &lt;artifactId&gt;logback-core&lt;/artifactId&gt;
        &lt;version&gt;1.5.32&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;ch.qos.logback&lt;/groupId&gt;
        &lt;artifactId&gt;logback-classic&lt;/artifactId&gt;
        &lt;version&gt;1.5.32&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
        &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;
        &lt;scope&gt;test&lt;/scope&gt;
    &lt;/dependency&gt;
&lt;/dependencies&gt;</code></pre>
<p>For the Spring Boot variant, the application generates observations using Micrometer, which the <em>micrometer-tracing-bridge-brave</em> transforms to <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-brave">Brave</a> spans. The <em>zipkin-reporter-brave</em> then sends the transformed spans to the <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://zipkin.io/">Zipkin</a> backend, which is <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.jaegertracing.io/">Jaeger</a> in our case. Finally, the <em>spring-boot-</em><span style="margin: 0px;padding: 0px"><em>actuator-autoconfigure</em> dependency binds everything together by configuring and instantiating the components that send the spans to Jaeger</span>.</p>
<h3 id="bd-2-camel-standalone" data-id="2-camel-standalone">2.2. Camel Standalone</h3>
<div class="bd-anchor" id="2-camel-standalone"></div>
<p>Likewise, for the Camel Standalone application monitoring, we need <em>camel-core</em>, <em>camel-main</em>, <em>camel-observability-services</em>, and <em>camel-opentelemetry2</em>:</p>
<pre><code class="language-xml">&lt;dependency&gt;
    &lt;groupId&gt;org.apache.camel&lt;/groupId&gt;
    &lt;artifactId&gt;camel-core&lt;/artifactId&gt;
    &lt;version&gt;4.17.0&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.camel&lt;/groupId&gt;
    &lt;artifactId&gt;camel-main&lt;/artifactId&gt;
    &lt;version&gt;4.17.0&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.camel&lt;/groupId&gt;
    &lt;artifactId&gt;camel-observability-services&lt;/artifactId&gt;
    &lt;version&gt;4.17.0&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.camel&lt;/groupId&gt;
    &lt;artifactId&gt;camel-opentelemetry2&lt;/artifactId&gt;
    &lt;version&gt;4.17.0&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;ch.qos.logback&lt;/groupId&gt;
    &lt;artifactId&gt;logback-classic&lt;/artifactId&gt;
    &lt;version&gt;1.5.29&lt;/version&gt;
    &lt;scope&gt;compile&lt;/scope&gt;
&lt;/dependency&gt;</code></pre>
<p>In this version, the <em>camel-observability-services</em> dependency provides preconfigured components for exporting traces and health metrics. In the examples, we employ the <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/open-telemetry/opentelemetry-java-instrumentation">OpenTelemetry Java agent</a> to send the traces to Jaeger.</p>
<h2 id="bd-application-under-monitoring" data-id="application-under-monitoring">3. Application Under Monitoring</h2>
<div class="bd-anchor" id="application-under-monitoring"></div>
<p>Now, let&#8217;s ensure we have a subject for the observations. To begin with, <strong>we create an application that reads XML files from a directory, processes them by adding the current timestamp, and copies them to another directory</strong>.</p>
<p>In a Camel application, Routes define how data is processed, and the <em>RouteBuilder</em> interface enables us to configure the application routes using <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://camel.apache.org/manual/java-dsl.html">Java-DSL</a>. Before we create the <em>RouteBuilder</em>, let&#8217;s write the <em>SimpleProcessor</em>, which gets utilized by the <em>RouteBuilder</em>, and is identical for both application variants:</p>
<pre><code class="language-java">public class SimpleProcessor implements Processor {
    private static final DocumentBuilderFactory factory = DocumentBuilderFactory.newDefaultInstance();
    @Override
    public void process(Exchange exchange) throws Exception {
        String body = exchange.getMessage().getBody(String.class);
        String processedAt = LocalDateTime.now().toString();
        InputStream stream = new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8));
        Document document = factory.newDocumentBuilder().parse(stream);
        Element root = document.getDocumentElement();
        Element newElemeent = document.createElement("processed");
        newElemeent.setTextContent(processedAt);
        root.appendChild(newElemeent);
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        StringWriter stringWriter = new StringWriter();
        transformer.transform(new DOMSource(document), new StreamResult(stringWriter));
        String newBody = stringWriter.toString();
        exchange.getMessage().setBody(newBody);
    }
}</code></pre>
<p>With the processor in place, <strong>it&#8217;s now time to write the <em>RouteBuilder</em> component, which is almost the same for both Spring Boot and Standalone applications</strong>, except for the dependency injection code. Moreover, the Spring Boot <em>RouteBuilder</em>, named <em>SimpleRouteBuilder</em>, uses the constructor injection approach:</p>
<pre><code class="language-java">public class SimpleRouteBuilder extends RouteBuilder {
    private final SimpleProcessor simpleProcessor;
    @Autowired
    public SimpleRouteBuilder(SimpleProcessor simpleProcessor) {
        this.simpleProcessor = simpleProcessor;
    }
    public void configure() {
        from("file://src/data?noop=true")
          .choice()
          .when(xpath("/person/city = 'London'"))
            .log("UK message")
            .to("file:target/messages/uk")
            .log("UK message 2")
            .process(simpleProcessor)
            .to("file:target/messages/general-sink")
          .otherwise()
            .log("Other message")
            .to("file:target/messages/others")
            .log("Other message 2")
            .process(simpleProcessor)
            .to("file:target/messages/general-sink");
    }
}</code></pre>
<p>For the Standalone application <em>RouteBuilder</em>, we use the <em>@BeanInject</em> annotation, which injects a registered component from the Camel <em>Registry</em>:</p>
<pre><code class="language-java">public class SimpleRouteBuilder extends RouteBuilder {
    @BeanInject("SimpleProcessor")
    SimpleProcessor simpleProcessor;
// the rest of the file is the same as the Spring Boot SimpleRouteBuilder</code></pre>
<p>Finally, <strong>we implement the application that combines all the moving parts</strong>. Let&#8217;s start by writing the <em>@SpringBootApplication</em> annotated main class:</p>
<pre><code class="language-java">@CamelObservation
@SpringBootApplication
public class CamelSpringBootApplication {
	public static void main(String[] args) {
            SpringApplication.run(FirstCamelSpringBootApplication.class, args);
	}
	@Bean
	SimpleProcessor simpleProcessor() {
	    return new SimpleProcessor();
	}
	@Bean
	SimpleRouteBuilder simpleRouteBuilder(SimpleProcessor simpleProcessor) {
	    return new SimpleRouteBuilder(simpleProcessor);
	}
}</code></pre>
<p>The <em>CamelSpringBootApplication</em> is annotated with the <em>@CamelObservation</em> annotation and defines the required Spring beans. Additionally, <strong>the <em>@CamelObservation</em> annotation, which is included in the <em>camel-observation-starter</em> dependency, configures Micrometer Observation to generate metrics and traces for Camel routes</strong>.</p>
<p>Similarly, in the Standalone application that we called <em>MainApp</em>, we configure the Camel context using <em>SimpleRouteBuilder</em> and <em>SimpleProcessor</em>:</p>
<pre><code class="language-java">public class MainApp {
    public static void main(String... args) throws Exception {
        Main main = new Main();
        main.configure().addRoutesBuilder(new SimpleRouteBuilder());
        main.bind("SimpleProcessor", new SimpleProcessor());
        main.run(args);
    }
}</code></pre>
<p>Furthermore, to execute the <em>MainApp.main()</em> method, we configure the <em>camel-maven-plugin</em>:</p>
<pre><code class="language-xml">&lt;plugin&gt;
    &lt;groupId&gt;org.apache.camel&lt;/groupId&gt;
    &lt;artifactId&gt;camel-maven-plugin&lt;/artifactId&gt;
    &lt;version&gt;3.18.4&lt;/version&gt;
    &lt;configuration&gt;
        &lt;logClasspath&gt;true&lt;/logClasspath&gt;
        &lt;mainClass&gt;com.baeldung.camel.observability.MainApp&lt;/mainClass&gt;
    &lt;/configuration&gt;
&lt;/plugin&gt;</code></pre>
<p>Indeed, <em>camel-maven-plugin</em> enables us to start the Camel Standalone application by executing a simple <em>mvn</em> command:</p>
<pre><code class="language-bash">mvn camel:run</code></pre>
<p>Also, let&#8217;s enable <em>opentelemetry2</em> components via config properties in the <em>application.yml</em>:</p>
<pre><code class="language-yaml">camel:
  opentelemetry2:
    enabled: true
    trace-processors: true
    trace-headers-inclusion: true</code></pre>
<p>Lastly, to ensure that every application interaction gets reported, sampling probability needs tweaking as well:</p>
<pre><code class="language-yaml">management:
  tracing:
    sampling:
      probability: 1.0</code></pre>
<p>On the other hand, the Standalone variant requires only the <em>opentelemetry2</em> enablement:</p>
<pre><code class="language-properties">camel.opentelemetry2.enabled=true</code></pre>
<p>Thus, we should be ready for monitoring.</p>
<h2 id="bd-monitoring-setup-and-presentation" data-id="monitoring-setup-and-presentation">4. Monitoring Setup and Presentation</h2>
<div class="bd-anchor" id="monitoring-setup-and-presentation"></div>
<p>Conveniently, we monitor traces on the Jaeger server for both application variants.</p>
<h3 id="bd-1-jaeger-deployment" data-id="1-jaeger-deployment">4.1. Jaeger Deployment</h3>
<div class="bd-anchor" id="1-jaeger-deployment"></div>
<p>Let&#8217;s deploy the Jaeger server as a Docker container:</p>
<pre><code class="language-bash">docker run --name jaeger -p 16686:16686 -p 4317:4317 -p 4318:4318 -p 5778:5778 -p 9411:9411 cr.jaegertracing.io/jaegertracing/jaeger:2.15.0</code></pre>
<p>This way, we can have a ready deployment without the hassle of manual setup.</p>
<h3 id="bd-2-spring-boot" data-id="2-spring-boot">4.2. Spring Boot</h3>
<div class="bd-anchor" id="2-spring-boot"></div>
<p>There are no additional steps needed for the Spring Boot application monitoring, so let&#8217;s start the application:</p>
<pre><code class="language-bash">mvn spring-boot:run</code></pre>
<p>Now, it&#8217;s time to navigate to Jaeger&#8217;s dashboard to find the traces. The dashboard URL is <em>http://localhost:16686</em>. To find the relevant traces, we use the application name as a service filter and <em>file</em> as the operation filter:</p>
<a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/wp-content/uploads/2026/05/Jaeger-Dashboard-Overview.png"><img loading="lazy" decoding="async" class="alignnone wp-image-203696" src="https://www.baeldung.com/wp-content/uploads/2026/05/Jaeger-Dashboard-Overview-1024x467.png" alt="Jaeger Dashboard Overview" width="989" height="451" srcset="https://www.baeldung.com/wp-content/uploads/2026/05/Jaeger-Dashboard-Overview-1024x467.png 1024w, https://www.baeldung.com/wp-content/uploads/2026/05/Jaeger-Dashboard-Overview-300x137.png 300w, https://www.baeldung.com/wp-content/uploads/2026/05/Jaeger-Dashboard-Overview-768x350.png 768w, https://www.baeldung.com/wp-content/uploads/2026/05/Jaeger-Dashboard-Overview-1536x701.png 1536w, https://www.baeldung.com/wp-content/uploads/2026/05/Jaeger-Dashboard-Overview-100x46.png 100w, https://www.baeldung.com/wp-content/uploads/2026/05/Jaeger-Dashboard-Overview-600x274.png 600w, https://www.baeldung.com/wp-content/uploads/2026/05/Jaeger-Dashboard-Overview.png 1832w" sizes="auto, (max-width: 989px) 100vw, 989px" /></a>
<p>&nbsp;</p>
<p>Subsequently, by clicking and expanding the first trace, we can inspect its contents in detail:</p>
<a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/wp-content/uploads/2026/05/Parent-Trace-Details.png"><img loading="lazy" decoding="async" width="989" height="1009" class="alignnone size-full wp-image-203697" src="https://www.baeldung.com/wp-content/uploads/2026/05/Parent-Trace-Details.png" alt="Parent Trace Details" srcset="https://www.baeldung.com/wp-content/uploads/2026/05/Parent-Trace-Details.png 989w, https://www.baeldung.com/wp-content/uploads/2026/05/Parent-Trace-Details-294x300.png 294w, https://www.baeldung.com/wp-content/uploads/2026/05/Parent-Trace-Details-768x784.png 768w, https://www.baeldung.com/wp-content/uploads/2026/05/Parent-Trace-Details-100x102.png 100w, https://www.baeldung.com/wp-content/uploads/2026/05/Parent-Trace-Details-600x612.png 600w" sizes="auto, (max-width: 989px) 100vw, 989px" /></a>
<p>&nbsp;</p>
<p>The nested spans contain the individual file operations:</p>
<a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/wp-content/uploads/2026/05/Detailed-Span-Information.png"><img loading="lazy" decoding="async" width="989" height="1009" class="alignnone size-full wp-image-203698" src="https://www.baeldung.com/wp-content/uploads/2026/05/Detailed-Span-Information.png" alt="Detailed Span Information" srcset="https://www.baeldung.com/wp-content/uploads/2026/05/Detailed-Span-Information.png 989w, https://www.baeldung.com/wp-content/uploads/2026/05/Detailed-Span-Information-294x300.png 294w, https://www.baeldung.com/wp-content/uploads/2026/05/Detailed-Span-Information-768x784.png 768w, https://www.baeldung.com/wp-content/uploads/2026/05/Detailed-Span-Information-100x102.png 100w, https://www.baeldung.com/wp-content/uploads/2026/05/Detailed-Span-Information-600x612.png 600w" sizes="auto, (max-width: 989px) 100vw, 989px" /></a>
<p>&nbsp;</p>
<p>Once again, it&#8217;s important to mention that all this functionality is the out-of-the-box behavior of the dependencies we&#8217;ve used.</p>
<h3 id="bd-2-standalone" data-id="2-standalone">4.2. Standalone</h3>
<div class="bd-anchor" id="2-standalone"></div>
<p>To enable tracing for the Standalone application, let&#8217;s use a slightly different <em>mvn</em> command, so that the <em>opentelemetry-java</em> agent sends traces to Jaeger:</p>
<pre><code class="language-bash">MAVEN_OPTS="-javaagent:path/to/opentelemetry-javaagent.jar -Dotel.service.name=camel-standalone" mvn camel:run</code></pre>
<p>In the Jaeger dashboard, we use the Camel Standalone application name as a value for the service filter:</p>
<a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/wp-content/uploads/2026/05/Jaeger-Dashboard-for-Camel-Standalone.png"><img loading="lazy" decoding="async" width="989" height="1009" class="alignnone size-full wp-image-203699" src="https://www.baeldung.com/wp-content/uploads/2026/05/Jaeger-Dashboard-for-Camel-Standalone.png" alt="Jaeger Dashboard for Camel Standalone" srcset="https://www.baeldung.com/wp-content/uploads/2026/05/Jaeger-Dashboard-for-Camel-Standalone.png 989w, https://www.baeldung.com/wp-content/uploads/2026/05/Jaeger-Dashboard-for-Camel-Standalone-294x300.png 294w, https://www.baeldung.com/wp-content/uploads/2026/05/Jaeger-Dashboard-for-Camel-Standalone-768x784.png 768w, https://www.baeldung.com/wp-content/uploads/2026/05/Jaeger-Dashboard-for-Camel-Standalone-100x102.png 100w, https://www.baeldung.com/wp-content/uploads/2026/05/Jaeger-Dashboard-for-Camel-Standalone-600x612.png 600w" sizes="auto, (max-width: 989px) 100vw, 989px" /></a>
<p>&nbsp;</p>
<p>As expected, the span contents for the Camel Standalone application are no different from the Spring Boot application spans.</p>
<h2 id="bd-conclusion" data-id="conclusion">5. Conclusion</h2>
<div class="bd-anchor" id="conclusion"></div>
<p>In this article, we demonstrated how to configure a Camel application to generate and send traces to a Jaeger server.</p>
<p>Specifically, we provided examples for both Spring Boot and Camel Standalone applications to ensure a good comparison between the two variants.</p>
<p>In summary, with the proper setup and regardless of the application architecture, using Apache Camel is a fairly straightforward way to monitor an application.</p>The post <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-camel-observability-services">A Guide to Camel Observability Services</a> first appeared on <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com">Baeldung</a>.<Img align="left" border="0" height="1" width="1" alt="" style="border:0;float:left;margin:0;padding:0;width:1px!important;height:1px!important;" hspace="0" src="https://feeds.feedblitz.com/~/i/955428392/0/baeldung">
<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/955428392/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/955428392/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f07%2fJava-Featured-11-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/955428392/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/955428392/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/955428392/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/java-camel-observability-services#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/java-camel-observability-services/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</content:encoded>
					
					<wfw:commentRss>https://feeds.feedblitz.com/~/955428392/0/baeldung~A-Guide-to-Camel-Observability-Services/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<webfeeds:featuredImage>https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-11-150x150.jpg</webfeeds:featuredImage></item>
<item>
<feedburner:origLink>https://www.baeldung.com/junit5-gradle-parallel-testing</feedburner:origLink>
		<title>Parallel Testing With Gradle and JUnit 5</title>
		<link>https://feeds.feedblitz.com/~/955344461/0/baeldung~Parallel-Testing-With-Gradle-and-JUnit</link>
					<comments>https://feeds.feedblitz.com/~/955344461/0/baeldung~Parallel-Testing-With-Gradle-and-JUnit#respond</comments>
		
		<dc:creator><![CDATA[Marcin Buczkowski]]></dc:creator>
		<pubDate>Tue, 05 May 2026 22:53:11 +0000</pubDate>
				<category><![CDATA[Gradle]]></category>
		<category><![CDATA[JUnit 5]]></category>
		<guid isPermaLink="false">https://www.baeldung.com/junit5-gradle-parallel-testing</guid>
					<description><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="max-width:100% !important;height:auto !important;float: left; margin-right: 5px;" loading="lazy" /><p>Learn how to perform parallel testing with Gradle and understand why this is well-suited for speeding up independent test runs.</p>
The post <a rel="NOFOLLOW" href="https://feeds.feedblitz.com/~/955344461/0/baeldung~Parallel-Testing-With-Gradle-and-JUnit">Parallel Testing With Gradle and JUnit 5</a> first appeared on <a rel="NOFOLLOW" href="https://www.baeldung.com">Baeldung</a>.<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/955344461/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/955344461/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f07%2fJava-Featured-10-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/955344461/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/955344461/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/955344461/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/junit5-gradle-parallel-testing#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/junit5-gradle-parallel-testing/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</description>
										<content:encoded><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="float: left; margin-right: 5px;" decoding="async" loading="lazy" srcset="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-1024x536.jpg 1024w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-300x157.jpg 300w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-768x402.jpg 768w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-100x52.jpg 100w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10.jpg 1200w" sizes="auto, (max-width: 580px) 100vw, 580px" /><h2 id="bd-overview" data-id="overview">1. Overview</h2>
<div class="bd-anchor" id="overview"></div>
<p>Testing is an essential part of the application build process. Of course, it takes time, so we should look for ways to speed it up. The obvious way is to leverage multi-core processors and run tests in parallel.</p>
<p>In this tutorial, we&#8217;ll learn how to perform parallel testing with <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/gradle">Gradle</a>.</p>
<h2 id="bd-the-gradle-setup" data-id="the-gradle-setup">2. The Gradle Setup</h2>
<div class="bd-anchor" id="the-gradle-setup"></div>
<p>Throughout this article, we&#8217;ll use Gradle version 9.</p>
<p>First, let&#8217;s set it up for parallel testing. We&#8217;ll start with the <em>gradle.build</em> file:</p>
<pre><code class="language-java">plugins {
    id 'java-library'
}
test {
    maxParallelForks = (int) (Runtime.runtime.availableProcessors() / 2 + 1)
    useJUnitPlatform {
        includeTags testForGradleTag
    }
}
repositories {
    mavenCentral()
}
dependencies {
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
    testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'
}</code></pre>
<p><strong>Note the <em>maxParallelForks</em> property set to the number of threads that will execute the tests in parallel.</strong> We use the Java<em><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Runtime.html"> Runtime</a> availableProcessors()</em> function to assign half and one available cores for tests.</p>
<p>Next, with the <em>useJUnitPlatform</em> property, we invoke and configure the <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/junit-5">JUnit 5 test environment</a>. We use <em>includeTags </em>to allow <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/junit-filtering-tests">filtering tests by the <em>@Tag</em></a> annotation. To complete the configuration, we need to set the Gradle <em>testForGradleTag</em> property to its default value. Let&#8217;s do that in the <em>gradle.properties</em> file:</p>
<pre><code class="language-properties">testForGradleTag=serial</code></pre>
<p>With this default setting, we&#8217;ll run only tests marked with the <em>@Tag(&#8220;serial&#8221;)</em> annotation. It&#8217;s an optional setting designed to make the testing more straightforward for us. It has nothing to do with Gradle test forking.</p>
<h2 id="bd-how-it-works" data-id="how-it-works">3. How It Works</h2>
<div class="bd-anchor" id="how-it-works"></div>
<p>To understand how parallel testing works, let&#8217;s create a test class called <em>UnitTestClass1</em>.</p>
<p><strong>First, let&#8217;s prepare the functions to measure the execution time of a particular test and the whole suite:</strong></p>
<pre><code class="language-java">@Tag("parallel")
@Tag("UnitTest")
public class UnitTestClass1 {
    private long start;
    private static long startAll;
    @BeforeAll
    static void beforeAll() {
        startAll = Instant.now().toEpochMilli();
    }
    @AfterAll
    static void afterAll() {
        long endAll = Instant.now().toEpochMilli();
        System.out.println("Total time: " + (endAll - startAll) + " ms");
    }
    @BeforeEach
    void setUp() {
        start = Instant.now().toEpochMilli();
    }
    private LocalTime localTimeFromMilli(long time) {
        return Instant.ofEpochMilli(time)
          .atZone(ZoneId.systemDefault())
          .toLocalTime();
    }
}</code></pre>
<p><strong>Next, let&#8217;s add four test methods, annotated with <em>@Test</em>.</strong> We name them <em>whenAny_thenCorrect1()</em> through <em>whenAny_thenCorrect4()</em>. Here is the first one:</p>
<pre><code class="language-java">@Test
public void whenAny_thenCorrect1() throws InterruptedException {
    Thread.sleep(1000L);
    assertTrue(true);
}</code></pre>
<p>At this moment, they&#8217;re identical and do nothing but sleep for one second.</p>
<p>Finally, the <em>tearDown()</em> method provides test statistics:</p>
<pre><code class="language-java">@AfterEach
void tearDown(TestInfo testInfo) {
    long end = Instant.now().toEpochMilli();
    String name = testInfo.getDisplayName();
    System.out.println("Test " + name + " from class " + getClass().getSimpleName() +
      " started at " + localTimeFromMilli(start) + " ended at " + localTimeFromMilli(end) + 
      ": (" + (end - start) + " ms)");
}</code></pre>
<p>We report both the test display name and the test class name to track the execution order.</p>
<h3 id="bd-1-one-test-class" data-id="1-one-test-class">3.1. One Test Class</h3>
<div class="bd-anchor" id="1-one-test-class"></div>
<p>To test only one class, let&#8217;s change the annotation of <em>UnitTestClass1</em> to <em>serial</em>:</p>
<pre><code class="language-java">@Tag("serial")
@Tag("UnitTest")
public class UnitTestClass1</code></pre>
<p>Then, we can start this class test with Gradle:</p>
<pre><code class="language-bash">$ ./gradlew -i cleanTest test -PtestForGradleTag=serial | grep "Test whenAny"</code></pre>
<p>We start <em>./gradlew</em> with the <em>-i</em> option for the <em>info</em> debug level. Then we filter the output of the <em>tearDown()</em> method with <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/linux/common-text-search"><em>grep</em></a>. Let&#8217;s study this output:</p>
<img decoding="async" src="https://www.baeldung.com/wp-content/uploads/2026/03/Serial_testing_with_Gradle-1.png" />
<p><strong>We see that individual test methods are run in serial, one after another.</strong> It&#8217;s clearly visible when we compare the start times of subsequent test methods, in the yellow frame.</p>
<h3 id="bd-2-many-test-classes" data-id="2-many-test-classes">3.2. Many Test Classes</h3>
<div class="bd-anchor" id="2-many-test-classes"></div>
<p><strong>To benefit from the parallel testing, we need many test classes, not methods.</strong> So, let&#8217;s just copy our <em>UnitTestClass1</em> three times. We number new classes from <em>2</em> to <em>4</em> and ensure they&#8217;re annotated with <em>@Tag(&#8220;parallel&#8221;).</em> Then, we start the test again:</p>
<pre><code class="language-bash">$ ./gradlew -i cleanTest test -PtestForGradleTag=parallel -PtestForGradleTag=UnitTest | grep "Test whenAny"</code></pre>
<img decoding="async" src="https://www.baeldung.com/wp-content/uploads/2026/03/Parallel_testing_with_Gradle-1.png" />
<p>Now we have 16 test runs. <strong>When we go through the logs in chronological order, we see that test methods of different classes started almost simultaneously.</strong> So, Gradle runs three threads in parallel. On the other hand, if we sort out the output of one class, we find out that its methods are called in serial, as in the example with one class.</p>
<h2 id="bd-working-with-resources" data-id="working-with-resources">4. Working With Resources</h2>
<div class="bd-anchor" id="working-with-resources"></div>
<p><strong>When the test calls for a resource, we should guarantee a clear distinction between independent test runs.</strong> Let&#8217;s take a look at a simple class designed to create a folder:</p>
<pre><code class="language-java">public class FolderCreator {
    Boolean createFolder(Path path, String name) throws IOException {
        String newFolder = path.toAbsolutePath() + name;
        File f = new File(newFolder);
        return f.mkdir();
    }
}</code></pre>
<p>The <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-create-directory"><em>mkdir()</em></a> function returns <em>false</em> if folder creation failed. It may happen if the folder already exists.</p>
<h3 id="bd-1-the-integration-test" data-id="1-the-integration-test">4.1. The Integration Test</h3>
<div class="bd-anchor" id="1-the-integration-test"></div>
<p>Let&#8217;s test this method with the <em>TestFolderCreator1</em> test class. As we interact with the operating system, we tagged this test as <em>integration</em>:</p>
<pre><code class="language-java">@Tag("parallel")
@Tag("integration")
public class TestFolderCreator1 {
    //time reporting helper functions as in UnitTestClass1
    private Path baseFolder = Paths.get(
      getClass()
      .getResource("/")
      .getPath());
    private Integer workerID = Integer.valueOf(System.getProperty("org.gradle.test.worker", "1"));
    private String testFolderName = "/" + "Test_" + workerID;
    @BeforeEach
    void setUp() {
        start = Instant.now().toEpochMilli();
        //preemptive clean up with helper function
        removeTestFolder();
    }
    private void removeTestFolder() {
        File folder = new File(
          baseFolder.toFile()
          .getAbsolutePath() + testFolderName);
        folder.delete();
    }
}
</code></pre>
<p>The structure of this class is similar to that of <em>UnitTestClass1</em>. However, in the <em>setUp()</em> method, we ensure that the test folder doesn&#8217;t exist, preemptively removing it.</p>
<p>Now let&#8217;s look at the test function <em>whenCreated_ThenCorrect()</em>:</p>
<pre><code class="language-java">@Test
void whenCreated_ThenCorrect() throws IOException, InterruptedException {
    FolderCreator folderCreator = new FolderCreator();
    assertTrue(folderCreator.createFolder(baseFolder, testFolderName));
    Thread.sleep(1000L);
}</code></pre>
<p>It asserts that the folder creation is successful. Unlike in the previous example, we have only one test function now.</p>
<p>Finally comes the <em>tearDown()</em> function:</p>
<pre><code class="language-java">@AfterEach
void tearDown(TestInfo testInfo) {
    long end = Instant.now().toEpochMilli();
    System.out.println(
        "Class " + getClass().getSimpleName() + " checks folder " + testFolderName +
          " started at " + localTimeFromMilli(start) + " ended at " + localTimeFromMilli(end) +
          ": (" + (end - start) + " ms)");
    //clean up with helper function
    removeTestFolder();
}</code></pre>
<p>Note that this function removes the test folder after each test run. <strong>This is enough housekeeping in the serial testing scenarios.</strong></p>
<h3 id="bd-2-multiple-workers-for-parallel-test" data-id="2-multiple-workers-for-parallel-test">4.2. Multiple Workers for Parallel Test</h3>
<div class="bd-anchor" id="2-multiple-workers-for-parallel-test"></div>
<p>In a parallel case, we need to ensure that different threads don&#8217;t try to create the same folder.<strong> We accomplished that by reading the worker ID, set by Gradle in the <em>org.gradle.test.worker</em> system property:</strong></p>
<pre><code class="language-java">System.getProperty("org.gradle.test.worker", "1")</code></pre>
<p>With this ID, we could make up different folder names for each working thread.</p>
<p>As before, we create four copies of this class. Then, we run the test passing the additional <em>integration</em> tag to <em>./gradlew</em>:</p>
<pre><code class="language-bash">$ ./gradlew -i cleanTest test -PtestForGradleTag=parallel -PtestForGradleTag=integration | grep "Class TestFolder"</code></pre>
<p>Let&#8217;s track the dependency between the test folder name and the worker thread in the output:</p>
<img decoding="async" src="https://www.baeldung.com/wp-content/uploads/2026/03/Folder_creation_test.png" />
<p>We see that during one parallel run with three threads, each class has its own worker ID. However, after the worker pool is exhausted, ID equal to <em>373</em> is reused.</p>
<h2 id="bd-the-static-horror" data-id="the-static-horror">5. The Static Horror</h2>
<div class="bd-anchor" id="the-static-horror"></div>
<p>Now, let&#8217;s examine an example of testing the function that relies on the application&#8217;s static state. We&#8217;ll use a simple <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-singleton">Singleton pattern</a> implementation:</p>
<pre><code class="language-java">public final class ClassSingleton {
    public String info = "Initial info class";
    private static ClassSingleton INSTANCE;
    private static int count = 0;
    private ClassSingleton() {
    }
    public static ClassSingleton getINSTANCE() {
        return INSTANCE;
    }
    public int getCount() {
        return count;
    }
    public static ClassSingleton getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new ClassSingleton();
        }
        count++;
        return INSTANCE;
    }
    // more features below ...
}</code></pre>
<p>We see the <em>count</em> field, which accumulates how many times the instance of <em>ClassSingleton</em> is requested.</p>
<p><strong>Then, we&#8217;ll want to test if this counter is set correctly.</strong> So, let&#8217;s do that with:</p>
<pre><code class="language-java">@Test
public void whenOneRequest_thenSuccess() throws InterruptedException {
    ClassSingleton testSingleton = ClassSingleton.getInstance();
    assertEquals(1, testSingleton.getCount());
    Thread.sleep(1000L);
}</code></pre>
<p>This test will fail. Or it will not fail. Or sometimes it fails, and sometimes it doesn&#8217;t. <strong>Playing with the number of test classes and threads, we can see that it&#8217;s simply unpredictable, therefore somewhat useless.</strong></p>
<h3 id="bd-1-how-to-fix-it" data-id="1-how-to-fix-it">5.1. How to Fix It</h3>
<div class="bd-anchor" id="1-how-to-fix-it"></div>
<p>This behaviour arises because static variables are defined within the <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jvm-vs-jre-vs-jdk">Java Virtual Machine</a> (JVM) scope. Such a virtual machine is started separately for each thread. <strong>However, test classes may retake the same thread.</strong> So, we can&#8217;t expect <em>count</em> to be equal to one if we run the <em>testSingleton()</em> function multiple times.</p>
<p>To make things even worse, we made <em>count</em> a private field and provided no setter for it. Therefore, we have no way to set the singleton state before the test (no matter how much sense it&#8217;d make).</p>
<p><strong>Gradle comes to the rescue with the <em>forkEvery</em> property, which says how often the new thread should be started.</strong> If we set it to one, each test class will have its own thread and also its own JVM. To set this property, we need to edit the &#8216;<em>test</em>&#8216; section in th<em>e gradle.build</em> file:</p>
<pre><code class="language-bash">test {
    maxParallelForks = (int) (Runtime.runtime.availableProcessors() / 2 + 1)
    forkEvery = 1
    useJUnitPlatform {
        includeTags testForGradleTag
    }
}</code></pre>
<p>Now our singleton test will always succeed. Moreover, this feature isn&#8217;t limited to parallel testing. <strong>If we touch on the static context in many test cases, we may also need it in the serial testing scenarios.</strong> We only need to locate tests in different classes.</p>
<p>Finally, we should be aware that starting a new JVM for each test class slows down the tests. We can disable this feature by setting <em>forkEvery</em> to <em>0</em>, which is its default value.</p>
<h2 id="bd-conclusion" data-id="conclusion">6. Conclusion</h2>
<div class="bd-anchor" id="conclusion"></div>
<p>In this article, we learned how to run parallel tests in Gradle. First, we configured Gradle for such a task. Then, we examined how the tests are performed. <strong>Based on this, we concluded that tests are parallel based on the test class rather than the method.</strong></p>
<p>Next, we took a look at cases that are particularly troublesome in parallel testing. This included access to resources and handling the static state of the tested application. We saw how Gradle mitigated these problems.</p>
<p>Finally, we can regard parallel testing with Gradle as well-suited to speed up independent test runs.</p>
<p>As always, the code for the examples is available <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/eugenp/tutorials/tree/master/gradle-modules/gradle-parallel-testing">over on GitHub</a>.</p>The post <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/junit5-gradle-parallel-testing">Parallel Testing With Gradle and JUnit 5</a> first appeared on <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com">Baeldung</a>.<Img align="left" border="0" height="1" width="1" alt="" style="border:0;float:left;margin:0;padding:0;width:1px!important;height:1px!important;" hspace="0" src="https://feeds.feedblitz.com/~/i/955344461/0/baeldung">
<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/955344461/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/955344461/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f07%2fJava-Featured-10-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/955344461/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/955344461/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/955344461/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/junit5-gradle-parallel-testing#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/junit5-gradle-parallel-testing/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</content:encoded>
					
					<wfw:commentRss>https://feeds.feedblitz.com/~/955344461/0/baeldung~Parallel-Testing-With-Gradle-and-JUnit/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<webfeeds:featuredImage>https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-150x150.jpg</webfeeds:featuredImage></item>
<item>
<feedburner:origLink>https://www.baeldung.com/jdbc-series</feedburner:origLink>
		<title>JDBC Series</title>
		<link>https://feeds.feedblitz.com/~/955198892/0/baeldung~JDBC-Series</link>
					<comments>https://feeds.feedblitz.com/~/955198892/0/baeldung~JDBC-Series#respond</comments>
		
		<dc:creator><![CDATA[baeldung]]></dc:creator>
		<pubDate>Mon, 04 May 2026 07:42:55 +0000</pubDate>
				<category><![CDATA[Persistence]]></category>
		<category><![CDATA[Series]]></category>
		<category><![CDATA[JDBC]]></category>
		<guid isPermaLink="false">https://www.baeldung.com/?p=203641</guid>
					<description><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/11/Persistence-Featured-Image-04-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="max-width:100% !important;height:auto !important;float: left; margin-right: 5px;" loading="lazy" /><p>This series covers core JDBC operations from fundamentals to practical patterns.</p>
The post <a rel="NOFOLLOW" href="https://feeds.feedblitz.com/~/955198892/0/baeldung~JDBC-Series">JDBC Series</a> first appeared on <a rel="NOFOLLOW" href="https://www.baeldung.com">Baeldung</a>.<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/955198892/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/955198892/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f11%2fPersistence-Featured-Image-04-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/955198892/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/955198892/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/955198892/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/jdbc-series#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/jdbc-series/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</description>
										<content:encoded><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/11/Persistence-Featured-Image-04-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="float: left; margin-right: 5px;" decoding="async" loading="lazy" srcset="https://www.baeldung.com/wp-content/uploads/2024/11/Persistence-Featured-Image-04-1024x536.jpg 1024w, https://www.baeldung.com/wp-content/uploads/2024/11/Persistence-Featured-Image-04-300x157.jpg 300w, https://www.baeldung.com/wp-content/uploads/2024/11/Persistence-Featured-Image-04-768x402.jpg 768w, https://www.baeldung.com/wp-content/uploads/2024/11/Persistence-Featured-Image-04-100x52.jpg 100w, https://www.baeldung.com/wp-content/uploads/2024/11/Persistence-Featured-Image-04-600x314.jpg 600w, https://www.baeldung.com/wp-content/uploads/2024/11/Persistence-Featured-Image-04.jpg 1200w" sizes="auto, (max-width: 580px) 100vw, 580px" /><p>JDBC (Java Database Connectivity) is the foundational API for relational database access in Java, sitting beneath all higher-level abstractions like JPA and Spring Data. Understanding how to connect, query, manage transactions, and handle results at the JDBC level gives us precise control over database interactions and a solid foundation for troubleshooting any data-access layer.</p>
<p>This series covers <strong>core JDBC operations from fundamentals to practical patterns</strong>, organized by concern: from setting up connections and connection pools, through executing statements and working with result sets, managing schemas and metadata, and diagnosing common errors.</p>
<h2 id="bd-getting-started-with-jdbc" data-id="getting-started-with-jdbc"><img loading="lazy" decoding="async" class=" wp-image-196308 alignnone" src="https://baeldung.com/wp-content/uploads/2024/10/main-site-icons-10.png" alt="generic code" width="52" height="52" /> Getting Started with JDBC</h2>
<div class="bd-anchor" id="getting-started-with-jdbc"></div>
<hr style="margin-top: -50px" />
<ul>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-jdbc-loading-drivers">Loading JDBC Drivers</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-jdbc-url-format">Jdbc URL Format for Different Databases</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jpa-vs-jdbc">A Comparison Between JPA and JDBC</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-connection-pooling">A Simple Guide to Connection Pooling in Java</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-best-practices-jdbc-connection-pool">Best Practices for Sizing the JDBC Connection Pool</a></li>
</ul>
<h2 id="bd-executing-statements" data-id="executing-statements"><img loading="lazy" decoding="async" class=" wp-image-196306 alignnone" src="https://baeldung.com/wp-content/uploads/2024/10/main-site-icons-08.png" alt="database data" width="52" height="52" /> Executing Statements</h2>
<div class="bd-anchor" id="executing-statements"></div>
<hr style="margin-top: -50px" />
<ul>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jdbc-batch-processing">Batch Processing in JDBC</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-jdbc-auto-commit">A Guide to Auto-Commit in JDBC</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-jdbc-execute-multiple-statements">How to Execute Multiple SQL Statements as One in JDBC</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-sql-store-load-file-blob">Store File or byte[] as SQL Blob in Java (Store and Load)</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-preparedstatements-like-wildcards">Using &#8220;LIKE&#8221; Wildcards in Java PreparedStatements</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jdbc-insert-null-into-integer-column">Inserting Null Into an Integer Column Using JDBC</a></li>
</ul>
<h2 id="bd-working-with-resultsets" data-id="working-with-resultsets"><img loading="lazy" decoding="async" class=" wp-image-196307 alignnone" src="https://baeldung.com/wp-content/uploads/2024/10/main-site-icons-09.png" alt="files data" width="52" height="52" /> Working with ResultSets</h2>
<div class="bd-anchor" id="working-with-resultsets"></div>
<hr style="margin-top: -50px" />
<ul>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/stream-api-jdbc-resultset">Processing JDBC ResultSet With Stream API</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-jdbc-pagination">Pagination With JDBC</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-resultset-number-of-rows">Get the Number of Rows in a ResultSet</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-resultset-map">Convert ResultSet Into Map</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-jdbc-convert-resultset-to-json">Converting a JDBC ResultSet to JSON in Java</a></li>
</ul>
<h2 id="bd-connection-and-schema-management" data-id="connection-and-schema-management"><img loading="lazy" decoding="async" class=" wp-image-196306 alignnone" src="https://baeldung.com/wp-content/uploads/2024/10/main-site-icons-08.png" alt="database data" width="52" height="52" /> Connection and Schema Management</h2>
<div class="bd-anchor" id="connection-and-schema-management"></div>
<hr style="margin-top: -50px" />
<ul>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jdbc-connect-to-schema">Connecting to a Specific Schema in JDBC</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jdbc-database-metadata">Extracting Database Metadata Using JDBC</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jdbc-check-table-exists">How to Check if a Database Table Exists with JDBC</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-sql-connection-thread-safety">Is java.sql.Connection Thread-Safe?</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-p6spy-intercept-sql-logging">Intercept SQL Logging with P6Spy</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/mocking-jdbc-unit-testing">Mocking JDBC for Unit Testing</a></li>
</ul>
<h2 id="bd-errors-and-troubleshooting" data-id="errors-and-troubleshooting"><img loading="lazy" decoding="async" class=" wp-image-196313 alignnone" src="https://baeldung.com/wp-content/uploads/2024/10/main-site-icons-15.png" alt="bug testing" width="52" height="52" /> Errors and Troubleshooting</h2>
<div class="bd-anchor" id="errors-and-troubleshooting"></div>
<hr style="margin-top: -50px" />
<ul>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-mysql-error-public-key-retrieval">Fix the Java-MySQL Connection Exception: Public Key Retrieval is not allowed</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-postgresql-error-canceling-statement-user-request">Resolving PostgreSQL ERROR: canceling statement due to user request</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-lang-classnotfoundexception-com-mysql-cj-jdbc-driver">Solving &#8220;java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver&#8221;</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-jdbc-executequery-dml-error">Fix the Exception &#8220;Cannot issue data manipulation statements with executeQuery()&#8221;</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/tomcat-jdbc-memory-leak">Tomcat Warning &#8220;To Prevent a Memory Leak, the JDBC Driver Has Been Forcibly Unregistered&#8221;</a></li>
</ul>The post <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jdbc-series">JDBC Series</a> first appeared on <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com">Baeldung</a>.<Img align="left" border="0" height="1" width="1" alt="" style="border:0;float:left;margin:0;padding:0;width:1px!important;height:1px!important;" hspace="0" src="https://feeds.feedblitz.com/~/i/955198892/0/baeldung">
<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/955198892/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/955198892/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f11%2fPersistence-Featured-Image-04-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/955198892/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/955198892/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/955198892/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/jdbc-series#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/jdbc-series/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</content:encoded>
					
					<wfw:commentRss>https://feeds.feedblitz.com/~/955198892/0/baeldung~JDBC-Series/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<webfeeds:featuredImage>https://www.baeldung.com/wp-content/uploads/2024/11/Persistence-Featured-Image-04-150x150.jpg</webfeeds:featuredImage></item>
<item>
<feedburner:origLink>https://www.baeldung.com/java-weekly-644</feedburner:origLink>
		<title>Java Weekly, Issue 644</title>
		<link>https://feeds.feedblitz.com/~/954947657/0/baeldung~Java-Weekly-Issue</link>
					<comments>https://feeds.feedblitz.com/~/954947657/0/baeldung~Java-Weekly-Issue#respond</comments>
		
		<dc:creator><![CDATA[baeldung]]></dc:creator>
		<pubDate>Fri, 01 May 2026 08:59:37 +0000</pubDate>
				<category><![CDATA[Weekly Review]]></category>
		<category><![CDATA[no-ads]]></category>
		<category><![CDATA[no-after-post]]></category>
		<category><![CDATA[no-before-post]]></category>
		<category><![CDATA[no-optins]]></category>
		<guid isPermaLink="false">https://www.baeldung.com/?p=203620</guid>
					<description><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2016/10/social-Weekly-Reviews-4.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="max-width:100% !important;height:auto !important;float: left; margin-right: 5px;" loading="lazy" /><p>Interesting AI-focused pieces and starting to look forward towards JDK 27.</p>
The post <a rel="NOFOLLOW" href="https://feeds.feedblitz.com/~/954947657/0/baeldung~Java-Weekly-Issue">Java Weekly, Issue 644</a> first appeared on <a rel="NOFOLLOW" href="https://www.baeldung.com">Baeldung</a>.<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/954947657/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/954947657/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2016%2f10%2fsocial-Weekly-Reviews-4.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/954947657/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/954947657/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/954947657/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/java-weekly-644#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/java-weekly-644/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</description>
										<content:encoded><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2016/10/social-Weekly-Reviews-4.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="float: left; margin-right: 5px;" decoding="async" loading="lazy" srcset="https://www.baeldung.com/wp-content/uploads/2016/10/social-Weekly-Reviews-4.jpg 952w, https://www.baeldung.com/wp-content/uploads/2016/10/social-Weekly-Reviews-4-300x157.jpg 300w, https://www.baeldung.com/wp-content/uploads/2016/10/social-Weekly-Reviews-4-768x402.jpg 768w" sizes="auto, (max-width: 580px) 100vw, 580px" /><h2 style="text-align: left;" id="bd-spring-and-java" data-id="spring-and-java">1.<strong> Spring and Java</strong></h2>
<div class="bd-anchor" id="spring-and-java"></div>
<p><strong><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://inside.java/2026/04/27/avoiding-final-field-mutation/">&gt;&gt; Avoiding Final Field Mutation</a></strong> [<span style="color: #993300;">inside.java</span>]</p>
<p>JDK 26 starts warning when reflection mutates <code>final</code> fields, which is definitely a quiet but meaningful step toward the JVM actually <strong>enforcing what <code>final</code> has always promised</strong>.</p>
<h4><strong>Also worth reading:</strong></h4>
<ul>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://foojay.io/today/dockerizing-a-java-26-project-with-docker-init/" target="_blank" rel="noopener"><strong>Dockerizing a Java 26 Project with Docker Init</strong></a> [<span style="color: #800000;">foojay.io</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.infoq.com/articles/mcp-java-architectural-strategy-llm-integrations/" target="_blank" rel="noopener"><strong>MCP in the Java World: Bringing Architectural Strategy to LLM Integrations</strong></a> [<span style="color: #800000;">infoq.com</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://blog.jetbrains.com/kotlin/2026/04/next-level-observability-with-opentelemetry/" target="_blank" rel="noopener"><strong>Next-Level Observability with OpenTelemetry</strong></a> [<span style="color: #800000;">jetbrains.com</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.javaspecialists.eu/archive/Issue334-ArrayList-vs-LinkedList-Puzzle.html" target="_blank" rel="noopener"><strong>Issue 334 &#8211; ArrayList vs LinkedList Puzzle</strong></a> [<span style="color: #800000;">javaspecialists.eu</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.linkedin.com/pulse/spring-ai-recipe-agentic-planning-todowritetool-craig-walls-pcigc" target="_blank" rel="noopener"><strong>Spring AI Recipe: Agentic Planning with TodoWriteTool</strong></a> [<span style="color: #800000;">linkedin.com</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://ik.am/entries/900/en" target="_blank" rel="noopener"><strong>Maven Plugin for JSpecify.dev Null Restrictions</strong></a> [<span style="color: #800000;">ik.am</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://openjdk.org/jeps/532" target="_blank" rel="noopener"><strong>JEP 532: Primitive Types in Patterns, instanceof, and switch (Fifth Preview)</strong></a> [<span style="color: #800000;">openjdk.org</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://openjdk.org/jeps/535" target="_blank" rel="noopener"><strong>JEP 535: Shenandoah GC: Generational Mode by Default</strong></a> [<span style="color: #800000;">openjdk.org</span>]</li>
</ul>
<h4><strong>Webinars and presentations:</strong></h4>
<ul>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.infoq.com/podcasts/java-performance-quest/" target="_blank" rel="noopener"><strong>A Java Performance Quest: Taming Unsafe Code, Embracing Idiomatic Style &amp; Debugging the Linux Kernel</strong></a> [<span style="color: #800000;">infoq.com</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://inside.java/2026/04/30/newscast-111/" target="_blank" rel="noopener"><strong>Make Java Safer with Flexible Constructor Bodies &#8211; Inside Java Newscast Episode #111</strong></a> [<span style="color: #800000;">inside.java</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://inside.java/2026/04/26/javaone-hat-java-gpu/" target="_blank" rel="noopener"><strong>Reflecting on HAT: A Project Babylon Case Study</strong></a> [<span style="color: #800000;">inside.java</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://spring.io/blog/2026/04/30/a-bootiful-podcast-ronald-dehuysser" target="_blank" rel="noopener"><strong>A Bootiful Podcast: Ronald Dehuysser, founder of JobRunr, on their ambitious new JavaClaw-like agent runtime</strong></a> [<span style="color: #800000;">spring.io</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.youtube.com/watch?v=ucJTPda_zx0" target="_blank" rel="noopener"><strong>How Netflix Uses Java &#8211; 2026 Edition</strong></a> [<span style="color: #800000;">youtube.com/@java</span>]</li>
</ul>
<h4><strong>Time to upgrade:</strong></h4>
<ul>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://quarkus.io/blog/a2a-java-sdk-1-0-0-beta1-released/" target="_blank" rel="noopener"><strong>A2A Java SDK 1.0.0.Beta1 Released</strong></a> [<span style="color: #800000;">quarkus.io</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://spring.io/blog/2026/04/27/spring-ai-1-0-6-1-1-5-2-0-0-M5-available-now" target="_blank" rel="noopener"><strong>Spring AI 1.0.6, 1.1.5, 2.0.0-M5 Available Now</strong></a> [<span style="color: #800000;">spring.io</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://spring.io/blog/2026/04/24/spring-shell-4-0-2-is-out" target="_blank" rel="noopener"><strong>Spring Shell 4.0.2 is out!</strong></a> [<span style="color: #800000;">spring.io</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://andresalmiray.com/jreleaser-reaches-5/" target="_blank" rel="noopener"><strong>JReleaser reaches 5</strong></a> [<span style="color: #800000;">andresalmiray.com</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.oracle.com/security-alerts/cpuapr2026.html" target="_blank" rel="noopener"><strong>Oracle Critical Patch Update Advisory — April 2026</strong></a> [<span style="color: #800000;">oracle.com</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.oracle.com/java/technologies/javase/25-0-3-relnotes.html" target="_blank" rel="noopener"><strong>JDK 25.0.3 Release Notes</strong></a> [<span style="color: #800000;">oracle.com</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://jdk.java.net/27/" target="_blank" rel="noopener"><strong>JDK 27 Early-Access Builds</strong></a> [<span style="color: #800000;">java.net</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://bell-sw.com/blog/liberica-jdk-8u492-11-0-31-17-0-19-21-0-11-25-0-3-and-26-01-builds-are-available/" target="_blank" rel="noopener"><strong>Liberica JDK 8u492 / 11.0.31 / 17.0.19 / 21.0.11 / 25.0.3 / 26.01 builds available</strong></a> [<span style="color: #800000;">bell-sw.com</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/testcontainers/testcontainers-java/releases/tag/2.0.5" target="_blank" rel="noopener"><strong>Testcontainers for Java 2.0.5</strong></a> [<span style="color: #800000;">github.com/testcontainers</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/Netflix/zuul/releases/tag/v3.6.0" target="_blank" rel="noopener"><strong>Zuul 3.6.0</strong></a>, <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/Netflix/zuul/releases/tag/v3.6.1" target="_blank" rel="noopener"><strong>3.6.1</strong></a>, <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/Netflix/zuul/releases/tag/v3.6.2" target="_blank" rel="noopener"><strong>3.6.2</strong></a>, and <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/Netflix/zuul/releases/tag/v3.5.9" target="_blank" rel="noopener"><strong>3.5.9</strong></a> [<span style="color: #800000;">github.com/Netflix</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/micronaut-projects/micronaut-core/releases/tag/v4.10.22" target="_blank" rel="noopener"><strong>Micronaut 4.10.22</strong></a>, <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/micronaut-projects/micronaut-core/releases/tag/v3.10.6" target="_blank" rel="noopener"><strong>3.10.6</strong></a>, and <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/micronaut-projects/micronaut-core/releases/tag/v3.8.14" target="_blank" rel="noopener"><strong>3.8.14</strong></a> [<span style="color: #800000;">github.com/micronaut-projects</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/apache/camel/releases/tag/camel-4.20.0" target="_blank" rel="noopener"><strong>Camel 4.20.0</strong></a> and <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/apache/camel/releases/tag/camel-4.14.7" target="_blank" rel="noopener"><strong>4.14.7</strong></a> [<span style="color: #800000;">github.com/apache</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://github.com/grails/grails-core/releases/tag/v7.0.11" target="_blank" rel="noopener"><strong>Grails 7.0.11</strong></a> [<span style="color: #800000;">github.com/grails</span>]</li>
</ul>
<h2 style="text-align: left;" id="bd-technical-amp-musings" data-id="technical-amp-musings">2.<strong> Technical &amp; Musings</strong></h2>
<div class="bd-anchor" id="technical-amp-musings"></div>
<p><strong><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://event-driven.io/en/vibing_harness_and_ooda_loops/">&gt;&gt; Vibing, Harness and OODA loop</a></strong> [<span style="color: #993300;">event-driven.io</span>]</p>
<p>A sharp framing of why “vibe coding” with LLMs feels productive but often isn&#8217;t.</p>
<h4><strong>Also worth reading:</strong></h4>
<ul>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://advancedweb.hu/esp32-time-bootstrap-problem/" target="_blank" rel="noopener"><strong>ESP32 time bootstrap problem</strong></a> [<span style="color: #800000;">advancedweb.hu</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://lucumr.pocoo.org/2026/4/28/before-github/" target="_blank" rel="noopener"><strong>Before GitHub</strong></a> [<span style="color: #800000;">pocoo.org</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://lucumr.pocoo.org/2026/4/23/equity-for-europeans/" target="_blank" rel="noopener"><strong>Equity for Europeans</strong></a> [<span style="color: #800000;">pocoo.org</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://ozar.me/2026/04/thoughts-on-ai-databases-and-conferences-as-of-april-2026/" target="_blank" rel="noopener"><strong>Thoughts on AI, Databases, and Conferences as of April 2026</strong></a> [<span style="color: #800000;">ozar.me</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://martinfowler.com/articles/structured-prompt-driven/" target="_blank" rel="noopener"><strong>Structured-Prompt-Driven Development (SPDD)</strong></a> [<span style="color: #800000;">martinfowler.com</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://mnot.net/blog/2026/agents_as_collective_bargains" target="_blank" rel="noopener"><strong>What&#8217;s Missing in the &#8216;Agentic&#8217; Story</strong></a> [<span style="color: #800000;">mnot.net</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.satisfice.com/blog/archives/488082" target="_blank" rel="noopener"><strong>Responsibility is the Human Moat</strong></a> [<span style="color: #800000;">satisfice.com</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://netflixtechblog.com/scaling-camera-file-processing-at-netflix-6dab2b1e80be" target="_blank" rel="noopener"><strong>Scaling Camera File Processing at Netflix</strong></a> [<span style="color: #800000;">netflixtechblog.com</span>]</li>
<li><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://dandreamsofcoding.com/2026/04/05/the-big-mac-coding-era/" target="_blank" rel="noopener"><strong>The Big Mac Coding Era</strong></a> [<span style="color: #800000;">dandreamsofcoding.com</span>]</li>
</ul>
<h2 style="text-align: left;" id="bd-pick-of-the-week" data-id="pick-of-the-week">3.<strong> Pick of the Week</strong></h2>
<div class="bd-anchor" id="pick-of-the-week"></div>
<p><strong>&gt;&gt;</strong> <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.seangoedecke.com/bad-code-at-big-companies/" target="_blank" rel="noopener"><strong>How good engineers write bad code at big companies</strong></a> [<span style="color: #800000;">seangoedecke.com</span>]</p>The post <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-weekly-644">Java Weekly, Issue 644</a> first appeared on <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com">Baeldung</a>.<Img align="left" border="0" height="1" width="1" alt="" style="border:0;float:left;margin:0;padding:0;width:1px!important;height:1px!important;" hspace="0" src="https://feeds.feedblitz.com/~/i/954947657/0/baeldung">
<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/954947657/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/954947657/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2016%2f10%2fsocial-Weekly-Reviews-4.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/954947657/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/954947657/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/954947657/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/java-weekly-644#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/java-weekly-644/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</content:encoded>
					
					<wfw:commentRss>https://feeds.feedblitz.com/~/954947657/0/baeldung~Java-Weekly-Issue/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<webfeeds:featuredImage>https://www.baeldung.com/wp-content/uploads/2016/10/social-Weekly-Reviews-4-150x150.jpg</webfeeds:featuredImage></item>
<item>
<feedburner:origLink>https://www.baeldung.com/intellij-series</feedburner:origLink>
		<title>IntelliJ Series</title>
		<link>https://feeds.feedblitz.com/~/954893270/0/baeldung~IntelliJ-Series</link>
					<comments>https://feeds.feedblitz.com/~/954893270/0/baeldung~IntelliJ-Series#respond</comments>
		
		<dc:creator><![CDATA[baeldung]]></dc:creator>
		<pubDate>Thu, 30 Apr 2026 18:18:17 +0000</pubDate>
				<category><![CDATA[IDE]]></category>
		<category><![CDATA[Series]]></category>
		<category><![CDATA[IntelliJ]]></category>
		<guid isPermaLink="false">https://www.baeldung.com/?p=203611</guid>
					<description><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/07/On-Baeldung-Featured-10-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="max-width:100% !important;height:auto !important;float: left; margin-right: 5px;" loading="lazy" /><p>This series covers practical IntelliJ IDEA workflows from setup to advanced development.</p>
The post <a rel="NOFOLLOW" href="https://feeds.feedblitz.com/~/954893270/0/baeldung~IntelliJ-Series">IntelliJ Series</a> first appeared on <a rel="NOFOLLOW" href="https://www.baeldung.com">Baeldung</a>.<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/954893270/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/954893270/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f07%2fOn-Baeldung-Featured-10-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/954893270/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/954893270/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/954893270/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/intellij-series#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/intellij-series/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</description>
										<content:encoded><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/07/On-Baeldung-Featured-10-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="float: left; margin-right: 5px;" decoding="async" loading="lazy" srcset="https://www.baeldung.com/wp-content/uploads/2024/07/On-Baeldung-Featured-10-1024x536.jpg 1024w, https://www.baeldung.com/wp-content/uploads/2024/07/On-Baeldung-Featured-10-300x157.jpg 300w, https://www.baeldung.com/wp-content/uploads/2024/07/On-Baeldung-Featured-10-768x402.jpg 768w, https://www.baeldung.com/wp-content/uploads/2024/07/On-Baeldung-Featured-10-100x52.jpg 100w, https://www.baeldung.com/wp-content/uploads/2024/07/On-Baeldung-Featured-10.jpg 1200w" sizes="auto, (max-width: 580px) 100vw, 580px" /><p>IntelliJ IDEA is the leading IDE for Java and JVM development, combining intelligent code analysis, deep framework integration, and powerful tooling into a single environment. From quick-fixes and <em>refactoring</em> to remote debugging and plugin development, mastering IntelliJ means spending less time on tooling and more on solving actual problems.</p>
<p>This series covers <strong>practical IntelliJ IDEA workflows from setup to advanced development</strong>, organized by task: from configuring the IDE and managing projects, through coding productivity features, debugging applications locally and remotely, and navigating codebases with built-in analysis tools.</p>
<h2 id="bd-ide-setup-and-configuration" data-id="ide-setup-and-configuration"><img loading="lazy" decoding="async" class=" wp-image-196318 alignnone" src="https://baeldung.com/wp-content/uploads/2024/10/main-site-icons-20.png" alt="settings generic" width="52" height="52" /> IDE Setup and Configuration</h2>
<div class="bd-anchor" id="ide-setup-and-configuration"></div>
<hr style="margin-top: -50px" />
<ul>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-idea-environment-variables">How to Set Up Environment Variables in IntelliJ IDEA</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-intellij-reduce-memory">Decreasing IntelliJ RAM Usage</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-idea-increase-memory">Increase the Memory Size Limit on IntelliJ IDEA</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-intellij-idea-vs-eclipse">IntelliJ IDEA vs Eclipse &#8211; Key Feature Differences</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-idea-set-jvm-arguments">How to Set JVM Arguments in IntelliJ IDEA?</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-idea-directory">What Is the .idea Directory?</a></li>
</ul>
<h2 id="bd-project-and-build-management" data-id="project-and-build-management"><img loading="lazy" decoding="async" class=" wp-image-196304 alignnone" src="https://baeldung.com/wp-content/uploads/2024/10/main-site-icons-06.png" alt="computer generic" width="52" height="52" /> Project and Build Management</h2>
<div class="bd-anchor" id="project-and-build-management"></div>
<hr style="margin-top: -50px" />
<ul>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-change-java-version">How to Change the Java Version in an IntelliJ Project</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-intellij-include-external-jar">Add External JAR File to IntelliJ Project</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-resolve-spring-boot-configuration-properties">IntelliJ &#8211; Cannot Resolve Spring Boot Configuration Properties Error</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-maven-convert-project">Converting a Java Project/Module Into a Maven Project/Module in IntelliJ IDEA</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-build-automatically">Intellij Idea &#8211; How to Build Project Automatically</a></li>
</ul>
<h2 id="bd-coding-and-editing" data-id="coding-and-editing"><img loading="lazy" decoding="async" class=" wp-image-196308 alignnone" src="https://baeldung.com/wp-content/uploads/2024/10/main-site-icons-10.png" alt="generic code" width="52" height="52" /> Coding and Editing</h2>
<div class="bd-anchor" id="coding-and-editing"></div>
<hr style="margin-top: -50px" />
<ul>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-disable-wildcard-import">Disable Wildcard Import in IntelliJ</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-idea-command-line-is-too-long">Fix &#8220;Command Line is Too Long&#8221; in IntelliJ</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-idea-shortcuts">Common Shortcuts in IntelliJ IDEA</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-stop-limit-indexing">How to Stop or Limit Indexing in Intellij IDEA</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jetbrains-contract-annotation">JetBrains @Contract Annotation</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-refactoring">An Introduction to Refactoring with IntelliJ IDEA</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-auto-import-class">Auto-import Classes in IntelliJ</a></li>
</ul>
<h2 id="bd-debugging" data-id="debugging"><img loading="lazy" decoding="async" class=" wp-image-196313 alignnone" src="https://baeldung.com/wp-content/uploads/2024/10/main-site-icons-15.png" alt="bug testing" width="52" height="52" /> Debugging</h2>
<div class="bd-anchor" id="debugging"></div>
<hr style="margin-top: -50px" />
<ul>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-debug-spring-boot-applications">Debugging Spring Boot Applications With IntelliJ IDEA</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-remote-debugging">Remote Debugging with IntelliJ IDEA</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-debugging-tricks">IntelliJ Debugging Tricks</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/docker-debug-app-with-intellij">Debugging an Application Running in Docker With IntelliJ IDEA</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-debugging-java-streams">Debugging Java Streams with IntelliJ</a></li>
</ul>
<h2 id="bd-code-analysis-and-navigation" data-id="code-analysis-and-navigation"><img loading="lazy" decoding="async" class=" wp-image-196307 alignnone" src="https://baeldung.com/wp-content/uploads/2024/10/main-site-icons-09.png" alt="files data" width="52" height="52" /> Code Analysis and Navigation</h2>
<div class="bd-anchor" id="code-analysis-and-navigation"></div>
<hr style="margin-top: -50px" />
<ul>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-connect-database-intellij-data-sources">Connect to Database Through Intellij Data Sources and Drivers</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-decompiling-classes">Decompiling Classes in Java</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-count-lines-java-code">How to Count Lines of Java Code Using IntelliJ IDEA?</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-new-custom-plugin">Writing IntelliJ IDEA Plugins</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-idea-multiple-projects-same-window">Open Multiple Projects in the Same Window in IntelliJ IDEA</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/git-intellij-integration">Git Integration in IntelliJ IDEA</a></li>
</ul>The post <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intellij-series">IntelliJ Series</a> first appeared on <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com">Baeldung</a>.<Img align="left" border="0" height="1" width="1" alt="" style="border:0;float:left;margin:0;padding:0;width:1px!important;height:1px!important;" hspace="0" src="https://feeds.feedblitz.com/~/i/954893270/0/baeldung">
<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/954893270/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/954893270/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f07%2fOn-Baeldung-Featured-10-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/954893270/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/954893270/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/954893270/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/intellij-series#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/intellij-series/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</content:encoded>
					
					<wfw:commentRss>https://feeds.feedblitz.com/~/954893270/0/baeldung~IntelliJ-Series/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<webfeeds:featuredImage>https://www.baeldung.com/wp-content/uploads/2024/07/On-Baeldung-Featured-10-150x150.jpg</webfeeds:featuredImage></item>
<item>
<feedburner:origLink>https://www.baeldung.com/jakarta-ee-series</feedburner:origLink>
		<title>Jakarta EE Series</title>
		<link>https://feeds.feedblitz.com/~/954893273/0/baeldung~Jakarta-EE-Series</link>
					<comments>https://feeds.feedblitz.com/~/954893273/0/baeldung~Jakarta-EE-Series#respond</comments>
		
		<dc:creator><![CDATA[baeldung]]></dc:creator>
		<pubDate>Thu, 30 Apr 2026 18:07:58 +0000</pubDate>
				<category><![CDATA[Jakarta EE]]></category>
		<category><![CDATA[Series]]></category>
		<guid isPermaLink="false">https://www.baeldung.com/?p=203607</guid>
					<description><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="max-width:100% !important;height:auto !important;float: left; margin-right: 5px;" loading="lazy" /><p>This series covers core Jakarta EE APIs in practical application.</p>
The post <a rel="NOFOLLOW" href="https://feeds.feedblitz.com/~/954893273/0/baeldung~Jakarta-EE-Series">Jakarta EE Series</a> first appeared on <a rel="NOFOLLOW" href="https://www.baeldung.com">Baeldung</a>.<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/954893273/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/954893273/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f07%2fJava-Featured-10-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/954893273/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/954893273/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/954893273/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/jakarta-ee-series#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/jakarta-ee-series/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</description>
										<content:encoded><![CDATA[<img src="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-1024x536.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" style="float: left; margin-right: 5px;" decoding="async" loading="lazy" srcset="https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-1024x536.jpg 1024w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-300x157.jpg 300w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-768x402.jpg 768w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-100x52.jpg 100w, https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10.jpg 1200w" sizes="auto, (max-width: 580px) 100vw, 580px" /><p><strong>Jakarta EE</strong> (formerly Java EE) is the standard enterprise Java platform, providing a comprehensive set of specifications for building scalable, multi-tier server-side applications. It covers the full stack from web tier components like <em>Servlets</em> and <em>JSP</em> to enterprise services like <em>CDI</em> and <em>EJB</em>, along with robust support for RESTful and SOAP web services.</p>
<p>This series covers <strong>core Jakarta EE APIs in practical application</strong>, organized by concern: from setting up and deploying applications on Jakarta EE servers, through building the web tier with servlets and view technologies, designing service layers with JAX-RS and JAX-WS, enforcing contracts with Bean Validation, and managing enterprise components with CDI and EJB.</p>
<h2 id="bd-jakarta-ee-platform-and-core-concepts" data-id="jakarta-ee-platform-and-core-concepts"><img loading="lazy" decoding="async" class=" wp-image-196299 alignnone" src="https://baeldung.com/wp-content/uploads/2024/10/main-site-icons-01.png" alt="" width="52" height="52" /> Jakarta EE Platform and Core Concepts</h2>
<div class="bd-anchor" id="jakarta-ee-platform-and-core-concepts"></div>
<hr style="margin-top: -50px" />
<ul>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/tomcat-deploy-war">How to Deploy a WAR File to Tomcat</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-jakarta-enterprise-edition-migration">Migrate From Java EE to Jakarta EE</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jndi">Java Naming and Directory Interface Overview</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-enterprise-evolution">Java EE vs J2EE vs Jakarta EE</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-servers">Web and Application Servers for Java</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jakarta-ee-10">Jakarta EE 10</a></li>
</ul>
<h2 id="bd-servlets" data-id="servlets"><img loading="lazy" decoding="async" class=" wp-image-196308 alignnone" src="https://baeldung.com/wp-content/uploads/2024/10/main-site-icons-10.png" alt="generic code" width="52" height="52" /> Servlets</h2>
<div class="bd-anchor" id="servlets"></div>
<hr style="margin-top: -50px" />
<ul>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intro-to-servlets">Introduction to Java Servlets</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-servlet-cookies-session">Handling Cookies and a Session in a Java Servlet</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-servlets-containers-intro">Introduction to Servlets and Servlet Containers</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/register-servlet">How to Register a Servlet in Java</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/servlet-redirect-forward">Servlet Redirect vs Forward</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/servlet-json-response">Returning a JSON Response from a Servlet</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/servlet-exceptions">Jakarta EE Servlet Exception Handling</a></li>
</ul>
<h2 id="bd-jsp-and-jsf" data-id="jsp-and-jsf"><img loading="lazy" decoding="async" class=" wp-image-196307 alignnone" src="https://baeldung.com/wp-content/uploads/2024/10/main-site-icons-09.png" alt="files data" width="52" height="52" /> JSP and JSF</h2>
<div class="bd-anchor" id="jsp-and-jsf"></div>
<hr style="margin-top: -50px" />
<ul>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jsp">Guide to JavaServer Pages (JSP)</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jsf-primefaces">Introduction to Primefaces</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jstl">A Guide to the JSTL Library</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/mvc-servlet-jsp">An MVC Example with Servlets and JSP</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/intro-to-jsf-expression-language">Introduction to JSF EL 2</a></li>
</ul>
<h2 id="bd-web-services-jax-rs-and-jax-ws" data-id="web-services-jax-rs-and-jax-ws"><img loading="lazy" decoding="async" class=" wp-image-196311 alignnone" src="https://baeldung.com/wp-content/uploads/2024/10/main-site-icons-13.png" alt="network system connection" width="52" height="52" /> Web Services: JAX-RS and JAX-WS</h2>
<div class="bd-anchor" id="web-services-jax-rs-and-jax-ws"></div>
<hr style="margin-top: -50px" />
<ul>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-soap-web-service">Consume a SOAP Web Service in Java</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jax-rs-spec-and-implementations">JAX-RS is just an API!</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jax-ws">Introduction to JAX-WS</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/introduction-to-apache-cxf">Introduction to Apache CXF</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jersey-jax-rs-client">JAX-RS Client with Jersey</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jersey-filters-interceptors">Jersey Filters and Interceptors</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-ee-jax-rs-sse">Server-Sent Events (SSE) in JAX-RS</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jax-rs-response">Set a Response Body in JAX-RS</a></li>
</ul>
<h2 id="bd-bean-validation" data-id="bean-validation"><img loading="lazy" decoding="async" class=" wp-image-196300 alignnone" src="https://baeldung.com/wp-content/uploads/2024/10/main-site-icons-02.png" alt="algorithm code generic" width="52" height="52" /> Bean Validation</h2>
<div class="bd-anchor" id="bean-validation"></div>
<hr style="margin-top: -50px" />
<ul>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-validation">Java Bean Validation Basics</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-bean-validation-not-null-empty-blank">Difference Between @NotNull, @NotEmpty, and @NotBlank Constraints in Bean Validation</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/javax-validations-enums">Validations for Enum Types</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/javax-validation-groups">Grouping Jakarta (Javax) Validation Constraints</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/javax-validation-method-constraints">Method Constraints with Bean Validation 3.0</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-valid-annotation-child-objects">@Valid Annotation on Child Objects</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-validation-list-annotations">Java Validation List Annotations</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/bean-validation-container-elements">Validating Container Elements with Jakarta Bean Validation 3.0</a></li>
</ul>
<h2 id="bd-cdi-and-ejb" data-id="cdi-and-ejb"><img loading="lazy" decoding="async" class=" wp-image-196304 alignnone" src="https://baeldung.com/wp-content/uploads/2024/10/main-site-icons-06.png" alt="computer generic" width="52" height="52" /> CDI and EJB</h2>
<div class="bd-anchor" id="cdi-and-ejb"></div>
<hr style="margin-top: -50px" />
<ul>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-ee-cdi">An Introduction to CDI (Contexts and Dependency Injection) in Java</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/ejb-intro">Guide to EJB Set-up</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jee-jta">Guide to Jakarta EE JTA</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/ejb-message-driven-beans">A Guide to Message Driven Beans in EJB</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/java-ee-singleton-session-bean">Singleton Session Bean in Jakarta EE</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/cdi-event-notification">Introduction to the Event Notification Model in CDI 2.0</a></li>
<li style="margin-bottom: 5px"><a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/ejb-session-beans">Java EE Session Beans</a></li>
</ul>The post <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com/jakarta-ee-series">Jakarta EE Series</a> first appeared on <a href="https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.baeldung.com">Baeldung</a>.<Img align="left" border="0" height="1" width="1" alt="" style="border:0;float:left;margin:0;padding:0;width:1px!important;height:1px!important;" hspace="0" src="https://feeds.feedblitz.com/~/i/954893273/0/baeldung">
<div style="clear:both;padding-top:0.2em;"><a title="Like on Facebook" href="https://feeds.feedblitz.com/_/28/954893273/baeldung"><img height="20" src="https://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" href="https://feeds.feedblitz.com/_/29/954893273/baeldung,https%3a%2f%2fwww.baeldung.com%2fwp-content%2fuploads%2f2024%2f07%2fJava-Featured-10-1024x536.jpg"><img height="20" src="https://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Post to X.com" href="https://feeds.feedblitz.com/_/24/954893273/baeldung"><img height="20" src="https://assets.feedblitz.com/i/x.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by email" href="https://feeds.feedblitz.com/_/19/954893273/baeldung"><img height="20" src="https://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" href="https://feeds.feedblitz.com/_/20/954893273/baeldung"><img height="20" src="https://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a rel="NOFOLLOW" title="View Comments" href="https://www.baeldung.com/jakarta-ee-series#respond"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/comments20.png"></a>&#160;<a title="Follow Comments via RSS" href="https://www.baeldung.com/jakarta-ee-series/feed"><img height="20" style="border:0;margin:0;padding:0;" src="https://assets.feedblitz.com/i/commentsrss20.png"></a>&#160;</div>]]>
</content:encoded>
					
					<wfw:commentRss>https://feeds.feedblitz.com/~/954893273/0/baeldung~Jakarta-EE-Series/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<webfeeds:featuredImage>https://www.baeldung.com/wp-content/uploads/2024/07/Java-Featured-10-150x150.jpg</webfeeds:featuredImage></item>
</channel></rss>

