<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Java Code Geeks</title>
    <link>https://www.javacodegeeks.com/feed/</link>
    <description>Java Developers Resource Center</description>
    <pubDate>Wed, 26 Aug 2026 08:55:11 +0000</pubDate>
    <lastBuildDate>Wed, 26 Aug 2026 08:55:11 +0000</lastBuildDate>
    <image>
      <url>https://www.javacodegeeks.com/wp-content/uploads/2012/12/JavaCodeGeeks-favIcon.png</url>
      <title>Java Code Geeks</title>
      <link>https://www.javacodegeeks.com/</link>
    </image>
    <item>
      <title>Testcontainers + Spring Boot 4: The Integration Test Setup Teams Actually Use</title>
      <link>https://www.javacodegeeks.com/2026/08/testcontainers-spring-boot-4-the-integration-test-setup-teams-actually-use.html</link>
      <description>&lt;header class=entry-header-outer&gt;&lt;nav id=breadcrumb&gt;&lt;a href=https://www.javacodegeeks.com/&gt;&lt;span class=tie-icon-home aria-hidden=true&gt;&lt;/span&gt;Home&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;a href=https://www.javacodegeeks.com/category/java&gt;Java&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;a href=https://www.javacodegeeks.com/category/java/enterprise-java&gt;Enterprise Java&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;span class=current&gt;Testcontainers + Spring Boot 4: The Integration Test Setup Teams Actually Use&lt;/span&gt;&lt;/nav&gt;&lt;div class=entry-header&gt;&lt;span class=post-cat-wrap&gt;&lt;a class=&#34;post-cat tie-cat-8&#34; href=https://www.javacodegeeks.com/category/java/enterprise-java&gt;Enterprise Java&lt;/a&gt;&lt;/span&gt;&lt;h1 class=&#34;post-title entry-title&#34;&gt;Testcontainers + Spring Boot 4: The Integration Test Setup Teams Actually Use&lt;/h1&gt;&lt;/div&gt;&lt;/header&gt;&lt;div class=&#34;entry-content entry clearfix&#34;&gt;&lt;div class=&#34;stream-item stream-item-above-post-content&#34;&gt;&lt;div class=stream-item-size&gt;&lt;div id=adngin-in-post-0 style=&#34;float:left; margin-right:20px; margin-bottom:10px; width:300px; height:274px;&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class=wp-block-paragraph&gt;Not a getting-started guide. The opinionated patterns teams converge on once the novelty wears off and the suite has to run in CI a hundred times a day.&lt;p class=wp-block-paragraph&gt;Every Testcontainers tutorial teaches the same first step, annotate a field with &lt;code&gt;@Container&lt;/code&gt;, drop in &lt;code&gt;@Testcontainers&lt;/code&gt;, watch a database spin up. That setup works for one test class. It falls apart at the tenth, when your suite is spending more time starting Postgres than running assertions. This is the setup that teams actually land on once that happens, updated for Spring Boot 4 and Spring Framework 7, which changed more about test startup than most migration guides mention.&lt;h2 class=wp-block-heading&gt;Pattern One: Singleton Containers, Not @Container Lifecycle&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;The default JUnit 5 extension, &lt;code&gt;@Testcontainers&lt;/code&gt; plus &lt;code&gt;@Container&lt;/code&gt;, starts a container before a test class and stops it after. That’s fine once. It’s expensive across twenty test classes, and Testcontainers’ own documentation is explicit that this extension has only been tested against sequential execution, parallel use is unsupported and can have unintended side effects. The pattern teams actually converge on skips that extension entirely for shared infrastructure, and starts the container exactly once, in a static initializer on a base class every integration test extends.&lt;pre class=brush:java&gt;abstract class AbstractIntegrationTest {&#xA;&#xA;    @ServiceConnection&#xA;    static final PostgreSQLContainer&amp;lt;?&amp;gt; POSTGRES =&#xA;        new PostgreSQLContainer&amp;lt;&amp;gt;(&amp;#34;postgres:17-alpine&amp;#34;);&#xA;&#xA;    static {&#xA;        POSTGRES.start();&#xA;    }&#xA;}&#xA;&#xA;class OrderServiceTest extends AbstractIntegrationTest {&#xA;    // reuses the same running container, no @Testcontainers, no @Container&#xA;}&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;&lt;strong&gt;The mistake everyone makes once:&lt;/strong&gt; combining this pattern with &lt;code&gt;@Testcontainers&lt;/code&gt; and &lt;code&gt;@Container&lt;/code&gt; on the same base class. The extension stops the container after the first test class finishes, so every subsequent class inherits a base class pointing at a dead container. Spring’s test context caching keeps the old context around, and you get connection failures that look like flakiness but are actually a lifecycle bug in the setup itself. The fix is to leave those two annotations off entirely for anything meant to be shared.&lt;div class=wp-block-image&gt;&lt;figure class=&#34;aligncenter size-full&#34;&gt;&lt;a href=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-03-13.png&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-03-13.png fetchpriority=high decoding=async width=772 height=400 data-src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-03-13.png alt class=wp-image-145187 data-srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-03-13.png 772w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-03-13-300x155.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-03-13-768x398.png 768w&#34; data-sizes=&#34;(max-width: 772px) 100vw, 772px&#34;&gt;&lt;noscript&gt;&lt;img fetchpriority=high decoding=async width=772 height=400 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-03-13.png alt class=wp-image-145187 srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-03-13.png 772w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-03-13-300x155.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-03-13-768x398.png 768w&#34; sizes=&#34;(max-width: 772px) 100vw, 772px&#34;&gt;&lt;/noscript&gt;&lt;/a&gt;&lt;figcaption class=wp-element-caption&gt;Cumulative container startup time across a ten-class suite, illustrative, based on a documented case study of PostgreSQL containers averaging 30-60 seconds each to start.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&lt;h2 class=wp-block-heading&gt;Pattern Two: @ServiceConnection Instead of @DynamicPropertySource&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Before &lt;code&gt;@ServiceConnection&lt;/code&gt; existed, wiring a container’s connection details into the Spring context meant a &lt;code&gt;@DynamicPropertySource&lt;/code&gt; method, manually reading the container’s JDBC URL, username, and password, and pushing each one into a property key by hand. &lt;code&gt;@ServiceConnection&lt;/code&gt; replaces all of that with one annotation on the container field itself. Spring Boot detects the container type, or the Docker image name for a generic container, and automatically creates the matching &lt;code&gt;ConnectionDetails&lt;/code&gt; bean, no property keys to get wrong.&lt;figure class=wp-block-table&gt;&lt;table class=has-fixed-layout&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th class=has-text-align-left data-align=left&gt;Old approach&lt;th class=has-text-align-left data-align=left&gt;@ServiceConnection&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;Manual &lt;code&gt;@DynamicPropertySource&lt;/code&gt; method per container&lt;td class=has-text-align-left data-align=left&gt;One annotation on the container field or bean&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;Property keys typed out by hand, easy to typo&lt;td class=has-text-align-left data-align=left&gt;Connection details generated automatically from the container type&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;Breaks silently if a property key changes upstream&lt;td class=has-text-align-left data-align=left&gt;Tracks the auto-configuration directly, no property keys involved&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;Works for whatever you wire up manually&lt;td class=has-text-align-left data-align=left&gt;Built-in support for Postgres, MySQL, MongoDB, Redis, Kafka, RabbitMQ, and a growing list of others in Spring Boot 4&lt;/table&gt;&lt;/figure&gt;&lt;p class=wp-block-paragraph&gt;Spring Boot 4 keeps extending that built-in list, MongoDB’s Atlas local container support shipped as a &lt;code&gt;@ServiceConnection&lt;/code&gt; target in this release specifically. The annotation isn’t tied to the &lt;code&gt;@Testcontainers&lt;/code&gt; extension either, it works just as well on a manually started static field, which is exactly what makes it compatible with the singleton pattern above.&lt;div style=&#34;display:inline-block; margin: 15px 0;&#34;&gt;&lt;div id=adngin-JavaCodeGeeks_incontent_video-0 style=display:inline-block;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;h2 class=wp-block-heading&gt;Pattern Three: Reuse Is Not a Substitute for Singleton&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Testcontainers ships a separate feature called container reuse, &lt;code&gt;.withReuse(true)&lt;/code&gt; plus &lt;code&gt;testcontainers.reuse.enable=true&lt;/code&gt; in a local &lt;code&gt;~/.testcontainers.properties&lt;/code&gt; file, which keeps a container alive after the JVM exits so the next test run can find and reuse it instead of starting fresh. It’s genuinely useful, and it’s also frequently confused with the singleton pattern, to the point that Testcontainers’ own documentation states directly that reuse does not replace a proper shared instance for improving test performance.&lt;p class=wp-block-paragraph&gt;The distinction matters because the two solve different problems. The singleton pattern eliminates redundant startups &lt;em&gt;within a single test runacross separate test runs&lt;/em&gt;, useful on a developer’s laptop running the same suite repeatedly during TDD, but explicitly unsuited for CI, where you generally want a clean container per run rather than one that’s been accumulating state from every previous build. Teams that reach for reuse as their primary speedup mechanism in CI are optimizing for the wrong axis.&lt;h4 class=wp-block-heading&gt;Where each mechanism actually belongs&lt;/h4&gt;&lt;ul class=wp-block-list&gt;&lt;li&gt;&lt;strong&gt;Singleton base class:&lt;/strong&gt; always, it’s what makes a multi-class suite fast in both CI and local runs.&lt;li&gt;&lt;strong&gt;Container reuse:&lt;/strong&gt; local development only, layered on top of the singleton pattern, never relied on as the sole speedup in a pipeline that spins up a fresh environment each run.&lt;li&gt;&lt;strong&gt;@ServiceConnection:&lt;/strong&gt; always, it’s strictly less code than manual property wiring with no real downside.&lt;/ul&gt;&lt;h2 class=wp-block-heading&gt;Pattern Four: Parallel Isolation, Told Honestly&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Running integration tests in parallel is where most of the advice online quietly stops being precise. Yes, JUnit 5 supports parallel execution through &lt;code&gt;junit.jupiter.execution.parallel.enabled=true&lt;/code&gt;. Yes, a shared singleton container works fine with it, in the sense that it will still be running and reachable from multiple threads. What doesn’t automatically follow is data isolation, a shared Postgres container doesn’t know or care that two test classes are hitting the same tables at the same time, and Testcontainers’ own JUnit 5 extension documentation, again, only claims to have been validated for sequential runs.&lt;p class=wp-block-paragraph&gt;The pattern that actually holds up in practice separates two concerns that tutorials tend to blur together: container-level concurrency, which the singleton pattern already handles by not relying on the untested extension lifecycle, and data-level concurrency, which is entirely your application’s responsibility. A configuration teams reach for often is parallelizing across classes while keeping methods within a class sequential:&lt;pre class=brush:java&gt;# junit-platform.properties&#xA;junit.jupiter.execution.parallel.enabled=true&#xA;junit.jupiter.execution.parallel.mode.default=same_thread&#xA;junit.jupiter.execution.parallel.mode.classes.default=concurrent&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;That configuration alone doesn’t stop two classes from stepping on the same row. The actual isolation still has to come from the test data itself, cleaning tables in a &lt;code&gt;@BeforeEach&lt;/code&gt;, wrapping each test in a transaction that rolls back, or giving each test class its own schema or keyspace inside the shared container. None of that is automatic, and any article that implies parallel execution plus a shared container is isolation by itself is skipping the part that actually takes engineering effort.&lt;h2 class=wp-block-heading&gt;What Spring Boot 4’s AOT Changes Do to Test Startup&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;This is the part of the migration most teams underestimate. Spring Boot 4 and Spring Framework 7 lean much further into Ahead-of-Time processing than Spring Boot 3 did, and it changes the cost profile of every &lt;code&gt;@SpringBootTest&lt;/code&gt; that loads a full application context.&lt;div class=wp-block-image&gt;&lt;figure class=&#34;aligncenter size-full&#34;&gt;&lt;a href=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-04-50.png&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-04-50.png decoding=async width=774 height=403 data-src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-04-50.png alt class=wp-image-145188 data-srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-04-50.png 774w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-04-50-300x156.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-04-50-768x400.png 768w&#34; data-sizes=&#34;(max-width: 774px) 100vw, 774px&#34;&gt;&lt;noscript&gt;&lt;img decoding=async width=774 height=403 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-04-50.png alt class=wp-image-145188 srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-04-50.png 774w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-04-50-300x156.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-18_16-04-50-768x400.png 768w&#34; sizes=&#34;(max-width: 774px) 100vw, 774px&#34;&gt;&lt;/noscript&gt;&lt;/a&gt;&lt;figcaption class=wp-element-caption&gt;Reported startup improvement from Spring Data AOT, which moves query generation from runtime reflection to compile-time source generation. Figures as reported across multiple Spring Boot 4 release write-ups.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p class=wp-block-paragraph&gt;Two changes do most of the work. Spring Data AOT turns repository query methods into generated source code at build time instead of parsing them via reflection when the context starts, which is where the widely cited 50 to 70 percent faster startup figures for Spring Boot 4 actually come from. Separately, Spring Boot 4’s autoconfiguration modules were broken apart into smaller, more focused jars, which means less classpath scanning during context startup regardless of how many repositories your test actually touches. Combined with &lt;code&gt;BeanRegistrar&lt;/code&gt;, a reflection-free way to register beans that the AOT compiler can process at build time, the net effect for a heavy &lt;code&gt;@SpringBootTest&lt;/code&gt; suite is a noticeably shorter wait before your containers and your context are both actually ready.&lt;p class=wp-block-paragraph&gt;&lt;strong&gt;The gotcha teams hit during migration:&lt;/strong&gt; Spring Boot 4.1 removed the ability to skip AOT processing of tests with Maven’s &lt;code&gt;-DskipTests&lt;/code&gt; flag. The Spring Boot Maven plugin now only reacts to &lt;code&gt;maven.test.skip&lt;/code&gt;, so a CI step that used to skip test compilation with &lt;code&gt;-DskipTests&lt;/code&gt; can silently behave differently after upgrading, worth checking explicitly rather than discovering it mid-pipeline.&lt;h2 class=wp-block-heading&gt;What We Learned&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;The Testcontainers setup teams actually run once a suite matures looks different from the getting-started tutorial in four specific ways. Containers are started once, in a static initializer on a base class, deliberately bypassing the &lt;code&gt;@Testcontainers&lt;/code&gt;/&lt;code&gt;@Container&lt;/code&gt; lifecycle that Testcontainers itself only claims to have validated for sequential execution. &lt;code&gt;@ServiceConnection&lt;/code&gt; replaces manual property wiring outright, with no real downside, and it works fine on that same manually managed static field.&lt;p class=wp-block-paragraph&gt;Container reuse is a genuinely useful local-development optimization that Testcontainers’ own documentation is explicit is not a substitute for the singleton pattern, and treating it as your CI speedup strategy is a category error. Parallel execution is safe at the container level once you’ve adopted the singleton pattern, but data isolation between concurrently running tests is still entirely on you, no configuration flag does that part for you. And Spring Boot 4’s AOT investment, Spring Data AOT repositories and modularized autoconfiguration in particular, genuinely shortens the time between “container is up” and “context is ready,” with one real migration gotcha around Maven’s test-skipping flag worth checking before you assume your pipeline still behaves the way it used to.&lt;/p&gt;&lt;style&gt;.lepopup-progress-60 div.lepopup-progress-t1&gt;div{background-color:#e0e0e0;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{background-color:#bd4070;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{color:#ffffff;}.lepopup-progress-60 div.lepopup-progress-t1&gt;label{color:#444444;}.lepopup-form-60, .lepopup-form-60 *, .lepopup-progress-60 {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box span i{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box,.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;text&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;email&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;password&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input select,.lepopup-form-60 .lepopup-element div.lepopup-input select option,.lepopup-form-60 .lepopup-element div.lepopup-input textarea{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;background-color:rgba(255, 255, 255, 0.7);background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow: inset 0px 0px 15px -7px #000000;}.lepopup-form-60 .lepopup-element div.lepopup-input ::placeholder{color:#555555; opacity: 0.9;} .lepopup-form-60 .lepopup-element div.lepopup-input ::-ms-input-placeholder{color:#555555; opacity: 0.9;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect::-webkit-scrollbar-thumb{background-color:#cccccc;}.lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-left, .lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-right{font-size:20px;color:#444444;border-radius:0px;}.lepopup-form-60 .lepopup-element .lepopup-button,.lepopup-form-60 .lepopup-element .lepopup-button:visited{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#ffffff;font-weight:700;font-style:normal;text-decoration:none;text-align:center;background-color:#326693;background-image:none;border-width:1px;border-style:solid;border-color:#326693;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label{border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label span.lepopup-imageselect-label{font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label:after{background-color:rgba(255, 255, 255, 0.7);}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]+label:hover{background-color:#bd4070;color:#ffffff;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]:checked+label{background-color:#a93a65;color:#ffffff;}.lepopup-form-60 .lepopup-element input[type=&#39;checkbox&#39;].lepopup-tile+label, .lepopup-form-60 .lepopup-element input[type=&#39;radio&#39;].lepopup-tile+label {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:center;background-color:#ffffff;background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element-error{font-size:15px;color:#ffffff;font-style:normal;text-decoration:none;text-align:left;background-color:#d9534f;background-image:none;}.lepopup-form-60 .lepopup-element-2 {background-color:rgba(226, 236, 250, 1);background-image:none;border-width:1px;border-style:solid;border-color:rgba(216, 216, 216, 1);border-radius:3px;box-shadow: 1px 1px 15px -6px #d7e1eb;}.lepopup-form-60 .lepopup-element-3 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-3 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-3 .lepopup-element-html-content {min-height:73px;}.lepopup-form-60 .lepopup-element-4 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-4 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-4 .lepopup-element-html-content {min-height:23px;}.lepopup-form-60 .lepopup-element-5 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-5 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-5 .lepopup-element-html-content {min-height:24px;}.lepopup-form-60 .lepopup-element-6 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-6 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-6 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-7 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-7 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-7 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-8 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-8 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-8 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-9 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-9 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-9 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-10 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-10 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-10 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-11 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-11 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-11 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-12 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-12 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-12 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-13 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-13 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-13 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-left, .lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-right {line-height:36px;}.lepopup-form-60 .lepopup-element-15 div.lepopup-input{height:auto;line-height:1;}.lepopup-form-60 .lepopup-element-16 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-16 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-16 .lepopup-element-html-content {min-height:5px;}.lepopup-form-60 .lepopup-element-19 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-19 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-19 .lepopup-element-html-content {min-height:363px;}.lepopup-form-60 .lepopup-element-0 * {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-0 {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:#5cb85c;background-image:none;border-width:0px;border-style:solid;border-color:#ccc;border-radius:5px;box-shadow: 1px 1px 15px -6px #000000;padding-top:40px;padding-right:40px;padding-bottom:40px;padding-left:40px;}.lepopup-form-60 .lepopup-element-0 .lepopup-element-html-content {min-height:160px;}&lt;/style&gt;&lt;div class=lepopup-inline style=&#34;margin: 0 auto;&#34;&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-sMT4UgebLE9zVman lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=sMT4UgebLE9zVman data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=1 data-xd=off data-width=820 data-height=430 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:820px;height:430px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:820px;height:430px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-2 lepopup-element-rectangle&#34; data-type=rectangle data-top=0 data-left=0 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:501;top:0px;left:0px;width:820px;height:430px;&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-3 lepopup-element-html&#34; data-type=html data-top=7 data-left=10 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:502;top:7px;left:10px;width:797px;height:73px;&gt;&lt;div class=lepopup-element-html-content&gt;Do you want to know how to develop your skillset to become a &lt;span style=&#34;color: #CAB43D; text-shadow: 1px 1px #835D5D;&#34;&gt;Java Rockstar?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-4 lepopup-element-html&#34; data-type=html data-top=83 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:503;top:83px;left:308px;width:473px;height:23px;&gt;&lt;div class=lepopup-element-html-content&gt;Subscribe to our newsletter to start Rocking &lt;span style=&#34;text-decoration: underline;&#34;&gt;right now!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-5 lepopup-element-html&#34; data-type=html data-top=107 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:504;top:107px;left:308px;width:473px;height:24px;&gt;&lt;div class=lepopup-element-html-content&gt;To get you started we give you our best selling eBooks for &lt;span style=&#34;color:#e01404; text-shadow: 1px 1px #C99924; font-size: 15px;&#34;&gt;FREE!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-6 lepopup-element-html&#34; data-type=html data-top=136 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:505;top:136px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;1.&lt;/span&gt; JPA Mini Book&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-7 lepopup-element-html&#34; data-type=html data-top=156 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:506;top:156px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;2.&lt;/span&gt; JVM Troubleshooting Guide&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-8 lepopup-element-html&#34; data-type=html data-top=176 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:507;top:176px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;3.&lt;/span&gt; JUnit Tutorial for Unit Testing&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-9 lepopup-element-html&#34; data-type=html data-top=196 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:508;top:196px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;4.&lt;/span&gt; Java Annotations Tutorial&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-10 lepopup-element-html&#34; data-type=html data-top=216 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:509;top:216px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;5.&lt;/span&gt; Java Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-11 lepopup-element-html&#34; data-type=html data-top=236 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:510;top:236px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;6.&lt;/span&gt; Spring Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-12 lepopup-element-html&#34; data-type=html data-top=256 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:511;top:256px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;7.&lt;/span&gt; Android UI Design&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-13 lepopup-element-html&#34; data-type=html data-top=282 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:512;top:282px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;and many more ....&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-14&#34; data-type=email data-deps data-id=14 data-top=305 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:513;top:305px;left:308px;width:473px;height:36px;&gt;&lt;div class=lepopup-input&gt;&lt;input type=email name=lepopup-14 class=lepopup-ta-left placeholder=&#34;Enter your e-mail...&#34; autocomplete=email data-default aria-label=&#34;Email Field&#34; oninput=lepopup_input_changed(this); onfocus=lepopup_input_error_hide(this);&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-15&#34; data-type=checkbox data-deps data-id=15 data-top=344 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:514;top:344px;left:308px;width:160px;&gt;&lt;div class=&#34;lepopup-input lepopup-cr-layout-1 lepopup-cr-layout-left&#34;&gt;&lt;div class=&#34;lepopup-cr-container lepopup-cr-container-medium lepopup-cr-container-left&#34;&gt;&lt;div class=lepopup-cr-box&gt;&lt;input class=&#34;lepopup-checkbox lepopup-checkbox-classic lepopup-checkbox-medium&#34; type=checkbox name=lepopup-15[] id=lepopup-checkbox-rLygs1RKrhiZOS3i-14-0 value=on data-default=off onchange=lepopup_input_changed(this);&gt;&lt;label for=lepopup-checkbox-rLygs1RKrhiZOS3i-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-cr-label lepopup-ta-left&#34;&gt;&lt;label for=lepopup-checkbox-rLygs1RKrhiZOS3i-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-16 lepopup-element-html&#34; data-type=html data-top=344 data-left=338 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:515;top:344px;left:338px;width:350px;height:5px;&gt;&lt;div class=lepopup-element-html-content&gt;I agree to the &lt;a href=https://www.javacodegeeks.com/about/terms-of-use target=_blank&gt;Terms&lt;/a&gt; and &lt;a href=https://www.javacodegeeks.com/about/privacy-policy target=_blank&gt;Privacy Policy&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-17&#34; data-type=button data-top=372 data-left=308 data-animation-in=bounceIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:516;top:372px;left:308px;width:85px;height:37px;&gt;&lt;a class=&#34;lepopup-button lepopup-button-zoom-out&#34; href=https://www.javacodegeeks.com/feed/ onclick=&#34;return lepopup_submit(this);&#34; data-label=&#34;Sign up&#34; data-loading=Loading...&gt;&lt;span&gt;Sign up&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-19 lepopup-element-html&#34; data-type=html data-top=67 data-left=-15 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:518;top:67px;left:-15px;width:320px;height:363px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png decoding=async data-src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png alt width=320 height=363&gt;&lt;noscript&gt;&lt;img decoding=async src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png alt width=320 height=363&gt;&lt;/noscript&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-sMT4UgebLE9zVman lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=sMT4UgebLE9zVman data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=confirmation data-xd=off data-width=420 data-height=320 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:420px;height:320px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:420px;height:320px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-0 lepopup-element-html&#34; data-type=html data-top=80 data-left=70 data-animation-in=bounceInDown data-animation-out=fadeOutUp style=animation-duration:1000ms;animation-delay:0ms;z-index:500;top:80px;left:70px;width:280px;height:160px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;h4 style=&#34;text-align: center; font-size: 18px; font-weight: bold;&#34;&gt;Thank you!&lt;/h4&gt;&lt;p style=&#34;text-align: center;&#34;&gt;We will contact you soon.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;input type=hidden id=lepopup-logic-sMT4UgebLE9zVman value=[]&gt;&lt;/div&gt;&lt;div class=&#34;post-bottom-meta post-bottom-tags post-tags-classic&#34;&gt;&lt;div class=post-bottom-meta-title&gt;&lt;span class=tie-icon-tags aria-hidden=true&gt;&lt;/span&gt;Tags&lt;/div&gt;&lt;span class=tagcloud&gt;&lt;a href=https://www.javacodegeeks.com/tag/integration-testing rel=tag&gt;integration testing&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/spring-boot-4-2 rel=tag&gt;Spring Boot 4&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/testcontainers rel=tag&gt;Testcontainers&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=post-extra-info&gt;&lt;div class=theiaStickySidebar&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=clearfix&gt;&lt;/div&gt;</description>
      <author>Eleftheria Drosopoulou</author>
      <guid>https://www.javacodegeeks.com/2026/08/testcontainers-spring-boot-4-the-integration-test-setup-teams-actually-use.html</guid>
      <pubDate>Wed, 26 Aug 2026 16:01:00 +0000</pubDate>
    </item>
    <item>
      <title>Spring AI with Local LLMs Using LM Studio</title>
      <link>https://www.javacodegeeks.com/spring-ai-with-local-llms-using-lm-studio.html</link>
      <description>&lt;header class=entry-header-outer&gt;&lt;nav id=breadcrumb&gt;&lt;a href=https://www.javacodegeeks.com/&gt;&lt;span class=tie-icon-home aria-hidden=true&gt;&lt;/span&gt;Home&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;a href=https://www.javacodegeeks.com/category/java&gt;Java&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;a href=https://www.javacodegeeks.com/category/java/enterprise-java&gt;Enterprise Java&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;span class=current&gt;Spring AI with Local LLMs Using LM Studio&lt;/span&gt;&lt;/nav&gt;&lt;div class=entry-header&gt;&lt;span class=post-cat-wrap&gt;&lt;a class=&#34;post-cat tie-cat-8&#34; href=https://www.javacodegeeks.com/category/java/enterprise-java&gt;Enterprise Java&lt;/a&gt;&lt;/span&gt;&lt;h1 class=&#34;post-title entry-title&#34;&gt;Spring AI with Local LLMs Using LM Studio&lt;/h1&gt;&lt;/div&gt;&lt;/header&gt;&lt;div class=&#34;entry-content entry clearfix&#34;&gt;&lt;div class=&#34;stream-item stream-item-above-post-content&#34;&gt;&lt;div class=stream-item-size&gt;&lt;div id=adngin-in-post-0 style=&#34;float:left; margin-right:20px; margin-bottom:10px; width:300px; height:274px;&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=https://en.wikipedia.org/wiki/Large_language_model target=_blank rel=&#34;noopener noreferrer&#34;&gt;Large Language Models (LLMs)&lt;/a&gt; are commonly accessed through cloud APIs provided by services such as &lt;a href=https://en.wikipedia.org/wiki/OpenAI target=_blank rel=&#34;noopener noreferrer&#34;&gt;OpenAI&lt;/a&gt;, &lt;a href=https://en.wikipedia.org/wiki/Anthropic target=_blank rel=&#34;noopener noreferrer&#34;&gt;Anthropic&lt;/a&gt;, or &lt;a href=https://en.wikipedia.org/wiki/Gemini_(language_model) target=_blank rel=&#34;noopener noreferrer&#34;&gt;Google Gemini&lt;/a&gt;. However, there are many situations where developers may want to execute an LLM locally instead. Running an LLM locally can be useful for development, experimentation, privacy-sensitive applications, offline environments, and situations where calling an external AI service for every request is unnecessary. &lt;a href=https://lmstudio.ai/ target=_blank rel=&#34;noopener noreferrer&#34;&gt;LM Studio&lt;/a&gt; makes running local language models relatively simple by allowing developers to download and execute compatible open-source models and expose them through an &lt;a href=https://en.wikipedia.org/wiki/API target=_blank rel=&#34;noopener noreferrer&#34;&gt;HTTP API&lt;/a&gt;. More importantly for Java developers, LM Studio provides an OpenAI-compatible API. &lt;a href=https://spring.io/projects/spring-ai target=_blank rel=&#34;noopener noreferrer&#34;&gt;Spring AI&lt;/a&gt; already supports the OpenAI API format, allowing a &lt;a href=https://en.wikipedia.org/wiki/Spring_Boot target=_blank rel=&#34;noopener noreferrer&#34;&gt;Spring Boot&lt;/a&gt; application to communicate with LM Studio without creating a custom HTTP client.&lt;h2&gt;&lt;a name=section-1&gt;&lt;/a&gt;1. Understanding Local LLMs and LM Studio&lt;/h2&gt;&lt;p&gt;In this article, we will build a simple Spring Boot application that integrates with a local Large Language Model (LLM) running in LM Studio using Spring AI. The overall flow is straightforward: a client sends a question to the Spring Boot REST API, the controller passes the prompt to Spring AI, and Spring AI sends an OpenAI-compatible request to LM Studio. LM Studio then forwards the prompt to the locally loaded LLM, which generates a response and returns it through LM Studio and Spring AI back to the Spring Boot application, where the final answer is sent to the client.&lt;h3&gt;1.1 What is a Local LLM?&lt;/h3&gt;&lt;p&gt;A local LLM is a language model that runs directly on your computer or on infrastructure you control, rather than relying on an external cloud-based AI service. This means prompts, such as “Explain dependency injection in Java,” can be processed locally without being sent to a third-party API. Popular model families that can be run locally include Llama, Mistral, Qwen, Gemma, Phi, and DeepSeek. The right model depends on factors such as available system memory, CPU or GPU capabilities, desired response quality, model size, and expected inference speed.&lt;h4&gt;1.1.1 Why Use Local LLMs?&lt;/h4&gt;&lt;p&gt;Running LLMs locally provides several advantages, particularly for privacy, cost, and development flexibility. Since prompts can be processed directly on the local machine, sensitive information does not need to be sent to an external AI provider. Once a model has been downloaded, it can also perform inference without an active Internet connection, making it useful for offline environments. Local models do not have per-request API charges because they use your own computing resources, although hardware and electricity costs still apply. They are also convenient for developing and testing AI-powered applications without repeatedly calling external services. In addition, developers have greater control over which model is used, how it is configured, and where the inference process takes place.&lt;h3&gt;1.2 What is LM Studio?&lt;/h3&gt;&lt;p&gt;LM Studio is a desktop application that allows developers to download, load, and run LLMs locally. One of its most useful features is the built-in local API server, which is commonly available at &lt;code&gt;http://localhost:1234&lt;/code&gt;. LM Studio exposes OpenAI-compatible endpoints such as &lt;code&gt;GET /v1/models&lt;/code&gt;, &lt;code&gt;POST /v1/chat/completions&lt;/code&gt;, and &lt;code&gt;POST /v1/embeddings&lt;/code&gt;. For this example, the most important endpoint is &lt;code&gt;POST http://localhost:1234/v1/chat/completions&lt;/code&gt;, which is used to send prompts to the locally running model. Since Spring AI already supports the OpenAI API format, we do not need to create a custom LM Studio client. Instead, we can simply configure Spring AI’s OpenAI integration to use LM Studio’s local server URL.&lt;h2&gt;&lt;a name=section-2&gt;&lt;/a&gt;2. Integrating Spring AI with LM Studio&lt;/h2&gt;&lt;h3&gt;2.1 Maven Dependencies&lt;/h3&gt;&lt;p&gt;To get started, we need to configure the required dependencies in the project’s &lt;code&gt;pom.xml&lt;/code&gt; file. The following Maven configuration includes Spring Web for creating the REST API and Spring AI’s OpenAI-compatible integration for communicating with the local LLM running in LM Studio.&lt;pre class=&#34;brush:xml; wrap-lines:false;&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&#xA;&#xA;&amp;lt;project xmlns=&amp;#34;http://maven.apache.org/POM/4.0.0&amp;#34;&#xA;         xmlns:xsi=&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&#xA;         xsi:schemaLocation=&amp;#34;&#xA;             http://maven.apache.org/POM/4.0.0&#xA;             https://maven.apache.org/xsd/maven-4.0.0.xsd&amp;#34;&amp;gt;&#xA;&#xA;    &amp;lt;modelVersion&amp;gt;stable__jar__version&amp;lt;/modelVersion&amp;gt;&#xA;&#xA;    &amp;lt;parent&amp;gt;&#xA;        &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&#xA;        &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt;&#xA;        &amp;lt;version&amp;gt;4.1.0&amp;lt;/version&amp;gt;&#xA;        &amp;lt;relativePath/&amp;gt;&#xA;    &amp;lt;/parent&amp;gt;&#xA;&#xA;    &amp;lt;groupId&amp;gt;com.example&amp;lt;/groupId&amp;gt;&#xA;    &amp;lt;artifactId&amp;gt;local-llm-demo&amp;lt;/artifactId&amp;gt;&#xA;    &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt;&#xA;&#xA;    &amp;lt;name&amp;gt;local-llm-demo&amp;lt;/name&amp;gt;&#xA;    &amp;lt;description&amp;gt;Spring AI integration with LM Studio&amp;lt;/description&amp;gt;&#xA;&#xA;    &amp;lt;properties&amp;gt;&#xA;        &amp;lt;java.version&amp;gt;21&amp;lt;/java.version&amp;gt;&#xA;        &amp;lt;spring-ai.version&amp;gt;2.0.0&amp;lt;/spring-ai.version&amp;gt;&#xA;    &amp;lt;/properties&amp;gt;&#xA;&#xA;    &amp;lt;dependencies&amp;gt;&#xA;&#xA;        &amp;lt;!-- Spring MVC / REST --&amp;gt;&#xA;        &amp;lt;dependency&amp;gt;&#xA;            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&#xA;            &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt;&#xA;        &amp;lt;/dependency&amp;gt;&#xA;&#xA;        &amp;lt;!-- Spring AI OpenAI-compatible client --&amp;gt;&#xA;        &amp;lt;dependency&amp;gt;&#xA;            &amp;lt;groupId&amp;gt;org.springframework.ai&amp;lt;/groupId&amp;gt;&#xA;            &amp;lt;artifactId&amp;gt;spring-ai-starter-model-openai&amp;lt;/artifactId&amp;gt;&#xA;        &amp;lt;/dependency&amp;gt;&#xA;&#xA;    &amp;lt;/dependencies&amp;gt;&#xA;&#xA;    &amp;lt;dependencyManagement&amp;gt;&#xA;        &amp;lt;dependencies&amp;gt;&#xA;&#xA;            &amp;lt;dependency&amp;gt;&#xA;                &amp;lt;groupId&amp;gt;org.springframework.ai&amp;lt;/groupId&amp;gt;&#xA;                &amp;lt;artifactId&amp;gt;spring-ai-bom&amp;lt;/artifactId&amp;gt;&#xA;                &amp;lt;version&amp;gt;${spring-ai.version}&amp;lt;/version&amp;gt;&#xA;                &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;&#xA;                &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt;&#xA;            &amp;lt;/dependency&amp;gt;&#xA;&#xA;        &amp;lt;/dependencies&amp;gt;&#xA;    &amp;lt;/dependencyManagement&amp;gt;&#xA;&#xA;    &amp;lt;build&amp;gt;&#xA;        &amp;lt;plugins&amp;gt;&#xA;&#xA;            &amp;lt;plugin&amp;gt;&#xA;                &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;&#xA;                &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt;&#xA;            &amp;lt;/plugin&amp;gt;&#xA;&#xA;        &amp;lt;/plugins&amp;gt;&#xA;    &amp;lt;/build&amp;gt;&#xA;&#xA;&amp;lt;/project&amp;gt;&#xA;&lt;/pre&gt;&lt;p&gt;The Maven configuration uses &lt;code&gt;spring-boot-starter-parent&lt;/code&gt; as the project parent and Java 21 as the Java version. The &lt;code&gt;spring-boot-starter-web&lt;/code&gt; dependency provides Spring MVC and the components required to expose REST endpoints, while &lt;code&gt;spring-ai-starter-model-openai&lt;/code&gt; provides Spring AI’s OpenAI-compatible chat model integration, which can communicate with LM Studio because LM Studio exposes an OpenAI-compatible API. The &lt;code&gt;spring-ai-bom&lt;/code&gt; is imported through &lt;code&gt;dependencyManagement&lt;/code&gt; to keep Spring AI dependency versions consistent, and the &lt;code&gt;spring-boot-maven-plugin&lt;/code&gt; allows the application to be packaged and run as a Spring Boot application.&lt;div style=&#34;display:inline-block; margin: 15px 0;&#34;&gt;&lt;div id=adngin-JavaCodeGeeks_incontent_video-0 style=display:inline-block;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;h3&gt;2.2 Configure application.properties&lt;/h3&gt;&lt;p&gt;Next, we need to configure the Spring Boot application so that Spring AI communicates with the local LLM through LM Studio instead of an external OpenAI server. Add the following properties to the &lt;code&gt;src/main/resources/application.properties&lt;/code&gt; file, and make sure to replace the model name with the actual model ID loaded in your LM Studio instance.&lt;pre class=&#34;brush:plain; wrap-lines:false;&#34;&gt;spring.application.name=local-llm-demo&#xA;&#xA;# LM Studio local server&#xA;spring.ai.openai.base-url=http://localhost:1234&#xA;&#xA;# LM Studio does not require an API key by default.&#xA;# Spring AI expects a value, so we provide a placeholder.&#xA;spring.ai.openai.api-key=lm-studio&#xA;&#xA;# Replace this with the model ID shown by LM Studio&#xA;spring.ai.openai.chat.options.model=qwen2.5-7b-instruct&#xA;&#xA;spring.ai.openai.chat.options.temperature=0.7&#xA;&#xA;server.port=8080&#xA;&lt;/pre&gt;&lt;p&gt;This configuration sets the application name to &lt;code&gt;local-llm-demo&lt;/code&gt; and points Spring AI’s OpenAI client to the LM Studio server running at &lt;code&gt;http://localhost:1234&lt;/code&gt;. The &lt;code&gt;spring.ai.openai.api-key&lt;/code&gt; property uses &lt;code&gt;lm-studio&lt;/code&gt; as a placeholder because LM Studio does not require an API key by default, while Spring AI expects this property to have a value. The &lt;code&gt;spring.ai.openai.chat.options.model&lt;/code&gt; property specifies the local model that will process the prompts, so &lt;code&gt;qwen2.5-7b-instruct&lt;/code&gt; should be replaced with the model ID available in your LM Studio setup. The &lt;code&gt;temperature&lt;/code&gt; value of &lt;code&gt;0.7&lt;/code&gt; controls the variability of generated responses, while &lt;code&gt;server.port=8080&lt;/code&gt; configures the Spring Boot application to run on port &lt;code&gt;8080&lt;/code&gt;.&lt;h3&gt;2.3 Create the Spring Boot Application&lt;/h3&gt;&lt;p&gt;Now, create the main Spring Boot application class that serves as the entry point for the project. The &lt;code&gt;LocalLlmApplication&lt;/code&gt; class starts the Spring application, initializes the application context, and enables Spring Boot’s auto-configuration so that the required Spring Web and Spring AI components can be configured automatically.&lt;pre class=&#34;brush:java; wrap-lines:false;&#34;&gt;// LocalLlmApplication.java&#xA;package com.example.localllm;&#xA;&#xA;import org.springframework.boot.SpringApplication;&#xA;import org.springframework.boot.autoconfigure.SpringBootApplication;&#xA;&#xA;@SpringBootApplication&#xA;public class LocalLlmApplication {&#xA;&#xA;    public static void main(String[] args) {&#xA;        SpringApplication.run(LocalLlmApplication.class, args);&#xA;    }&#xA;}&#xA;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;@SpringBootApplication&lt;/code&gt; annotation marks this class as the main configuration class and combines component scanning, auto-configuration, and Spring Boot configuration. The &lt;code&gt;main()&lt;/code&gt; method calls &lt;code&gt;SpringApplication.run()&lt;/code&gt; to start the application and initialize the Spring context. During startup, Spring Boot discovers components such as controllers and services and configures the Spring AI integration based on the settings defined in &lt;code&gt;application.properties&lt;/code&gt;.&lt;h3&gt;2.4 Create the Response Model&lt;/h3&gt;&lt;p&gt;Next, create a simple response model that represents the data returned by our REST API. Instead of returning the LLM-generated answer as plain text, we will wrap it in a &lt;code&gt;ChatResponse&lt;/code&gt; record so that Spring Boot automatically returns the response in a clean JSON format.&lt;pre class=&#34;brush:java; wrap-lines:false;&#34;&gt;// ChatResponse.java&#xA;package com.example.localllm;&#xA;&#xA;public record ChatResponse(String answer) {&#xA;}&#xA;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;ChatResponse&lt;/code&gt; record contains a single &lt;code&gt;answer&lt;/code&gt; field that stores the text generated by the local LLM. Java records provide a concise way to create immutable data carrier classes without manually writing constructors, getters, or other boilerplate code. When a &lt;code&gt;ChatResponse&lt;/code&gt; object is returned from the REST controller, Spring Boot automatically serializes it into JSON, producing a response such as &lt;code&gt;{&amp;#34;answer&amp;#34;:&amp;#34;Spring Boot simplifies the development of Spring applications.&amp;#34;}&lt;/code&gt;.&lt;h3&gt;2.5 Create the LLM Service&lt;/h3&gt;&lt;p&gt;Next, create a service class that handles the interaction between the Spring Boot application and the local LLM running in LM Studio. The &lt;code&gt;LocalLlmService&lt;/code&gt; uses Spring AI’s &lt;code&gt;ChatClient&lt;/code&gt; to build a prompt, send the user’s message to the configured model, and return the generated response.&lt;pre class=&#34;brush:java; wrap-lines:false;&#34;&gt;// LocalLlmService.java&#xA;package com.example.localllm;&#xA;&#xA;import org.springframework.ai.chat.client.ChatClient;&#xA;import org.springframework.stereotype.Service;&#xA;&#xA;@Service&#xA;public class LocalLlmService {&#xA;&#xA;    private final ChatClient chatClient;&#xA;&#xA;    public LocalLlmService(ChatClient.Builder chatClientBuilder) {&#xA;        this.chatClient = chatClientBuilder.build();&#xA;    }&#xA;&#xA;    public String ask(String message) {&#xA;&#xA;        return chatClient&#xA;                .prompt()&#xA;                .system(&amp;#34;&amp;#34;&amp;#34;&#xA;                        You are a helpful Java programming assistant.&#xA;                        Explain concepts clearly and concisely.&#xA;                        Use simple examples when appropriate.&#xA;                        &amp;#34;&amp;#34;&amp;#34;)&#xA;                .user(message)&#xA;                .call()&#xA;                .content();&#xA;    }&#xA;}&#xA;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;@Service&lt;/code&gt; annotation registers &lt;code&gt;LocalLlmService&lt;/code&gt; as a Spring-managed component, while &lt;code&gt;ChatClient.Builder&lt;/code&gt; is injected through the constructor and used to create a &lt;code&gt;ChatClient&lt;/code&gt;. Inside the &lt;code&gt;ask()&lt;/code&gt; method, &lt;code&gt;prompt()&lt;/code&gt; starts building the request, &lt;code&gt;system()&lt;/code&gt; provides instructions that define how the model should respond, and &lt;code&gt;user(message)&lt;/code&gt; adds the actual question received from the user. The &lt;code&gt;call()&lt;/code&gt; method sends the request through Spring AI to the OpenAI-compatible endpoint provided by LM Studio, where the local LLM generates the response, and &lt;code&gt;content()&lt;/code&gt; extracts and returns the generated text.&lt;h3&gt;2.6 Create the REST Controller&lt;/h3&gt;&lt;p&gt;Finally, create a REST controller that exposes an HTTP endpoint for interacting with the local LLM. The &lt;code&gt;ChatController&lt;/code&gt; receives the user’s message as a request parameter, passes it to &lt;code&gt;LocalLlmService&lt;/code&gt; for processing, and returns the model-generated answer as a &lt;code&gt;ChatResponse&lt;/code&gt; object.&lt;pre class=&#34;brush:java; wrap-lines:false;&#34;&gt;// ChatController.java&#xA;package com.example.localllm;&#xA;&#xA;import org.springframework.web.bind.annotation.GetMapping;&#xA;import org.springframework.web.bind.annotation.RequestMapping;&#xA;import org.springframework.web.bind.annotation.RequestParam;&#xA;import org.springframework.web.bind.annotation.RestController;&#xA;&#xA;@RestController&#xA;@RequestMapping(&amp;#34;/api&amp;#34;)&#xA;public class ChatController {&#xA;&#xA;    private final LocalLlmService localLlmService;&#xA;&#xA;    public ChatController(LocalLlmService localLlmService) {&#xA;        this.localLlmService = localLlmService;&#xA;    }&#xA;&#xA;    @GetMapping(&amp;#34;/chat&amp;#34;)&#xA;    public ChatResponse chat(@RequestParam String message) {&#xA;&#xA;        String answer = localLlmService.ask(message);&#xA;&#xA;        return new ChatResponse(answer);&#xA;    }&#xA;}&#xA;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;@RestController&lt;/code&gt; annotation marks &lt;code&gt;ChatController&lt;/code&gt; as a REST API controller, while &lt;code&gt;@RequestMapping(&amp;#34;/api&amp;#34;)&lt;/code&gt; defines the base path for its endpoints. The &lt;code&gt;@GetMapping(&amp;#34;/chat&amp;#34;)&lt;/code&gt; annotation exposes the &lt;code&gt;GET /api/chat&lt;/code&gt; endpoint, and &lt;code&gt;@RequestParam String message&lt;/code&gt; reads the user’s prompt from the &lt;code&gt;message&lt;/code&gt; query parameter. The controller passes this message to the &lt;code&gt;LocalLlmService.ask()&lt;/code&gt; method, which sends it to the local LLM through Spring AI and LM Studio. The generated answer is then wrapped in a &lt;code&gt;ChatResponse&lt;/code&gt; object and automatically serialized by Spring Boot into a JSON response.&lt;h3&gt;2.7 Run and Test the Application&lt;/h3&gt;&lt;p&gt;Before running the Spring Boot application, make sure LM Studio is running, the required LLM is loaded, and the local API server is started on &lt;code&gt;http://localhost:1234&lt;/code&gt;. Once LM Studio is ready, start the Spring Boot application using the following Maven command.&lt;pre class=&#34;brush:plain; wrap-lines:false;&#34;&gt;mvn spring-boot:run&#xA;&lt;/pre&gt;&lt;p&gt;After the application starts successfully, it will be available on port &lt;code&gt;8080&lt;/code&gt;. We can now test the REST endpoint by sending a message through the &lt;code&gt;message&lt;/code&gt; query parameter using the following command.&lt;pre class=&#34;brush:plain; wrap-lines:false;&#34;&gt;curl &amp;#34;http://localhost:8080/api/chat?message=Explain%20dependency%20injection%20in%20Java&amp;#34;&#xA;&lt;/pre&gt;&lt;p&gt;The request is received by &lt;code&gt;ChatController&lt;/code&gt; and passed to &lt;code&gt;LocalLlmService&lt;/code&gt;, which uses Spring AI to send the prompt to the local model running in LM Studio. The generated answer is then returned by the application as a JSON response. Since the response is generated by an LLM, the exact content may vary depending on the model and its configuration.&lt;pre class=&#34;brush:plain; wrap-lines:true;&#34;&gt;{&#xA;  &amp;#34;answer&amp;#34;: &amp;#34;Dependency injection is a design pattern in which a class receives its dependencies from an external source instead of creating them itself. In Spring, dependencies are commonly provided through constructor injection.&amp;#34;&#xA;}&#xA;&lt;/pre&gt;&lt;p&gt;This output confirms that the complete integration is working successfully: the client sends a request to the Spring Boot REST API, Spring AI communicates with LM Studio through its OpenAI-compatible API, the local LLM processes the prompt, and the generated response is returned to the client without requiring a cloud-based LLM API.&lt;h2&gt;&lt;a name=section-3&gt;&lt;/a&gt;3. Conclusion&lt;/h2&gt;&lt;p&gt;Integrating a local LLM with Spring Boot using Spring AI and LM Studio provides a simple way to build AI-powered Java applications without depending on a cloud-based LLM service. LM Studio makes it easy to download and run models locally while exposing an OpenAI-compatible API, and Spring AI provides the &lt;code&gt;ChatClient&lt;/code&gt; abstraction needed to communicate with that API using familiar Spring programming patterns. With only a few dependencies, configuration properties, a service, and a REST controller, we can send prompts from a Spring Boot application to a locally running model and return the generated responses to clients. This approach is particularly useful for local development, experimentation, offline environments, and applications where greater control over model execution and data privacy is important.&lt;/p&gt;&lt;style&gt;.lepopup-progress-60 div.lepopup-progress-t1&gt;div{background-color:#e0e0e0;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{background-color:#bd4070;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{color:#ffffff;}.lepopup-progress-60 div.lepopup-progress-t1&gt;label{color:#444444;}.lepopup-form-60, .lepopup-form-60 *, .lepopup-progress-60 {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box span i{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box,.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;text&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;email&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;password&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input select,.lepopup-form-60 .lepopup-element div.lepopup-input select option,.lepopup-form-60 .lepopup-element div.lepopup-input textarea{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;background-color:rgba(255, 255, 255, 0.7);background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow: inset 0px 0px 15px -7px #000000;}.lepopup-form-60 .lepopup-element div.lepopup-input ::placeholder{color:#555555; opacity: 0.9;} .lepopup-form-60 .lepopup-element div.lepopup-input ::-ms-input-placeholder{color:#555555; opacity: 0.9;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect::-webkit-scrollbar-thumb{background-color:#cccccc;}.lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-left, .lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-right{font-size:20px;color:#444444;border-radius:0px;}.lepopup-form-60 .lepopup-element .lepopup-button,.lepopup-form-60 .lepopup-element .lepopup-button:visited{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#ffffff;font-weight:700;font-style:normal;text-decoration:none;text-align:center;background-color:#326693;background-image:none;border-width:1px;border-style:solid;border-color:#326693;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label{border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label span.lepopup-imageselect-label{font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label:after{background-color:rgba(255, 255, 255, 0.7);}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]+label:hover{background-color:#bd4070;color:#ffffff;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]:checked+label{background-color:#a93a65;color:#ffffff;}.lepopup-form-60 .lepopup-element input[type=&#39;checkbox&#39;].lepopup-tile+label, .lepopup-form-60 .lepopup-element input[type=&#39;radio&#39;].lepopup-tile+label {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:center;background-color:#ffffff;background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element-error{font-size:15px;color:#ffffff;font-style:normal;text-decoration:none;text-align:left;background-color:#d9534f;background-image:none;}.lepopup-form-60 .lepopup-element-2 {background-color:rgba(226, 236, 250, 1);background-image:none;border-width:1px;border-style:solid;border-color:rgba(216, 216, 216, 1);border-radius:3px;box-shadow: 1px 1px 15px -6px #d7e1eb;}.lepopup-form-60 .lepopup-element-3 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-3 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-3 .lepopup-element-html-content {min-height:73px;}.lepopup-form-60 .lepopup-element-4 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-4 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-4 .lepopup-element-html-content {min-height:23px;}.lepopup-form-60 .lepopup-element-5 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-5 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-5 .lepopup-element-html-content {min-height:24px;}.lepopup-form-60 .lepopup-element-6 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-6 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-6 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-7 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-7 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-7 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-8 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-8 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-8 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-9 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-9 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-9 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-10 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-10 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-10 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-11 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-11 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-11 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-12 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-12 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-12 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-13 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-13 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-13 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-left, .lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-right {line-height:36px;}.lepopup-form-60 .lepopup-element-15 div.lepopup-input{height:auto;line-height:1;}.lepopup-form-60 .lepopup-element-16 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-16 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-16 .lepopup-element-html-content {min-height:5px;}.lepopup-form-60 .lepopup-element-19 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-19 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-19 .lepopup-element-html-content {min-height:363px;}.lepopup-form-60 .lepopup-element-0 * {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-0 {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:#5cb85c;background-image:none;border-width:0px;border-style:solid;border-color:#ccc;border-radius:5px;box-shadow: 1px 1px 15px -6px #000000;padding-top:40px;padding-right:40px;padding-bottom:40px;padding-left:40px;}.lepopup-form-60 .lepopup-element-0 .lepopup-element-html-content {min-height:160px;}&lt;/style&gt;&lt;div class=lepopup-inline style=&#34;margin: 0 auto;&#34;&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-Vys9yz9R3SoxgI3e lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=Vys9yz9R3SoxgI3e data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=1 data-xd=off data-width=820 data-height=430 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:820px;height:430px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:820px;height:430px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-2 lepopup-element-rectangle&#34; data-type=rectangle data-top=0 data-left=0 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:501;top:0px;left:0px;width:820px;height:430px;&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-3 lepopup-element-html&#34; data-type=html data-top=7 data-left=10 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:502;top:7px;left:10px;width:797px;height:73px;&gt;&lt;div class=lepopup-element-html-content&gt;Do you want to know how to develop your skillset to become a &lt;span style=&#34;color: #CAB43D; text-shadow: 1px 1px #835D5D;&#34;&gt;Java Rockstar?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-4 lepopup-element-html&#34; data-type=html data-top=83 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:503;top:83px;left:308px;width:473px;height:23px;&gt;&lt;div class=lepopup-element-html-content&gt;Subscribe to our newsletter to start Rocking &lt;span style=&#34;text-decoration: underline;&#34;&gt;right now!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-5 lepopup-element-html&#34; data-type=html data-top=107 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:504;top:107px;left:308px;width:473px;height:24px;&gt;&lt;div class=lepopup-element-html-content&gt;To get you started we give you our best selling eBooks for &lt;span style=&#34;color:#e01404; text-shadow: 1px 1px #C99924; font-size: 15px;&#34;&gt;FREE!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-6 lepopup-element-html&#34; data-type=html data-top=136 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:505;top:136px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;1.&lt;/span&gt; JPA Mini Book&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-7 lepopup-element-html&#34; data-type=html data-top=156 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:506;top:156px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;2.&lt;/span&gt; JVM Troubleshooting Guide&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-8 lepopup-element-html&#34; data-type=html data-top=176 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:507;top:176px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;3.&lt;/span&gt; JUnit Tutorial for Unit Testing&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-9 lepopup-element-html&#34; data-type=html data-top=196 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:508;top:196px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;4.&lt;/span&gt; Java Annotations Tutorial&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-10 lepopup-element-html&#34; data-type=html data-top=216 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:509;top:216px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;5.&lt;/span&gt; Java Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-11 lepopup-element-html&#34; data-type=html data-top=236 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:510;top:236px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;6.&lt;/span&gt; Spring Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-12 lepopup-element-html&#34; data-type=html data-top=256 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:511;top:256px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;7.&lt;/span&gt; Android UI Design&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-13 lepopup-element-html&#34; data-type=html data-top=282 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:512;top:282px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;and many more ....&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-14&#34; data-type=email data-deps data-id=14 data-top=305 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:513;top:305px;left:308px;width:473px;height:36px;&gt;&lt;div class=lepopup-input&gt;&lt;input type=email name=lepopup-14 class=lepopup-ta-left placeholder=&#34;Enter your e-mail...&#34; autocomplete=email data-default aria-label=&#34;Email Field&#34; oninput=lepopup_input_changed(this); onfocus=lepopup_input_error_hide(this);&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-15&#34; data-type=checkbox data-deps data-id=15 data-top=344 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:514;top:344px;left:308px;width:160px;&gt;&lt;div class=&#34;lepopup-input lepopup-cr-layout-1 lepopup-cr-layout-left&#34;&gt;&lt;div class=&#34;lepopup-cr-container lepopup-cr-container-medium lepopup-cr-container-left&#34;&gt;&lt;div class=lepopup-cr-box&gt;&lt;input class=&#34;lepopup-checkbox lepopup-checkbox-classic lepopup-checkbox-medium&#34; type=checkbox name=lepopup-15[] id=lepopup-checkbox-LXCy4kXaLW5DU7uw-14-0 value=on data-default=off onchange=lepopup_input_changed(this);&gt;&lt;label for=lepopup-checkbox-LXCy4kXaLW5DU7uw-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-cr-label lepopup-ta-left&#34;&gt;&lt;label for=lepopup-checkbox-LXCy4kXaLW5DU7uw-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-16 lepopup-element-html&#34; data-type=html data-top=344 data-left=338 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:515;top:344px;left:338px;width:350px;height:5px;&gt;&lt;div class=lepopup-element-html-content&gt;I agree to the &lt;a href=https://www.javacodegeeks.com/about/terms-of-use target=_blank&gt;Terms&lt;/a&gt; and &lt;a href=https://www.javacodegeeks.com/about/privacy-policy target=_blank&gt;Privacy Policy&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-17&#34; data-type=button data-top=372 data-left=308 data-animation-in=bounceIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:516;top:372px;left:308px;width:85px;height:37px;&gt;&lt;a class=&#34;lepopup-button lepopup-button-zoom-out&#34; href=https://www.javacodegeeks.com/feed/ onclick=&#34;return lepopup_submit(this);&#34; data-label=&#34;Sign up&#34; data-loading=Loading...&gt;&lt;span&gt;Sign up&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-19 lepopup-element-html&#34; data-type=html data-top=67 data-left=-15 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:518;top:67px;left:-15px;width:320px;height:363px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png fetchpriority=high decoding=async data-src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png alt width=320 height=363&gt;&lt;noscript&gt;&lt;img fetchpriority=high decoding=async src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png alt width=320 height=363&gt;&lt;/noscript&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-Vys9yz9R3SoxgI3e lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=Vys9yz9R3SoxgI3e data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=confirmation data-xd=off data-width=420 data-height=320 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:420px;height:320px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:420px;height:320px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-0 lepopup-element-html&#34; data-type=html data-top=80 data-left=70 data-animation-in=bounceInDown data-animation-out=fadeOutUp style=animation-duration:1000ms;animation-delay:0ms;z-index:500;top:80px;left:70px;width:280px;height:160px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;h4 style=&#34;text-align: center; font-size: 18px; font-weight: bold;&#34;&gt;Thank you!&lt;/h4&gt;&lt;p style=&#34;text-align: center;&#34;&gt;We will contact you soon.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;input type=hidden id=lepopup-logic-Vys9yz9R3SoxgI3e value=[]&gt;&lt;/div&gt;&lt;div class=&#34;post-bottom-meta post-bottom-tags post-tags-classic&#34;&gt;&lt;div class=post-bottom-meta-title&gt;&lt;span class=tie-icon-tags aria-hidden=true&gt;&lt;/span&gt;Tags&lt;/div&gt;&lt;span class=tagcloud&gt;&lt;a href=https://www.javacodegeeks.com/tag/local-llms rel=tag&gt;Local LLMs&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/spring rel=tag&gt;Spring&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/spring-ai rel=tag&gt;spring ai&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=post-extra-info&gt;&lt;div class=theiaStickySidebar&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=clearfix&gt;&lt;/div&gt;</description>
      <author>Yatin Batra</author>
      <guid>https://www.javacodegeeks.com/spring-ai-with-local-llms-using-lm-studio.html</guid>
      <pubDate>Wed, 26 Aug 2026 14:19:00 +0000</pubDate>
    </item>
    <item>
      <title>[FREE EBOOKS] Microsoft 365 Excel Office Scripts For Dummies, Infinite &amp; Four More Best Selling Titles</title>
      <link>https://www.javacodegeeks.com/2026/08/free-ebooks-microsoft-365-excel-office-scripts-for-dummies-infinite-four-more-best-selling-titles-2.html</link>
      <description>&lt;header class=entry-header-outer&gt;&lt;nav id=breadcrumb&gt;&lt;a href=https://www.javacodegeeks.com/&gt;&lt;span class=tie-icon-home aria-hidden=true&gt;&lt;/span&gt;Home&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;a href=https://www.javacodegeeks.com/category/meta-jcg&gt;Meta JCG&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;span class=current&gt;[FREE EBOOKS] Microsoft 365 Excel Office Scripts For Dummies, Infinite &amp;amp; Four More Best Selling Titles&lt;/span&gt;&lt;/nav&gt;&lt;div class=entry-header&gt;&lt;span class=post-cat-wrap&gt;&lt;a class=&#34;post-cat tie-cat-16&#34; href=https://www.javacodegeeks.com/category/meta-jcg&gt;Meta JCG&lt;/a&gt;&lt;/span&gt;&lt;h1 class=&#34;post-title entry-title&#34;&gt;[FREE EBOOKS] Microsoft 365 Excel Office Scripts For Dummies, Infinite &amp;amp; Four More Best Selling Titles&lt;/h1&gt;&lt;/div&gt;&lt;/header&gt;&lt;div class=&#34;entry-content entry clearfix&#34;&gt;&lt;p&gt;Hello fellow geeks,&lt;p&gt;Fresh offers await you on our &lt;a href=https://javacodegeeks.tradepub.com/ target=_blank&gt;Information Technology Research Library&lt;/a&gt;, please have a look!&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width=25% style=&#34;border: 0px;vertical-align: top&#34;&gt;&lt;a href=&#34;https://javacodegeeks.tradepub.com/c/pubRD.mpl?secure=1&amp;amp;sr=oc&amp;amp;_t=oc:&amp;amp;qf=w_wile917&amp;amp;ch=w_wile917-j&#34; target=_blank&gt;&lt;img data-lazyloaded=1 src=https://img.tradepub.com/free/w_wile917/images/w_wile917c4.gif decoding=async data-src=https://img.tradepub.com/free/w_wile917/images/w_wile917c4.gif&gt;&lt;noscript&gt;&lt;img decoding=async src=https://img.tradepub.com/free/w_wile917/images/w_wile917c4.gif&gt;&lt;/noscript&gt;&lt;/a&gt;&lt;td style=&#34;vertical-align: top;border: 0px&#34;&gt;&lt;h2 style=&#34;text-align: center;background: #c8dbf7&#34;&gt;Microsoft 365 Excel Office Scripts For Dummies ($34.99 Value) FREE for a Limited Time&lt;/h2&gt;&lt;p&gt;Unlock the full potential of automation in the online version of Excel online with this easy-to-follow guide. Microsoft 365 Excel Office Scripts For Dummies, by experienced Microsoft MVP Michael Alexander, explains how to use Office Scripts to unlock VBA-like capabilities in the online version of Excel. Alexander demonstrates exactly how to automate repetitive tasks, streamline workflows, and customize your spreadsheet experience with the same power previously available only to users of Excel’s desktop version. This comprehensive guide walks you through the practical application of Office Scripts using TypeScript. It walks you through basic automation scripts before moving on to advanced integration features you can access with Power Automate. The author’s hands-on approach helps you master the techniques you need to transform your Excel online experience from repetitive drudgery to automated efficiency, showing you how to maximize your productivity in a huge variety of settings. Learn how to: Master TypeScript fundamentals specifically tailored for Excel automation and scripting. Automate table formatting, data cleaning, and sorting processes to eliminate repetitive manual work. Create dynamic charts and enhance PivotTables with custom scripts for professional reporting. Integrate Power Automate features to build sophisticated workflows across Microsoft 365 applications. Apply range definitions and advanced scripting techniques for complex data manipulation tasks. Perfect for business professionals, data analysts, and advanced Excel users who work mostly with the online version of Excel and who want to automate their workflows, Microsoft 365 Excel Office Scripts For Dummies is a must-read for everyone interested in managing large datasets, creating regular reports, and streamlining routine tasks.&lt;p style=&#34;text-align: center;height: 65px;margin-top: 40px&#34;&gt;&lt;a class=download style=&#34;background-color: #c8dbf7;border-color: #b0c4de;padding-top: 19px;text-decoration: none&#34; href=&#34;https://javacodegeeks.tradepub.com/c/pubRD.mpl?secure=1&amp;amp;sr=oc&amp;amp;_t=oc:&amp;amp;qf=w_wile917&amp;amp;ch=w_wile917-j&#34; target=_blank&gt;&lt;span style=&#34;font-size: 20px;font-weight: bold;vertical-align: middle&#34;&gt;Get it FREE!&lt;/span&gt;&lt;/a&gt;&lt;tr&gt;&lt;td width=25% style=&#34;border: 0px;vertical-align: top&#34;&gt;&lt;a href=&#34;https://javacodegeeks.tradepub.com/c/pubRD.mpl?secure=1&amp;amp;sr=oc&amp;amp;_t=oc:&amp;amp;qf=w_wile916&amp;amp;ch=w_wile916-j&#34; target=_blank&gt;&lt;img data-lazyloaded=1 src=https://img.tradepub.com/free/w_wile916/images/w_wile916c4.gif decoding=async data-src=https://img.tradepub.com/free/w_wile916/images/w_wile916c4.gif&gt;&lt;noscript&gt;&lt;img decoding=async src=https://img.tradepub.com/free/w_wile916/images/w_wile916c4.gif&gt;&lt;/noscript&gt;&lt;/a&gt;&lt;td style=&#34;vertical-align: top;border: 0px&#34;&gt;&lt;h2 style=&#34;text-align: center;background: #c8dbf7&#34;&gt;Infinite: How Visionary Leaders Transform Today’s Businesses into AI-Forward Companies ($34.00 Value) FREE for a Limited Time&lt;/h2&gt;&lt;p&gt;Transform your organization by making AI foundational — not just functional. Infinite: How Visionary Leaders Transform Today’s Businesses into AI-Forward Companies, written by two senior ServiceNow leaders, introduces the concept of the “Infinite Company”-a new class of organization built with artificial intelligence at its core. Rather than treating AI as an add-on, this book provides a strategic blueprint for seamlessly integrating human talent and AI to achieve greater innovation, productivity, and scale. Infinite guides readers through the evolution from traditional digital transformation to AI-driven innovation. It challenges conventional business models, exploring how AI-native companies are disrupting legacy organizations and offering strategies for leaders to rethink how they work, measure success, and structure their teams. The book presents a framework for building infinitely adaptable organizations led by AI-native leaders. Readers will also discover: How to shift from AI-enabled operations to building organizations with artificial intelligence embedded at the structural core. Strategies for developing an AI-native leadership mindset that moves beyond traditional digital transformation approaches. A framework for creating infinitely adaptable organizations that scale innovation, productivity, and competitive advantage simultaneously. Insights into how AI-first companies are disrupting legacy business models and rewriting the rules of competition. Practical guidance on rethinking success metrics, team structures, and workflows for an AI-driven operational environment. Infinite is written for business and technology leaders responsible for guiding their organizations through the shift to AI-driven operations. Whether leading enterprise transformation or building new AI-native ventures, this book delivers the strategic framework needed to compete against organizations already rewriting the rules of business.&lt;p style=&#34;text-align: center;height: 65px;margin-top: 40px&#34;&gt;&lt;a class=download style=&#34;background-color: #c8dbf7;border-color: #b0c4de;padding-top: 19px;text-decoration: none&#34; href=&#34;https://javacodegeeks.tradepub.com/c/pubRD.mpl?secure=1&amp;amp;sr=oc&amp;amp;_t=oc:&amp;amp;qf=w_wile916&amp;amp;ch=w_wile916-j&#34; target=_blank&gt;&lt;span style=&#34;font-size: 20px;font-weight: bold;vertical-align: middle&#34;&gt;Get it FREE!&lt;/span&gt;&lt;/a&gt;&lt;tr&gt;&lt;td width=25% style=&#34;border: 0px;vertical-align: top&#34;&gt;&lt;a href=&#34;https://javacodegeeks.tradepub.com/c/pubRD.mpl?secure=1&amp;amp;sr=oc&amp;amp;_t=oc:&amp;amp;qf=w_wile915&amp;amp;ch=w_wile915-j&#34; target=_blank&gt;&lt;img data-lazyloaded=1 src=https://img.tradepub.com/free/w_wile915/images/w_wile915c4.gif decoding=async data-src=https://img.tradepub.com/free/w_wile915/images/w_wile915c4.gif&gt;&lt;noscript&gt;&lt;img decoding=async src=https://img.tradepub.com/free/w_wile915/images/w_wile915c4.gif&gt;&lt;/noscript&gt;&lt;/a&gt;&lt;td style=&#34;vertical-align: top;border: 0px&#34;&gt;&lt;h2 style=&#34;text-align: center;background: #c8dbf7&#34;&gt;Artificial Intelligence, Cybersecurity and Cyber Defense ($30.00 Value) FREE for a Limited Time&lt;/h2&gt;&lt;p&gt;Is the prospect of machines that can make their own decisions, formulate their own plans and “think” something that army commanders can dream of at the beginning of this 21st Century?. The aim of the book is to analyze and understand the impacts of artificial intelligence in the fields of national security and defense; to identify the political, geopolitical, strategic issues of AI; to analyze its place in conflicts and cyberconflicts, and more generally in the various forms of violence; to explain the appropriation of artificial intelligence by military organizations, but also law enforcement agencies and the police; to discuss the questions that the development of artificial intelligence and its use raise in armies, police, intelligence agencies, at the tactical, operational and strategic levels.&lt;p style=&#34;text-align: center;height: 65px;margin-top: 40px&#34;&gt;&lt;a class=download style=&#34;background-color: #c8dbf7;border-color: #b0c4de;padding-top: 19px;text-decoration: none&#34; href=&#34;https://javacodegeeks.tradepub.com/c/pubRD.mpl?secure=1&amp;amp;sr=oc&amp;amp;_t=oc:&amp;amp;qf=w_wile915&amp;amp;ch=w_wile915-j&#34; target=_blank&gt;&lt;span style=&#34;font-size: 20px;font-weight: bold;vertical-align: middle&#34;&gt;Get it FREE!&lt;/span&gt;&lt;/a&gt;&lt;tr&gt;&lt;td width=25% style=&#34;border: 0px;vertical-align: top&#34;&gt;&lt;a href=&#34;https://javacodegeeks.tradepub.com/c/pubRD.mpl?secure=1&amp;amp;sr=oc&amp;amp;_t=oc:&amp;amp;qf=w_wile911&amp;amp;ch=w_wile911-j&#34; target=_blank&gt;&lt;img data-lazyloaded=1 src=https://img.tradepub.com/free/w_wile911/images/w_wile911c4.gif decoding=async data-src=https://img.tradepub.com/free/w_wile911/images/w_wile911c4.gif&gt;&lt;noscript&gt;&lt;img decoding=async src=https://img.tradepub.com/free/w_wile911/images/w_wile911c4.gif&gt;&lt;/noscript&gt;&lt;/a&gt;&lt;td style=&#34;vertical-align: top;border: 0px&#34;&gt;&lt;h2 style=&#34;text-align: center;background: #c8dbf7&#34;&gt;Marketing 7.0: A Guide for Thinking Marketers in the Age of AI ($30.00 Value) FREE for a Limited Time&lt;/h2&gt;&lt;p&gt;Level up your marketing strategy by understanding how the human mind works in the age of artificial intelligence (AI). Marketing 7.0 explores mind-centric marketing, a new approach that shifts the focus from AI-driven performance optimization to understanding how people think, connect, and buy. With the insights in this book, readers will be prepared to engage a new breed of consumers: the augmented human. Written by Philip Kotler, one of the world’s leading authorities on marketing, together with Hermawan Kartajaya and Iwan Setiawan from the leading marketing consulting firm MCorp, this book discusses ideas such as: Why digitalization, AI, and immersive technology unlock the consumer mind. How performance marketing and AI obsessions kill authenticity. How to extract customer insights to design brand storytelling, value propositions, selling approaches, and customer experiences. Marketing 7.0 earns a well-deserved spot on the bookshelves of executives, business leaders, and marketers alike as a guide to marketing in the age of AI. Offer Expires 8/25/2026.&lt;p style=&#34;text-align: center;height: 65px;margin-top: 40px&#34;&gt;&lt;a class=download style=&#34;background-color: #c8dbf7;border-color: #b0c4de;padding-top: 19px;text-decoration: none&#34; href=&#34;https://javacodegeeks.tradepub.com/c/pubRD.mpl?secure=1&amp;amp;sr=oc&amp;amp;_t=oc:&amp;amp;qf=w_wile911&amp;amp;ch=w_wile911-j&#34; target=_blank&gt;&lt;span style=&#34;font-size: 20px;font-weight: bold;vertical-align: middle&#34;&gt;Get it FREE!&lt;/span&gt;&lt;/a&gt;&lt;tr&gt;&lt;td width=25% style=&#34;border: 0px;vertical-align: top&#34;&gt;&lt;a href=&#34;https://javacodegeeks.tradepub.com/c/pubRD.mpl?secure=1&amp;amp;sr=oc&amp;amp;_t=oc:&amp;amp;qf=w_aice138&amp;amp;ch=w_aice138-j&#34; target=_blank&gt;&lt;img data-lazyloaded=1 src=https://img.tradepub.com/free/w_aice138/images/w_aice138c4.gif decoding=async data-src=https://img.tradepub.com/free/w_aice138/images/w_aice138c4.gif&gt;&lt;noscript&gt;&lt;img decoding=async src=https://img.tradepub.com/free/w_aice138/images/w_aice138c4.gif&gt;&lt;/noscript&gt;&lt;/a&gt;&lt;td style=&#34;vertical-align: top;border: 0px&#34;&gt;&lt;h2 style=&#34;text-align: center;background: #c8dbf7&#34;&gt;7 Prompt Engineering Mistakes With ChatGPT and Fixes ($21 Value) FREE For a Limited Time&lt;/h2&gt;&lt;p&gt;Stop weak AI outputs. Learn the seven common prompt mistakes and the simple fixes for better ChatGPT prompts, faster workflows, and consistent results. Weak prompts waste hours. Vague asks, missing context, and no structure lead to poor answers. This guide shows the seven mistakes that derail ChatGPT prompts, with practical rewrites you can use today. You get clear examples, tight templates, and a repeatable process. You will see how to add context so the model understands your role and goal. You will learn to give precise instructions, not broad topics. You will stop treating ChatGPT like a search box and start requesting structured outputs. You will also break complex tasks into steps, iterate with feedback, and set tone and format. Each section includes before and after prompts you can copy. The result is faster work, better ideas, and higher quality deliverables. Keywords include ChatGPT prompts and prompt engineering. Download now and level up your AI productivity tools. In this book you will learn: – How to add role, goal, and audience for instant context. – How to write precise instructions with scope, length, and sources. – How to request structured outputs instead of open questions. – How to work step by step, then refine with iteration. – How to set format, tone, and examples to guide style.&lt;p style=&#34;text-align: center;height: 65px;margin-top: 40px&#34;&gt;&lt;a class=download style=&#34;background-color: #c8dbf7;border-color: #b0c4de;padding-top: 19px;text-decoration: none&#34; href=&#34;https://javacodegeeks.tradepub.com/c/pubRD.mpl?secure=1&amp;amp;sr=oc&amp;amp;_t=oc:&amp;amp;qf=w_aice138&amp;amp;ch=w_aice138-j&#34; target=_blank&gt;&lt;span style=&#34;font-size: 20px;font-weight: bold;vertical-align: middle&#34;&gt;Get it FREE!&lt;/span&gt;&lt;/a&gt;&lt;tr&gt;&lt;td width=25% style=&#34;border: 0px;vertical-align: top&#34;&gt;&lt;a href=&#34;https://javacodegeeks.tradepub.com/c/pubRD.mpl?secure=1&amp;amp;sr=oc&amp;amp;_t=oc:&amp;amp;qf=w_aice133&amp;amp;ch=w_aice133-j&#34; target=_blank&gt;&lt;img data-lazyloaded=1 src=https://img.tradepub.com/free/w_aice133/images/w_aice133c4.gif decoding=async data-src=https://img.tradepub.com/free/w_aice133/images/w_aice133c4.gif&gt;&lt;noscript&gt;&lt;img decoding=async src=https://img.tradepub.com/free/w_aice133/images/w_aice133c4.gif&gt;&lt;/noscript&gt;&lt;/a&gt;&lt;td style=&#34;vertical-align: top;border: 0px&#34;&gt;&lt;h2 style=&#34;text-align: center;background: #c8dbf7&#34;&gt;25 GPT-5 ChatGPT Sales Prompts That Close Deals ($21 Value) FREE For a Limited Time&lt;/h2&gt;&lt;p&gt;Write sharper pitches and CTAs with 25 proven ChatGPT prompts. Turn features into benefits, handle objections, and improve close rates with clear, repeatable workflows. Sales pitches often get complex. Prospects lose the thread. This guide gives you 25 ChatGPT prompts that keep your message clear and persuasive. Use them to shape UVPs, improve proof points, and refine calls to action. You get fast, practical prompts grouped by use case. Product intros, CTAs, role play, objection handling, and slide improvements. Each prompt is specific, so you know what to ask and what to expect. Use simple prompt engineering to turn raw inputs into strong talking points. The result is a tighter pitch and faster decisions. In this book you will learn: – How to turn features into benefits prospects remember. – How to frame a UVP without taking shots at competitors. – How to write CTAs that reduce inertia and drive action. – How to practice with role play prompts for tough questions. – How to simplify slides and message flow for clarity. This resource is built for busy teams. Copy the prompts into ChatGPT, adapt the brackets, and ship a stronger pitch in minutes. Keywords include ChatGPT prompts, prompt engineering, and AI productivity tools. Get your copy now.&lt;p style=&#34;text-align: center;height: 65px;margin-top: 40px&#34;&gt;&lt;a class=download style=&#34;background-color: #c8dbf7;border-color: #b0c4de;padding-top: 19px;text-decoration: none&#34; href=&#34;https://javacodegeeks.tradepub.com/c/pubRD.mpl?secure=1&amp;amp;sr=oc&amp;amp;_t=oc:&amp;amp;qf=w_aice133&amp;amp;ch=w_aice133-j&#34; target=_blank&gt;&lt;span style=&#34;font-size: 20px;font-weight: bold;vertical-align: middle&#34;&gt;Get it FREE!&lt;/span&gt;&lt;/a&gt;&lt;/table&gt;&lt;p&gt;That’s it for now, we hope you found them insightful. Stay tuned for more!&lt;p&gt;Till next time, keep geeking!&lt;/p&gt;&lt;style&gt;.lepopup-progress-60 div.lepopup-progress-t1&gt;div{background-color:#e0e0e0;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{background-color:#bd4070;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{color:#ffffff;}.lepopup-progress-60 div.lepopup-progress-t1&gt;label{color:#444444;}.lepopup-form-60, .lepopup-form-60 *, .lepopup-progress-60 {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box span i{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box,.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;text&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;email&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;password&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input select,.lepopup-form-60 .lepopup-element div.lepopup-input select option,.lepopup-form-60 .lepopup-element div.lepopup-input textarea{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;background-color:rgba(255, 255, 255, 0.7);background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow: inset 0px 0px 15px -7px #000000;}.lepopup-form-60 .lepopup-element div.lepopup-input ::placeholder{color:#555555; opacity: 0.9;} .lepopup-form-60 .lepopup-element div.lepopup-input ::-ms-input-placeholder{color:#555555; opacity: 0.9;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect::-webkit-scrollbar-thumb{background-color:#cccccc;}.lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-left, .lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-right{font-size:20px;color:#444444;border-radius:0px;}.lepopup-form-60 .lepopup-element .lepopup-button,.lepopup-form-60 .lepopup-element .lepopup-button:visited{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#ffffff;font-weight:700;font-style:normal;text-decoration:none;text-align:center;background-color:#326693;background-image:none;border-width:1px;border-style:solid;border-color:#326693;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label{border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label span.lepopup-imageselect-label{font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label:after{background-color:rgba(255, 255, 255, 0.7);}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]+label:hover{background-color:#bd4070;color:#ffffff;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]:checked+label{background-color:#a93a65;color:#ffffff;}.lepopup-form-60 .lepopup-element input[type=&#39;checkbox&#39;].lepopup-tile+label, .lepopup-form-60 .lepopup-element input[type=&#39;radio&#39;].lepopup-tile+label {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:center;background-color:#ffffff;background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element-error{font-size:15px;color:#ffffff;font-style:normal;text-decoration:none;text-align:left;background-color:#d9534f;background-image:none;}.lepopup-form-60 .lepopup-element-2 {background-color:rgba(226, 236, 250, 1);background-image:none;border-width:1px;border-style:solid;border-color:rgba(216, 216, 216, 1);border-radius:3px;box-shadow: 1px 1px 15px -6px #d7e1eb;}.lepopup-form-60 .lepopup-element-3 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-3 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-3 .lepopup-element-html-content {min-height:73px;}.lepopup-form-60 .lepopup-element-4 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-4 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-4 .lepopup-element-html-content {min-height:23px;}.lepopup-form-60 .lepopup-element-5 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-5 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-5 .lepopup-element-html-content {min-height:24px;}.lepopup-form-60 .lepopup-element-6 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-6 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-6 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-7 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-7 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-7 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-8 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-8 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-8 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-9 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-9 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-9 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-10 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-10 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-10 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-11 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-11 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-11 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-12 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-12 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-12 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-13 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-13 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-13 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-left, .lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-right {line-height:36px;}.lepopup-form-60 .lepopup-element-15 div.lepopup-input{height:auto;line-height:1;}.lepopup-form-60 .lepopup-element-16 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-16 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-16 .lepopup-element-html-content {min-height:5px;}.lepopup-form-60 .lepopup-element-19 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-19 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-19 .lepopup-element-html-content {min-height:363px;}.lepopup-form-60 .lepopup-element-0 * {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-0 {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:#5cb85c;background-image:none;border-width:0px;border-style:solid;border-color:#ccc;border-radius:5px;box-shadow: 1px 1px 15px -6px #000000;padding-top:40px;padding-right:40px;padding-bottom:40px;padding-left:40px;}.lepopup-form-60 .lepopup-element-0 .lepopup-element-html-content {min-height:160px;}&lt;/style&gt;&lt;div class=lepopup-inline style=&#34;margin: 0 auto;&#34;&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-dshVvk4rvoljriDY lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=dshVvk4rvoljriDY data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=1 data-xd=off data-width=820 data-height=430 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:820px;height:430px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:820px;height:430px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-2 lepopup-element-rectangle&#34; data-type=rectangle data-top=0 data-left=0 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:501;top:0px;left:0px;width:820px;height:430px;&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-3 lepopup-element-html&#34; data-type=html data-top=7 data-left=10 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:502;top:7px;left:10px;width:797px;height:73px;&gt;&lt;div class=lepopup-element-html-content&gt;Do you want to know how to develop your skillset to become a &lt;span style=&#34;color: #CAB43D; text-shadow: 1px 1px #835D5D;&#34;&gt;Java Rockstar?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-4 lepopup-element-html&#34; data-type=html data-top=83 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:503;top:83px;left:308px;width:473px;height:23px;&gt;&lt;div class=lepopup-element-html-content&gt;Subscribe to our newsletter to start Rocking &lt;span style=&#34;text-decoration: underline;&#34;&gt;right now!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-5 lepopup-element-html&#34; data-type=html data-top=107 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:504;top:107px;left:308px;width:473px;height:24px;&gt;&lt;div class=lepopup-element-html-content&gt;To get you started we give you our best selling eBooks for &lt;span style=&#34;color:#e01404; text-shadow: 1px 1px #C99924; font-size: 15px;&#34;&gt;FREE!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-6 lepopup-element-html&#34; data-type=html data-top=136 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:505;top:136px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;1.&lt;/span&gt; JPA Mini Book&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-7 lepopup-element-html&#34; data-type=html data-top=156 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:506;top:156px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;2.&lt;/span&gt; JVM Troubleshooting Guide&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-8 lepopup-element-html&#34; data-type=html data-top=176 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:507;top:176px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;3.&lt;/span&gt; JUnit Tutorial for Unit Testing&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-9 lepopup-element-html&#34; data-type=html data-top=196 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:508;top:196px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;4.&lt;/span&gt; Java Annotations Tutorial&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-10 lepopup-element-html&#34; data-type=html data-top=216 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:509;top:216px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;5.&lt;/span&gt; Java Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-11 lepopup-element-html&#34; data-type=html data-top=236 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:510;top:236px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;6.&lt;/span&gt; Spring Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-12 lepopup-element-html&#34; data-type=html data-top=256 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:511;top:256px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;7.&lt;/span&gt; Android UI Design&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-13 lepopup-element-html&#34; data-type=html data-top=282 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:512;top:282px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;and many more ....&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-14&#34; data-type=email data-deps data-id=14 data-top=305 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:513;top:305px;left:308px;width:473px;height:36px;&gt;&lt;div class=lepopup-input&gt;&lt;input type=email name=lepopup-14 class=lepopup-ta-left placeholder=&#34;Enter your e-mail...&#34; autocomplete=email data-default aria-label=&#34;Email Field&#34; oninput=lepopup_input_changed(this); onfocus=lepopup_input_error_hide(this);&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-15&#34; data-type=checkbox data-deps data-id=15 data-top=344 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:514;top:344px;left:308px;width:160px;&gt;&lt;div class=&#34;lepopup-input lepopup-cr-layout-1 lepopup-cr-layout-left&#34;&gt;&lt;div class=&#34;lepopup-cr-container lepopup-cr-container-medium lepopup-cr-container-left&#34;&gt;&lt;div class=lepopup-cr-box&gt;&lt;input class=&#34;lepopup-checkbox lepopup-checkbox-classic lepopup-checkbox-medium&#34; type=checkbox name=lepopup-15[] id=lepopup-checkbox-EXg3mpa6AVpfeG7L-14-0 value=on data-default=off onchange=lepopup_input_changed(this);&gt;&lt;label for=lepopup-checkbox-EXg3mpa6AVpfeG7L-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-cr-label lepopup-ta-left&#34;&gt;&lt;label for=lepopup-checkbox-EXg3mpa6AVpfeG7L-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-16 lepopup-element-html&#34; data-type=html data-top=344 data-left=338 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:515;top:344px;left:338px;width:350px;height:5px;&gt;&lt;div class=lepopup-element-html-content&gt;I agree to the &lt;a href=https://www.javacodegeeks.com/about/terms-of-use target=_blank&gt;Terms&lt;/a&gt; and &lt;a href=https://www.javacodegeeks.com/about/privacy-policy target=_blank&gt;Privacy Policy&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-17&#34; data-type=button data-top=372 data-left=308 data-animation-in=bounceIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:516;top:372px;left:308px;width:85px;height:37px;&gt;&lt;a class=&#34;lepopup-button lepopup-button-zoom-out&#34; href=https://www.javacodegeeks.com/feed/ onclick=&#34;return lepopup_submit(this);&#34; data-label=&#34;Sign up&#34; data-loading=Loading...&gt;&lt;span&gt;Sign up&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-19 lepopup-element-html&#34; data-type=html data-top=67 data-left=-15 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:518;top:67px;left:-15px;width:320px;height:363px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png.webp fetchpriority=high decoding=async data-src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png.webp alt width=320 height=363&gt;&lt;noscript&gt;&lt;img fetchpriority=high decoding=async src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png.webp alt width=320 height=363&gt;&lt;/noscript&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-dshVvk4rvoljriDY lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=dshVvk4rvoljriDY data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=confirmation data-xd=off data-width=420 data-height=320 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:420px;height:320px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:420px;height:320px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-0 lepopup-element-html&#34; data-type=html data-top=80 data-left=70 data-animation-in=bounceInDown data-animation-out=fadeOutUp style=animation-duration:1000ms;animation-delay:0ms;z-index:500;top:80px;left:70px;width:280px;height:160px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;h4 style=&#34;text-align: center; font-size: 18px; font-weight: bold;&#34;&gt;Thank you!&lt;/h4&gt;&lt;p style=&#34;text-align: center;&#34;&gt;We will contact you soon.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;input type=hidden id=lepopup-logic-dshVvk4rvoljriDY value=[]&gt;&lt;/div&gt;&lt;div class=&#34;post-bottom-meta post-bottom-tags post-tags-classic&#34;&gt;&lt;div class=post-bottom-meta-title&gt;&lt;span class=tie-icon-tags aria-hidden=true&gt;&lt;/span&gt;Tags&lt;/div&gt;&lt;span class=tagcloud&gt;&lt;a href=https://www.javacodegeeks.com/tag/ebooks rel=tag&gt;eBooks&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/offers rel=tag&gt;Offers&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=post-extra-info&gt;&lt;div class=theiaStickySidebar&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=clearfix&gt;&lt;/div&gt;</description>
      <author>Java Code Geeks</author>
      <guid>https://www.javacodegeeks.com/2026/08/free-ebooks-microsoft-365-excel-office-scripts-for-dummies-infinite-four-more-best-selling-titles-2.html</guid>
      <pubDate>Wed, 26 Aug 2026 10:30:30 +0000</pubDate>
    </item>
    <item>
      <title>How to Deploy a Java Side Project on a Budget</title>
      <link>https://www.javacodegeeks.com/2026/08/how-to-deploy-a-java-side-project-on-a-budget.html</link>
      <description>&lt;header class=entry-header-outer&gt;&lt;nav id=breadcrumb&gt;&lt;a href=https://www.javacodegeeks.com/&gt;&lt;span class=tie-icon-home aria-hidden=true&gt;&lt;/span&gt;Home&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;a href=https://www.javacodegeeks.com/category/java&gt;Java&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;span class=current&gt;How to Deploy a Java Side Project on a Budget&lt;/span&gt;&lt;/nav&gt;&lt;div class=entry-header&gt;&lt;span class=post-cat-wrap&gt;&lt;a class=&#34;post-cat tie-cat-6&#34; href=https://www.javacodegeeks.com/category/java&gt;Java&lt;/a&gt;&lt;/span&gt;&lt;h1 class=&#34;post-title entry-title&#34;&gt;How to Deploy a Java Side Project on a Budget&lt;/h1&gt;&lt;/div&gt;&lt;/header&gt;&lt;div class=&#34;entry-content entry clearfix&#34;&gt;&lt;figure class=&#34;wp-block-image size-large&#34;&gt;&lt;a href=https://www.javacodegeeks.com/wp-content/uploads/2026/08/image.jpeg&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/image-1024x684.jpeg fetchpriority=high decoding=async width=1024 height=684 data-src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/image-1024x684.jpeg alt class=wp-image-145262 style=aspect-ratio:1.4964028776978417 data-srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/image-1024x684.jpeg 1024w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/image-300x200.jpeg 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/image-768x513.jpeg 768w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/image.jpeg 1280w&#34; data-sizes=&#34;(max-width: 1024px) 100vw, 1024px&#34;&gt;&lt;noscript&gt;&lt;img fetchpriority=high decoding=async width=1024 height=684 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/image-1024x684.jpeg alt class=wp-image-145262 style=aspect-ratio:1.4964028776978417 srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/image-1024x684.jpeg 1024w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/image-300x200.jpeg 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/image-768x513.jpeg 768w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/image.jpeg 1280w&#34; sizes=&#34;(max-width: 1024px) 100vw, 1024px&#34;&gt;&lt;/noscript&gt;&lt;/a&gt;&lt;figcaption class=wp-element-caption&gt;Image attributed to Pexels.com&lt;/figcaption&gt;&lt;/figure&gt;&lt;p class=wp-block-paragraph&gt;Having a Java side project operate locally is important, but deploying it is another step. Live deployments let you test the project in real-world situations, including remote database connections, network traffic, server resource limits, and application restarts. It also simplifies sharing the project with new employers, partners, clients, and users. Creating a simple Java application doesn’t require a costly hosting configuration.&lt;p class=wp-block-paragraph&gt;Instead of buying capacity that you will never use, choose infrastructure that fits the project’s existing scale. A small database and limited resources are enough for a modest virtual server or personal application. Consider the public face early on. SSL, memorable domain, etc. Before you &lt;a href=https://hostadvice.com/hosting-company/hostinger-coupons/hostinger-domain-coupon/&gt;get Hostinger domains cheaper&lt;/a&gt;, developers can compare registration, renewal, and hosting fees to save money. These minor improvements can cover launch costs.&lt;h2 class=wp-block-heading&gt;Choosing a Java Project to Deploy&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Spring Boot, REST APIs, tiny backend services, portfolio projects, and problem-solving tools are excellent choices for launching Java projects. First deployment is simplest for small projects with minimal dependencies. A &lt;a href=https://www.astera.com/type/blog/postgresql-rest-api&gt;PostgreSQL REST API&lt;/a&gt; may be easier to run than an app with several external services, message queues, and background workers. Spring Boot is ideal for side projects since you can bundle an app as an executable JAR and launch it with server-loaded Java. Consider the application’s RAM, persistent storage, and usage frequency before deploying.&lt;h2 class=wp-block-heading&gt;Preparing the Application for Production&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Configure production and development separately. Environment variables or other secure setups should hold database passwords, &lt;a href=https://www.blackfog.com/cybersecurity-101/api-credentials/&gt;API credentials&lt;/a&gt;, signing keys, and other sensitive data, not the source repository. Logging, error handling, and production database settings should be sufficient in the software. If the project is exposed to the internet, check authentication, authorization, input validation, and dependency versions before deployment. Spring Boot profiles provide different development and production setups. Database migrations should apply schema changes consistently with new versions.&lt;h2 class=wp-block-heading&gt;Choosing Where to Host It&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Java hosting options include shared, virtual private, and cloud services. Although shared hosting is cheap, it can restrict Java support and give developers little control over the runtime. VPSs are more flexible because you can add Java, a database, a reverse proxy, and monitoring tools. Cloud solutions simplify deployment with managed databases, containers, and automated scaling, but adding services may affect prices. A plan with enough RAM and CPU to keep the monthly bill predictable is ideal for a small side project.&lt;h2 class=wp-block-heading&gt;Deploying a Java Application to a VPS&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;A basic VPS deployment includes server creation, security upgrades, and a Java runtime. Copy the packed JAR to the server and run it in production. Avoid terminal sessions and run your software as a service so it restarts if the server reboots or the application crashes. Nginx or another reverse proxy may manage HTTPS traffic and forward requests to your Java application port. Firewalls should expose only necessary services. If the application stores user data or other non-duplicable data, back it up regularly.&lt;h2 class=wp-block-heading&gt;Keeping Hosting Costs Under Control&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Purchase hosting resources based on predicted traffic to save money. Start with the smallest server. After deployment, monitor CPU/memory/storage/database usage in real time and update only when the application hits its limits. Beyond promotional discounts, compare monthly VPS, managed databases, backups, and domain rates. Consider pricing before buying because renewals cost more than new registrations. Promotions and domain-hosting bundles cut registration costs. Monitoring and upgrading slowly is cheaper than scaling too early, especially for a side project.&lt;p class=wp-block-paragraph&gt;&lt;p class=wp-block-paragraph&gt;&lt;style&gt;.lepopup-progress-60 div.lepopup-progress-t1&gt;div{background-color:#e0e0e0;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{background-color:#bd4070;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{color:#ffffff;}.lepopup-progress-60 div.lepopup-progress-t1&gt;label{color:#444444;}.lepopup-form-60, .lepopup-form-60 *, .lepopup-progress-60 {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box span i{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box,.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;text&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;email&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;password&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input select,.lepopup-form-60 .lepopup-element div.lepopup-input select option,.lepopup-form-60 .lepopup-element div.lepopup-input textarea{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;background-color:rgba(255, 255, 255, 0.7);background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow: inset 0px 0px 15px -7px #000000;}.lepopup-form-60 .lepopup-element div.lepopup-input ::placeholder{color:#555555; opacity: 0.9;} .lepopup-form-60 .lepopup-element div.lepopup-input ::-ms-input-placeholder{color:#555555; opacity: 0.9;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect::-webkit-scrollbar-thumb{background-color:#cccccc;}.lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-left, .lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-right{font-size:20px;color:#444444;border-radius:0px;}.lepopup-form-60 .lepopup-element .lepopup-button,.lepopup-form-60 .lepopup-element .lepopup-button:visited{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#ffffff;font-weight:700;font-style:normal;text-decoration:none;text-align:center;background-color:#326693;background-image:none;border-width:1px;border-style:solid;border-color:#326693;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label{border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label span.lepopup-imageselect-label{font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label:after{background-color:rgba(255, 255, 255, 0.7);}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]+label:hover{background-color:#bd4070;color:#ffffff;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]:checked+label{background-color:#a93a65;color:#ffffff;}.lepopup-form-60 .lepopup-element input[type=&#39;checkbox&#39;].lepopup-tile+label, .lepopup-form-60 .lepopup-element input[type=&#39;radio&#39;].lepopup-tile+label {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:center;background-color:#ffffff;background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element-error{font-size:15px;color:#ffffff;font-style:normal;text-decoration:none;text-align:left;background-color:#d9534f;background-image:none;}.lepopup-form-60 .lepopup-element-2 {background-color:rgba(226, 236, 250, 1);background-image:none;border-width:1px;border-style:solid;border-color:rgba(216, 216, 216, 1);border-radius:3px;box-shadow: 1px 1px 15px -6px #d7e1eb;}.lepopup-form-60 .lepopup-element-3 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-3 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-3 .lepopup-element-html-content {min-height:73px;}.lepopup-form-60 .lepopup-element-4 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-4 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-4 .lepopup-element-html-content {min-height:23px;}.lepopup-form-60 .lepopup-element-5 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-5 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-5 .lepopup-element-html-content {min-height:24px;}.lepopup-form-60 .lepopup-element-6 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-6 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-6 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-7 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-7 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-7 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-8 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-8 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-8 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-9 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-9 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-9 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-10 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-10 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-10 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-11 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-11 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-11 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-12 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-12 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-12 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-13 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-13 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-13 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-left, .lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-right {line-height:36px;}.lepopup-form-60 .lepopup-element-15 div.lepopup-input{height:auto;line-height:1;}.lepopup-form-60 .lepopup-element-16 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-16 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-16 .lepopup-element-html-content {min-height:5px;}.lepopup-form-60 .lepopup-element-19 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-19 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-19 .lepopup-element-html-content {min-height:363px;}.lepopup-form-60 .lepopup-element-0 * {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-0 {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:#5cb85c;background-image:none;border-width:0px;border-style:solid;border-color:#ccc;border-radius:5px;box-shadow: 1px 1px 15px -6px #000000;padding-top:40px;padding-right:40px;padding-bottom:40px;padding-left:40px;}.lepopup-form-60 .lepopup-element-0 .lepopup-element-html-content {min-height:160px;}&lt;/style&gt;&lt;div class=lepopup-inline style=&#34;margin: 0 auto;&#34;&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-rtUOPa2NRjd7KkLf lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=rtUOPa2NRjd7KkLf data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=1 data-xd=off data-width=820 data-height=430 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:820px;height:430px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:820px;height:430px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-2 lepopup-element-rectangle&#34; data-type=rectangle data-top=0 data-left=0 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:501;top:0px;left:0px;width:820px;height:430px;&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-3 lepopup-element-html&#34; data-type=html data-top=7 data-left=10 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:502;top:7px;left:10px;width:797px;height:73px;&gt;&lt;div class=lepopup-element-html-content&gt;Do you want to know how to develop your skillset to become a &lt;span style=&#34;color: #CAB43D; text-shadow: 1px 1px #835D5D;&#34;&gt;Java Rockstar?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-4 lepopup-element-html&#34; data-type=html data-top=83 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:503;top:83px;left:308px;width:473px;height:23px;&gt;&lt;div class=lepopup-element-html-content&gt;Subscribe to our newsletter to start Rocking &lt;span style=&#34;text-decoration: underline;&#34;&gt;right now!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-5 lepopup-element-html&#34; data-type=html data-top=107 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:504;top:107px;left:308px;width:473px;height:24px;&gt;&lt;div class=lepopup-element-html-content&gt;To get you started we give you our best selling eBooks for &lt;span style=&#34;color:#e01404; text-shadow: 1px 1px #C99924; font-size: 15px;&#34;&gt;FREE!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-6 lepopup-element-html&#34; data-type=html data-top=136 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:505;top:136px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;1.&lt;/span&gt; JPA Mini Book&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-7 lepopup-element-html&#34; data-type=html data-top=156 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:506;top:156px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;2.&lt;/span&gt; JVM Troubleshooting Guide&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-8 lepopup-element-html&#34; data-type=html data-top=176 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:507;top:176px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;3.&lt;/span&gt; JUnit Tutorial for Unit Testing&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-9 lepopup-element-html&#34; data-type=html data-top=196 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:508;top:196px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;4.&lt;/span&gt; Java Annotations Tutorial&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-10 lepopup-element-html&#34; data-type=html data-top=216 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:509;top:216px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;5.&lt;/span&gt; Java Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-11 lepopup-element-html&#34; data-type=html data-top=236 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:510;top:236px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;6.&lt;/span&gt; Spring Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-12 lepopup-element-html&#34; data-type=html data-top=256 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:511;top:256px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;7.&lt;/span&gt; Android UI Design&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-13 lepopup-element-html&#34; data-type=html data-top=282 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:512;top:282px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;and many more ....&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-14&#34; data-type=email data-deps data-id=14 data-top=305 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:513;top:305px;left:308px;width:473px;height:36px;&gt;&lt;div class=lepopup-input&gt;&lt;input type=email name=lepopup-14 class=lepopup-ta-left placeholder=&#34;Enter your e-mail...&#34; autocomplete=email data-default aria-label=&#34;Email Field&#34; oninput=lepopup_input_changed(this); onfocus=lepopup_input_error_hide(this);&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-15&#34; data-type=checkbox data-deps data-id=15 data-top=344 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:514;top:344px;left:308px;width:160px;&gt;&lt;div class=&#34;lepopup-input lepopup-cr-layout-1 lepopup-cr-layout-left&#34;&gt;&lt;div class=&#34;lepopup-cr-container lepopup-cr-container-medium lepopup-cr-container-left&#34;&gt;&lt;div class=lepopup-cr-box&gt;&lt;input class=&#34;lepopup-checkbox lepopup-checkbox-classic lepopup-checkbox-medium&#34; type=checkbox name=lepopup-15[] id=lepopup-checkbox-BUd7G7zdHc9tiuve-14-0 value=on data-default=off onchange=lepopup_input_changed(this);&gt;&lt;label for=lepopup-checkbox-BUd7G7zdHc9tiuve-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-cr-label lepopup-ta-left&#34;&gt;&lt;label for=lepopup-checkbox-BUd7G7zdHc9tiuve-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-16 lepopup-element-html&#34; data-type=html data-top=344 data-left=338 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:515;top:344px;left:338px;width:350px;height:5px;&gt;&lt;div class=lepopup-element-html-content&gt;I agree to the &lt;a href=https://www.javacodegeeks.com/about/terms-of-use target=_blank&gt;Terms&lt;/a&gt; and &lt;a href=https://www.javacodegeeks.com/about/privacy-policy target=_blank&gt;Privacy Policy&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-17&#34; data-type=button data-top=372 data-left=308 data-animation-in=bounceIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:516;top:372px;left:308px;width:85px;height:37px;&gt;&lt;a class=&#34;lepopup-button lepopup-button-zoom-out&#34; href=https://www.javacodegeeks.com/feed/ onclick=&#34;return lepopup_submit(this);&#34; data-label=&#34;Sign up&#34; data-loading=Loading...&gt;&lt;span&gt;Sign up&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-19 lepopup-element-html&#34; data-type=html data-top=67 data-left=-15 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:518;top:67px;left:-15px;width:320px;height:363px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png.webp decoding=async data-src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png.webp alt width=320 height=363&gt;&lt;noscript&gt;&lt;img decoding=async src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png.webp alt width=320 height=363&gt;&lt;/noscript&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-rtUOPa2NRjd7KkLf lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=rtUOPa2NRjd7KkLf data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=confirmation data-xd=off data-width=420 data-height=320 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:420px;height:320px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:420px;height:320px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-0 lepopup-element-html&#34; data-type=html data-top=80 data-left=70 data-animation-in=bounceInDown data-animation-out=fadeOutUp style=animation-duration:1000ms;animation-delay:0ms;z-index:500;top:80px;left:70px;width:280px;height:160px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;h4 style=&#34;text-align: center; font-size: 18px; font-weight: bold;&#34;&gt;Thank you!&lt;/h4&gt;&lt;p style=&#34;text-align: center;&#34;&gt;We will contact you soon.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;input type=hidden id=lepopup-logic-rtUOPa2NRjd7KkLf value=[]&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=post-extra-info&gt;&lt;div class=theiaStickySidebar&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=clearfix&gt;&lt;/div&gt;</description>
      <author>Java Code Geeks</author>
      <guid>https://www.javacodegeeks.com/2026/08/how-to-deploy-a-java-side-project-on-a-budget.html</guid>
      <pubDate>Wed, 26 Aug 2026 08:55:09 +0000</pubDate>
    </item>
    <item>
      <title>Access Request and Response Body in HandlerInterceptor</title>
      <link>https://www.javacodegeeks.com/access-request-and-response-body-in-handlerinterceptor.html</link>
      <description>&lt;header class=entry-header-outer&gt;&lt;nav id=breadcrumb&gt;&lt;a href=https://www.javacodegeeks.com/&gt;&lt;span class=tie-icon-home aria-hidden=true&gt;&lt;/span&gt;Home&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;a href=https://www.javacodegeeks.com/category/java&gt;Java&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;a href=https://www.javacodegeeks.com/category/java/enterprise-java&gt;Enterprise Java&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;span class=current&gt;Access Request and Response Body in HandlerInterceptor&lt;/span&gt;&lt;/nav&gt;&lt;div class=entry-header&gt;&lt;span class=post-cat-wrap&gt;&lt;a class=&#34;post-cat tie-cat-8&#34; href=https://www.javacodegeeks.com/category/java/enterprise-java&gt;Enterprise Java&lt;/a&gt;&lt;/span&gt;&lt;h1 class=&#34;post-title entry-title&#34;&gt;Access Request and Response Body in HandlerInterceptor&lt;/h1&gt;&lt;/div&gt;&lt;/header&gt;&lt;div class=&#34;entry-content entry clearfix&#34;&gt;&lt;div class=&#34;stream-item stream-item-above-post-content&#34;&gt;&lt;div class=stream-item-size&gt;&lt;div id=adngin-in-post-0 style=&#34;float:left; margin-right:20px; margin-bottom:10px; width:300px; height:274px;&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;In a Spring Boot application, we sometimes need to inspect or log the HTTP request body and response body. This can be useful for debugging, auditing, troubleshooting, or request-response logging. Spring provides the &lt;code&gt;HandlerInterceptor&lt;/code&gt; interface, which allows us to execute custom logic before and after a controller method is called. However, directly reading the request body or response body inside an interceptor is not straightforward because HTTP streams are normally consumed during request processing. A simple solution is to use &lt;code&gt;ContentCachingRequestWrapper&lt;/code&gt; and &lt;code&gt;ContentCachingResponseWrapper&lt;/code&gt; inside a servlet filter. The interceptor can then access the cached request and response content.&lt;h2&gt;&lt;a name=section-1&gt;&lt;/a&gt;1. Accessing Request and Response Bodies in HandlerInterceptor&lt;/h2&gt;&lt;p&gt;Suppose we have the following Spring Boot API: &lt;code&gt;HTTP POST /api/users&lt;/code&gt;. The client sends user details to the API as JSON in the HTTP request body.&lt;pre class=&#34;brush:plain; wrap-lines:false;&#34;&gt;{&amp;#34;name&amp;#34;:&amp;#34;John&amp;#34;,&amp;#34;email&amp;#34;:&amp;#34;john@example.com&amp;#34;}&#xA;&lt;/pre&gt;&lt;p&gt;After processing the request, the API returns the result to the client in the HTTP response body.&lt;pre class=&#34;brush:plain; wrap-lines:false;&#34;&gt;{&amp;#34;message&amp;#34;:&amp;#34;User created successfully&amp;#34;}&#xA;&lt;/pre&gt;&lt;p&gt;We want to log both values from a Spring MVC interceptor:&lt;pre class=&#34;brush:plain; wrap-lines:false;&#34;&gt;Request Body: {&amp;#34;name&amp;#34;:&amp;#34;John&amp;#34;,&amp;#34;email&amp;#34;:&amp;#34;john@example.com&amp;#34;}&#xA;&#xA;Response Body: {&amp;#34;message&amp;#34;:&amp;#34;User created successfully&amp;#34;}&#xA;&lt;/pre&gt;&lt;p&gt;In Spring MVC, a request body is typically read by an &lt;code&gt;HttpMessageConverter&lt;/code&gt; when Spring converts JSON into a Java object for an &lt;code&gt;@RequestBody&lt;/code&gt; parameter. Since the servlet request input stream is normally read only once, trying to call &lt;code&gt;request.getReader()&lt;/code&gt; or &lt;code&gt;request.getInputStream()&lt;/code&gt; later inside a &lt;code&gt;HandlerInterceptor&lt;/code&gt; may return no content. The response body has a similar limitation. Once the response is written to the servlet output stream, an interceptor does not automatically have a reusable copy of that data. To solve this, Spring provides &lt;code&gt;ContentCachingRequestWrapper&lt;/code&gt; and &lt;code&gt;ContentCachingResponseWrapper&lt;/code&gt;. These wrappers cache the content while the request is being read and the response is being written.&lt;p&gt;The wrappers should be applied before the request reaches the Spring MVC interceptor, usually inside a servlet filter. The request then follows this flow: &lt;code&gt;Client → Filter (Wrap request and response) → HandlerInterceptor → Controller → HandlerInterceptor (Read cached content) → Filter (Copy response back to client) → Client&lt;/code&gt;. An important point is that &lt;code&gt;ContentCachingRequestWrapper&lt;/code&gt; does not read the request body by itself. It only caches the bytes when Spring or another component actually reads them. Therefore, the request body may still be empty in &lt;code&gt;preHandle()&lt;/code&gt;, while it is normally available later in the request lifecycle. Using these wrappers allows the controller to process the request normally while giving the interceptor access to a cached copy of both the request and response bodies.&lt;h3&gt;1.1 How HandlerInterceptor Works&lt;/h3&gt;&lt;p&gt;A Spring &lt;code&gt;HandlerInterceptor&lt;/code&gt; allows us to intercept requests during Spring MVC request processing. The main interceptor methods are:&lt;ul&gt;&lt;li&gt;&lt;code&gt;preHandle()&lt;/code&gt; – Executes before the controller method. It is commonly used for authentication, validation, or request checks. Returning &lt;code&gt;true&lt;/code&gt; continues the request, while &lt;code&gt;false&lt;/code&gt; stops it.&lt;li&gt;&lt;code&gt;postHandle()&lt;/code&gt; – Executes after the controller method completes but before the response is fully processed. It can be used to perform additional processing on the response.&lt;li&gt;&lt;code&gt;afterCompletion()&lt;/code&gt; – Executes after the complete request-response cycle finishes. It is useful for logging, cleanup, and accessing cached request and response data.&lt;/ul&gt;&lt;h3&gt;1.2 Understanding ContentCachingRequestWrapper and ContentCachingResponseWrapper&lt;/h3&gt;&lt;p&gt;Spring provides &lt;code&gt;ContentCachingRequestWrapper&lt;/code&gt; and &lt;code&gt;ContentCachingResponseWrapper&lt;/code&gt; to cache the content of an HTTP request and response. They wrap the original &lt;code&gt;HttpServletRequest&lt;/code&gt; and &lt;code&gt;HttpServletResponse&lt;/code&gt; without changing how the controller normally processes them.&lt;div style=&#34;display:inline-block; margin: 15px 0;&#34;&gt;&lt;div id=adngin-JavaCodeGeeks_incontent_video-0 style=display:inline-block;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;ContentCachingRequestWrapper&lt;/code&gt; caches the request body as it is read by Spring. The cached content can later be retrieved using &lt;code&gt;getContentAsByteArray()&lt;/code&gt;. It is important to note that creating the wrapper does not immediately read the request body; the content is cached only when the body is actually consumed.&lt;li&gt;&lt;code&gt;ContentCachingResponseWrapper&lt;/code&gt; caches the data written to the HTTP response. This allows the response body to be retrieved using &lt;code&gt;getContentAsByteArray()&lt;/code&gt; before it is finally sent to the client.&lt;/ul&gt;&lt;h3&gt;1.3 Key Points to Consider&lt;/h3&gt;&lt;p&gt;This solution is useful for debugging and request-response logging, but there are a few practical points to keep in mind.&lt;ul&gt;&lt;li&gt;Avoid logging sensitive information such as passwords, tokens, authorization headers, or payment details.&lt;li&gt;Request and response bodies are stored in memory, so avoid logging very large uploads or downloads.&lt;li&gt;The request cache may be empty inside &lt;code&gt;preHandle()&lt;/code&gt; because the controller has not read the request body yet.&lt;li&gt;Always call &lt;code&gt;copyBodyToResponse()&lt;/code&gt; when using &lt;code&gt;ContentCachingResponseWrapper&lt;/code&gt;.&lt;/ul&gt;&lt;h2&gt;&lt;a name=section-2&gt;&lt;/a&gt;2. Implementing Request and Response Body Logging&lt;/h2&gt;&lt;p&gt;The example contains a simple REST endpoint that accepts a user and returns a success message.&lt;h3&gt;2.1 Define the Request DTO&lt;/h3&gt;&lt;pre class=&#34;brush:java; wrap-lines:false;&#34;&gt;package com.example.demo.dto;&#xA;&#xA;public class UserRequest {&#xA;&#xA;  private String name;&#xA;  private String email;&#xA;&#xA;  public String getName() {&#xA;    return name;&#xA;  }&#xA;&#xA;  public void setName(String name) {&#xA;    this.name = name;&#xA;  }&#xA;&#xA;  public String getEmail() {&#xA;    return email;&#xA;  }&#xA;&#xA;  public void setEmail(String email) {&#xA;    this.email = email;&#xA;  }&#xA;}&#xA;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;UserRequest&lt;/code&gt; class is a simple DTO (Data Transfer Object) used to represent the JSON data received in the request body. It contains the &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;email&lt;/code&gt; fields along with their getter and setter methods. When this class is used with &lt;code&gt;@RequestBody&lt;/code&gt;, Spring automatically converts the incoming JSON request into a &lt;code&gt;UserRequest&lt;/code&gt; object.&lt;h3&gt;2.2 Create the REST Controller&lt;/h3&gt;&lt;pre class=&#34;brush:java; wrap-lines:false;&#34;&gt;package com.example.demo.controller;&#xA;&#xA;import com.example.demo.dto.UserRequest;&#xA;import org.springframework.http.ResponseEntity;&#xA;import org.springframework.web.bind.annotation. * ;&#xA;&#xA;import java.util.Map;&#xA;&#xA;@RestController@RequestMapping(&amp;#34;/api/users&amp;#34;)&#xA;public class UserController {&#xA;&#xA;  @PostMapping&#xA;  public ResponseEntity &amp;lt; Map &amp;lt; String, String &amp;gt;&amp;gt; createUser(@RequestBody UserRequest request) {&#xA;    return ResponseEntity.ok(Map.of(&amp;#34;message&amp;#34;, &amp;#34;User created successfully&amp;#34;));&#xA;  }&#xA;}&#xA;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;UserController&lt;/code&gt; class defines a REST API for handling user requests. The &lt;code&gt;@RestController&lt;/code&gt; annotation marks the class as a REST controller, while &lt;code&gt;@RequestMapping(&amp;#34;/api/users&amp;#34;)&lt;/code&gt; sets the base URL. The &lt;code&gt;@PostMapping&lt;/code&gt; method handles HTTP POST requests, and &lt;code&gt;@RequestBody&lt;/code&gt; converts the incoming JSON body into a &lt;code&gt;UserRequest&lt;/code&gt; object. Finally, &lt;code&gt;ResponseEntity.ok()&lt;/code&gt; returns an HTTP 200 response containing the &lt;code&gt;&amp;#34;User created successfully&amp;#34;&lt;/code&gt; message.&lt;h3&gt;2.3 Add the Content Caching Filter&lt;/h3&gt;&lt;pre class=&#34;brush:java; wrap-lines:false;&#34;&gt;package com.example.demo.filter;&#xA;&#xA;import jakarta.servlet.FilterChain;&#xA;import jakarta.servlet.ServletException;&#xA;import jakarta.servlet.http.HttpServletRequest;&#xA;import jakarta.servlet.http.HttpServletResponse;&#xA;&#xA;import org.springframework.stereotype.Component;&#xA;import org.springframework.web.filter.OncePerRequestFilter;&#xA;import org.springframework.web.util.ContentCachingRequestWrapper;&#xA;import org.springframework.web.util.ContentCachingResponseWrapper;&#xA;&#xA;import java.io.IOException;&#xA;&#xA;@Component&#xA;public class ContentCachingFilter extends OncePerRequestFilter {&#xA;&#xA;  @Override&#xA;  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {&#xA;    ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request);&#xA;    ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response);&#xA;&#xA;    try {&#xA;      filterChain.doFilter(requestWrapper, responseWrapper);&#xA;    } finally {&#xA;      responseWrapper.copyBodyToResponse();&#xA;    }&#xA;  }&#xA;}&#xA;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;ContentCachingFilter&lt;/code&gt; extends &lt;code&gt;OncePerRequestFilter&lt;/code&gt;, ensuring that the filter runs once for each request. Inside &lt;code&gt;doFilterInternal()&lt;/code&gt;, the original request and response are wrapped using &lt;code&gt;ContentCachingRequestWrapper&lt;/code&gt; and &lt;code&gt;ContentCachingResponseWrapper&lt;/code&gt; so their content can be cached and accessed later. The wrapped objects are passed through the filter chain using &lt;code&gt;filterChain.doFilter()&lt;/code&gt;. Finally, &lt;code&gt;copyBodyToResponse()&lt;/code&gt; copies the cached response body back to the actual response so it can be returned to the client.&lt;h3&gt;2.4 Create the Request-Response Logging Interceptor&lt;/h3&gt;&lt;pre class=&#34;brush:java; wrap-lines:false;&#34;&gt;package com.example.demo.interceptor;&#xA;&#xA;import jakarta.servlet.http.HttpServletRequest;&#xA;import jakarta.servlet.http.HttpServletResponse;&#xA;&#xA;import org.springframework.stereotype.Component;&#xA;import org.springframework.web.servlet.HandlerInterceptor;&#xA;import org.springframework.web.util.ContentCachingRequestWrapper;&#xA;import org.springframework.web.util.ContentCachingResponseWrapper;&#xA;&#xA;import java.nio.charset.StandardCharsets;&#xA;&#xA;@Component&#xA;public class RequestResponseLoggingInterceptor implements HandlerInterceptor {&#xA;&#xA;  @Override&#xA;  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {&#xA;&#xA;    if (request instanceof ContentCachingRequestWrapper requestWrapper) {&#xA;      byte[] requestContent = requestWrapper.getContentAsByteArray();&#xA;      String requestBody = new String(requestContent, StandardCharsets.UTF_8);&#xA;      System.out.println(&amp;#34;Request Body: &amp;#34; + requestBody);&#xA;    }&#xA;&#xA;    if (response instanceof ContentCachingResponseWrapper responseWrapper) {&#xA;      byte[] responseContent = responseWrapper.getContentAsByteArray();&#xA;      String responseBody = new String(responseContent, StandardCharsets.UTF_8);&#xA;      System.out.println(&amp;#34;Response Body: &amp;#34; + responseBody);&#xA;    }&#xA;  }&#xA;}&#xA;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;RequestResponseLoggingInterceptor&lt;/code&gt; implements &lt;code&gt;HandlerInterceptor&lt;/code&gt; and uses the &lt;code&gt;afterCompletion()&lt;/code&gt; method to access the request and response after processing is complete. It first checks whether they are instances of &lt;code&gt;ContentCachingRequestWrapper&lt;/code&gt; and &lt;code&gt;ContentCachingResponseWrapper&lt;/code&gt;. The cached content is retrieved using &lt;code&gt;getContentAsByteArray()&lt;/code&gt;, converted from a byte array to a UTF-8 &lt;code&gt;String&lt;/code&gt;, and then printed to the console as the request body and response body.&lt;h3&gt;2.5 Register the Interceptor&lt;/h3&gt;&lt;pre class=&#34;brush:java; wrap-lines:false;&#34;&gt;package com.example.demo.config;&#xA;&#xA;import com.example.demo.interceptor.RequestResponseLoggingInterceptor;&#xA;import org.springframework.context.annotation.Configuration;&#xA;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;&#xA;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;&#xA;&#xA;@Configuration&#xA;public class WebConfig implements WebMvcConfigurer {&#xA;&#xA;  private final RequestResponseLoggingInterceptor interceptor;&#xA;&#xA;  public WebConfig(RequestResponseLoggingInterceptor interceptor) {&#xA;    this.interceptor = interceptor;&#xA;  }&#xA;&#xA;  @Override&#xA;  public void addInterceptors(InterceptorRegistry registry) {&#xA;    registry.addInterceptor(interceptor).addPathPatterns(&amp;#34;/api/**&amp;#34;);&#xA;  }&#xA;}&#xA;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;WebConfig&lt;/code&gt; class implements &lt;code&gt;WebMvcConfigurer&lt;/code&gt; to customize Spring MVC configuration. The &lt;code&gt;RequestResponseLoggingInterceptor&lt;/code&gt; is injected through the constructor and registered inside the &lt;code&gt;addInterceptors()&lt;/code&gt; method. The &lt;code&gt;addPathPatterns(&amp;#34;/api/**&amp;#34;)&lt;/code&gt; configuration ensures that the interceptor is applied only to requests whose URLs start with &lt;code&gt;/api/&lt;/code&gt;.&lt;h3&gt;2.6 Run the Application and Verify the Output&lt;/h3&gt;&lt;p&gt;Run the Spring Boot application and send an HTTP POST request to &lt;code&gt;/api/users&lt;/code&gt; with the following JSON request body:&lt;pre class=&#34;brush:plain; wrap-lines:false;&#34;&gt;{&amp;#34;name&amp;#34;:&amp;#34;John&amp;#34;,&amp;#34;email&amp;#34;:&amp;#34;john@example.com&amp;#34;}&#xA;&lt;/pre&gt;&lt;p&gt;After the request is processed, the API returns the following response:&lt;pre class=&#34;brush:plain; wrap-lines:false;&#34;&gt;{&amp;#34;message&amp;#34;:&amp;#34;User created successfully&amp;#34;}&#xA;&lt;/pre&gt;&lt;p&gt;The interceptor reads the cached request and response bodies and prints the following output in the application console:&lt;pre class=&#34;brush:plain; wrap-lines:false;&#34;&gt;Request Body: {&amp;#34;name&amp;#34;:&amp;#34;John&amp;#34;,&amp;#34;email&amp;#34;:&amp;#34;john@example.com&amp;#34;}&#xA;Response Body: {&amp;#34;message&amp;#34;:&amp;#34;User created successfully&amp;#34;}&#xA;&lt;/pre&gt;&lt;h2&gt;&lt;a name=section-3&gt;&lt;/a&gt;3. Conclusion&lt;/h2&gt;&lt;p&gt;In this article, we learned how to access the request and response bodies in a Spring &lt;code&gt;HandlerInterceptor&lt;/code&gt;. Since the request and response streams cannot be safely read multiple times, we used &lt;code&gt;ContentCachingRequestWrapper&lt;/code&gt; and &lt;code&gt;ContentCachingResponseWrapper&lt;/code&gt; inside a filter to cache their content. The interceptor can then retrieve the cached data using &lt;code&gt;getContentAsByteArray()&lt;/code&gt; after request processing is complete. This approach provides a simple and effective way to log or inspect request and response bodies in Spring Boot applications.&lt;/p&gt;&lt;style&gt;.lepopup-progress-60 div.lepopup-progress-t1&gt;div{background-color:#e0e0e0;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{background-color:#bd4070;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{color:#ffffff;}.lepopup-progress-60 div.lepopup-progress-t1&gt;label{color:#444444;}.lepopup-form-60, .lepopup-form-60 *, .lepopup-progress-60 {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box span i{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box,.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;text&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;email&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;password&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input select,.lepopup-form-60 .lepopup-element div.lepopup-input select option,.lepopup-form-60 .lepopup-element div.lepopup-input textarea{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;background-color:rgba(255, 255, 255, 0.7);background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow: inset 0px 0px 15px -7px #000000;}.lepopup-form-60 .lepopup-element div.lepopup-input ::placeholder{color:#555555; opacity: 0.9;} .lepopup-form-60 .lepopup-element div.lepopup-input ::-ms-input-placeholder{color:#555555; opacity: 0.9;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect::-webkit-scrollbar-thumb{background-color:#cccccc;}.lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-left, .lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-right{font-size:20px;color:#444444;border-radius:0px;}.lepopup-form-60 .lepopup-element .lepopup-button,.lepopup-form-60 .lepopup-element .lepopup-button:visited{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#ffffff;font-weight:700;font-style:normal;text-decoration:none;text-align:center;background-color:#326693;background-image:none;border-width:1px;border-style:solid;border-color:#326693;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label{border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label span.lepopup-imageselect-label{font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label:after{background-color:rgba(255, 255, 255, 0.7);}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]+label:hover{background-color:#bd4070;color:#ffffff;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]:checked+label{background-color:#a93a65;color:#ffffff;}.lepopup-form-60 .lepopup-element input[type=&#39;checkbox&#39;].lepopup-tile+label, .lepopup-form-60 .lepopup-element input[type=&#39;radio&#39;].lepopup-tile+label {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:center;background-color:#ffffff;background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element-error{font-size:15px;color:#ffffff;font-style:normal;text-decoration:none;text-align:left;background-color:#d9534f;background-image:none;}.lepopup-form-60 .lepopup-element-2 {background-color:rgba(226, 236, 250, 1);background-image:none;border-width:1px;border-style:solid;border-color:rgba(216, 216, 216, 1);border-radius:3px;box-shadow: 1px 1px 15px -6px #d7e1eb;}.lepopup-form-60 .lepopup-element-3 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-3 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-3 .lepopup-element-html-content {min-height:73px;}.lepopup-form-60 .lepopup-element-4 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-4 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-4 .lepopup-element-html-content {min-height:23px;}.lepopup-form-60 .lepopup-element-5 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-5 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-5 .lepopup-element-html-content {min-height:24px;}.lepopup-form-60 .lepopup-element-6 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-6 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-6 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-7 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-7 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-7 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-8 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-8 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-8 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-9 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-9 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-9 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-10 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-10 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-10 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-11 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-11 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-11 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-12 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-12 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-12 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-13 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-13 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-13 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-left, .lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-right {line-height:36px;}.lepopup-form-60 .lepopup-element-15 div.lepopup-input{height:auto;line-height:1;}.lepopup-form-60 .lepopup-element-16 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-16 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-16 .lepopup-element-html-content {min-height:5px;}.lepopup-form-60 .lepopup-element-19 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-19 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-19 .lepopup-element-html-content {min-height:363px;}.lepopup-form-60 .lepopup-element-0 * {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-0 {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:#5cb85c;background-image:none;border-width:0px;border-style:solid;border-color:#ccc;border-radius:5px;box-shadow: 1px 1px 15px -6px #000000;padding-top:40px;padding-right:40px;padding-bottom:40px;padding-left:40px;}.lepopup-form-60 .lepopup-element-0 .lepopup-element-html-content {min-height:160px;}&lt;/style&gt;&lt;div class=lepopup-inline style=&#34;margin: 0 auto;&#34;&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-ELYvvyeQCS7LNIfr lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=ELYvvyeQCS7LNIfr data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=1 data-xd=off data-width=820 data-height=430 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:820px;height:430px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:820px;height:430px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-2 lepopup-element-rectangle&#34; data-type=rectangle data-top=0 data-left=0 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:501;top:0px;left:0px;width:820px;height:430px;&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-3 lepopup-element-html&#34; data-type=html data-top=7 data-left=10 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:502;top:7px;left:10px;width:797px;height:73px;&gt;&lt;div class=lepopup-element-html-content&gt;Do you want to know how to develop your skillset to become a &lt;span style=&#34;color: #CAB43D; text-shadow: 1px 1px #835D5D;&#34;&gt;Java Rockstar?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-4 lepopup-element-html&#34; data-type=html data-top=83 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:503;top:83px;left:308px;width:473px;height:23px;&gt;&lt;div class=lepopup-element-html-content&gt;Subscribe to our newsletter to start Rocking &lt;span style=&#34;text-decoration: underline;&#34;&gt;right now!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-5 lepopup-element-html&#34; data-type=html data-top=107 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:504;top:107px;left:308px;width:473px;height:24px;&gt;&lt;div class=lepopup-element-html-content&gt;To get you started we give you our best selling eBooks for &lt;span style=&#34;color:#e01404; text-shadow: 1px 1px #C99924; font-size: 15px;&#34;&gt;FREE!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-6 lepopup-element-html&#34; data-type=html data-top=136 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:505;top:136px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;1.&lt;/span&gt; JPA Mini Book&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-7 lepopup-element-html&#34; data-type=html data-top=156 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:506;top:156px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;2.&lt;/span&gt; JVM Troubleshooting Guide&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-8 lepopup-element-html&#34; data-type=html data-top=176 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:507;top:176px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;3.&lt;/span&gt; JUnit Tutorial for Unit Testing&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-9 lepopup-element-html&#34; data-type=html data-top=196 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:508;top:196px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;4.&lt;/span&gt; Java Annotations Tutorial&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-10 lepopup-element-html&#34; data-type=html data-top=216 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:509;top:216px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;5.&lt;/span&gt; Java Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-11 lepopup-element-html&#34; data-type=html data-top=236 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:510;top:236px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;6.&lt;/span&gt; Spring Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-12 lepopup-element-html&#34; data-type=html data-top=256 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:511;top:256px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;7.&lt;/span&gt; Android UI Design&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-13 lepopup-element-html&#34; data-type=html data-top=282 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:512;top:282px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;and many more ....&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-14&#34; data-type=email data-deps data-id=14 data-top=305 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:513;top:305px;left:308px;width:473px;height:36px;&gt;&lt;div class=lepopup-input&gt;&lt;input type=email name=lepopup-14 class=lepopup-ta-left placeholder=&#34;Enter your e-mail...&#34; autocomplete=email data-default aria-label=&#34;Email Field&#34; oninput=lepopup_input_changed(this); onfocus=lepopup_input_error_hide(this);&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-15&#34; data-type=checkbox data-deps data-id=15 data-top=344 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:514;top:344px;left:308px;width:160px;&gt;&lt;div class=&#34;lepopup-input lepopup-cr-layout-1 lepopup-cr-layout-left&#34;&gt;&lt;div class=&#34;lepopup-cr-container lepopup-cr-container-medium lepopup-cr-container-left&#34;&gt;&lt;div class=lepopup-cr-box&gt;&lt;input class=&#34;lepopup-checkbox lepopup-checkbox-classic lepopup-checkbox-medium&#34; type=checkbox name=lepopup-15[] id=lepopup-checkbox-cW8OVBEqRkMF4CgU-14-0 value=on data-default=off onchange=lepopup_input_changed(this);&gt;&lt;label for=lepopup-checkbox-cW8OVBEqRkMF4CgU-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-cr-label lepopup-ta-left&#34;&gt;&lt;label for=lepopup-checkbox-cW8OVBEqRkMF4CgU-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-16 lepopup-element-html&#34; data-type=html data-top=344 data-left=338 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:515;top:344px;left:338px;width:350px;height:5px;&gt;&lt;div class=lepopup-element-html-content&gt;I agree to the &lt;a href=https://www.javacodegeeks.com/about/terms-of-use target=_blank&gt;Terms&lt;/a&gt; and &lt;a href=https://www.javacodegeeks.com/about/privacy-policy target=_blank&gt;Privacy Policy&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-17&#34; data-type=button data-top=372 data-left=308 data-animation-in=bounceIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:516;top:372px;left:308px;width:85px;height:37px;&gt;&lt;a class=&#34;lepopup-button lepopup-button-zoom-out&#34; href=https://www.javacodegeeks.com/feed/ onclick=&#34;return lepopup_submit(this);&#34; data-label=&#34;Sign up&#34; data-loading=Loading...&gt;&lt;span&gt;Sign up&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-19 lepopup-element-html&#34; data-type=html data-top=67 data-left=-15 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:518;top:67px;left:-15px;width:320px;height:363px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png fetchpriority=high decoding=async data-src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png alt width=320 height=363&gt;&lt;noscript&gt;&lt;img fetchpriority=high decoding=async src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png alt width=320 height=363&gt;&lt;/noscript&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-ELYvvyeQCS7LNIfr lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=ELYvvyeQCS7LNIfr data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=confirmation data-xd=off data-width=420 data-height=320 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:420px;height:320px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:420px;height:320px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-0 lepopup-element-html&#34; data-type=html data-top=80 data-left=70 data-animation-in=bounceInDown data-animation-out=fadeOutUp style=animation-duration:1000ms;animation-delay:0ms;z-index:500;top:80px;left:70px;width:280px;height:160px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;h4 style=&#34;text-align: center; font-size: 18px; font-weight: bold;&#34;&gt;Thank you!&lt;/h4&gt;&lt;p style=&#34;text-align: center;&#34;&gt;We will contact you soon.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;input type=hidden id=lepopup-logic-ELYvvyeQCS7LNIfr value=[]&gt;&lt;/div&gt;&lt;div class=&#34;post-bottom-meta post-bottom-tags post-tags-classic&#34;&gt;&lt;div class=post-bottom-meta-title&gt;&lt;span class=tie-icon-tags aria-hidden=true&gt;&lt;/span&gt;Tags&lt;/div&gt;&lt;span class=tagcloud&gt;&lt;a href=https://www.javacodegeeks.com/tag/spring-mvc rel=tag&gt;Spring MVC&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=post-extra-info&gt;&lt;div class=theiaStickySidebar&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=clearfix&gt;&lt;/div&gt;</description>
      <author>Yatin Batra</author>
      <guid>https://www.javacodegeeks.com/access-request-and-response-body-in-handlerinterceptor.html</guid>
      <pubDate>Wed, 26 Aug 2026 06:47:06 +0000</pubDate>
    </item>
    <item>
      <title>Project Valhalla in Practice: Writing Your First Value Class</title>
      <link>https://www.javacodegeeks.com/2026/08/project-valhalla-in-practice-writing-your-first-value-class.html</link>
      <description>&lt;header class=entry-header-outer&gt;&lt;nav id=breadcrumb&gt;&lt;a href=https://www.javacodegeeks.com/&gt;&lt;span class=tie-icon-home aria-hidden=true&gt;&lt;/span&gt;Home&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;a href=https://www.javacodegeeks.com/category/java&gt;Java&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;a href=https://www.javacodegeeks.com/category/java/core-java&gt;Core Java&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;span class=current&gt;Project Valhalla in Practice: Writing Your First Value Class&lt;/span&gt;&lt;/nav&gt;&lt;div class=entry-header&gt;&lt;span class=post-cat-wrap&gt;&lt;a class=&#34;post-cat tie-cat-7&#34; href=https://www.javacodegeeks.com/category/java/core-java&gt;Core Java&lt;/a&gt;&lt;/span&gt;&lt;h1 class=&#34;post-title entry-title&#34;&gt;Project Valhalla in Practice: Writing Your First Value Class&lt;/h1&gt;&lt;/div&gt;&lt;/header&gt;&lt;div class=&#34;entry-content entry clearfix&#34;&gt;&lt;div class=&#34;stream-item stream-item-above-post-content&#34;&gt;&lt;div class=stream-item-size&gt;&lt;div id=adngin-in-post-0 style=&#34;float:left; margin-right:20px; margin-bottom:10px; width:300px; height:274px;&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class=wp-block-paragraph&gt;JEP 401 is real, it’s in an early-access build today, and you can run it right now. It just isn’t landing where most people think it is.&lt;p class=wp-block-paragraph&gt;A decade of conference talks, name changes, and rewritten prototypes has led to this: JEP 401, Value Classes and Objects, has real syntax, a real JVM implementation, and a real early-access build you can download today. Before writing a single line, it’s worth getting one detail straight, because it’s been misreported enough that it’s worth correcting directly.&lt;p class=wp-block-paragraph&gt;&lt;strong&gt;Correcting the record:&lt;/strong&gt; JEP 401 is not targeted at JDK 26. As of this month, it has been integrated into the OpenJDK mainline targeting &lt;strong&gt;JDK 28&lt;/strong&gt;, due in March 2027, as a preview feature. Early-access builds tied to it have existed for a while, some built on JDK 26 and JDK 27 codebases along the way, but the destination release has now been locked in as JDK 28. The early-access build available right now lives at &lt;a href=https://jdk.java.net/28/ target=_blank rel=&#34;noreferrer noopener&#34;&gt;jdk.java.net/28&lt;/a&gt;, and that’s what this walkthrough uses.&lt;h2 class=wp-block-heading&gt;Getting the Early-Access Build Running&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Download the JDK 28 early-access build, unzip it, and point your terminal at its &lt;code&gt;bin&lt;/code&gt; directory. Every command from here on needs the preview flag, since value classes are a preview feature, disabled by default even in this build.&lt;pre class=brush:java&gt;export JAVA_HOME=&amp;#34;$PWD/jdk-28/Contents/Home&amp;#34;&#xA;export PATH=&amp;#34;$JAVA_HOME/bin:$PATH&amp;#34;&#xA;&#xA;java --version&#xA;# openjdk 28-ea ...&#xA;&#xA;jshell --enable-preview&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;Everything that follows, both the &lt;code&gt;javac&lt;/code&gt; compile step and the &lt;code&gt;java&lt;/code&gt; run step, needs &lt;code&gt;--enable-preview&lt;/code&gt; on the command line. Forget it on either side and the JVM refuses to run the class file.&lt;h2 class=wp-block-heading&gt;Declaring Your First Value Class&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;The simplest way in is a value record, since records already give you final fields and a generated constructor for free. Add the &lt;code&gt;value&lt;/code&gt; modifier and the class loses its identity:&lt;pre class=brush:java&gt;jshell&amp;gt; value record Point(int x, int y) {}&#xA;created record Point&#xA;&#xA;jshell&amp;gt; Point p = new Point(17, 3)&#xA;p ==&amp;gt; Point[x=17, y=3]&#xA;&#xA;jshell&amp;gt; Objects.hasIdentity(p)&#xA;$1 ==&amp;gt; false&#xA;&#xA;jshell&amp;gt; new Point(17, 3) == p&#xA;$2 ==&amp;gt; true&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;That last line is the one worth sitting with. For an ordinary class, &lt;code&gt;==&lt;/code&gt; compares references, two separately constructed objects are never &lt;code&gt;==&lt;/code&gt;, no matter what fields they hold. For a value object, &lt;code&gt;==&lt;/code&gt; has nothing to compare but state, so two &lt;code&gt;Point&lt;/code&gt; instances built from the same coordinates are simply equal. &lt;code&gt;Objects.hasIdentity()&lt;/code&gt;, added alongside this JEP, is the straightforward way to check which kind of object you’re holding, and it turns out a handful of existing JDK classes, including &lt;code&gt;Integer&lt;/code&gt; and &lt;code&gt;LocalDate&lt;/code&gt;, already flip over to value classes the moment preview mode is on.&lt;p class=wp-block-paragraph&gt;Ordinary classes can declare themselves as value classes too, not just records, as long as every field is final:&lt;div style=&#34;display:inline-block; margin: 15px 0;&#34;&gt;&lt;div id=adngin-JavaCodeGeeks_incontent_video-0 style=display:inline-block;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;pre class=brush:java&gt;value class Money {&#xA;    private final long cents;&#xA;    private final String currency;&#xA;&#xA;    Money(long cents, String currency) {&#xA;        this.cents = cents;&#xA;        this.currency = currency;&#xA;    }&#xA;&#xA;    long cents() { return cents; }&#xA;    String currency() { return currency; }&#xA;}&#xA;&lt;/pre&gt;&lt;h2 class=wp-block-heading&gt;What You Lose: Identity and Synchronization&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Giving up identity is not a cosmetic change, it removes real capabilities the object used to have, and the JVM enforces the loss rather than just discouraging it.&lt;figure class=wp-block-table&gt;&lt;table class=has-fixed-layout&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th class=has-text-align-left data-align=left&gt;Capability&lt;th class=has-text-align-left data-align=left&gt;Identity class&lt;th class=has-text-align-left data-align=left&gt;Value class&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;Meaningful reference equality (&lt;code&gt;==&lt;/code&gt;)&lt;td class=has-text-align-left data-align=left&gt;Yes, compares memory identity&lt;td class=has-text-align-left data-align=left&gt;No, compares field state instead&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;&lt;code&gt;synchronized&lt;/code&gt; blocks or methods&lt;td class=has-text-align-left data-align=left&gt;Allowed&lt;td class=has-text-align-left data-align=left&gt;Disallowed; the JVM rejects locking on a value object&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;&lt;code&gt;System.identityHashCode()&lt;/code&gt;&lt;td class=has-text-align-left data-align=left&gt;Meaningful, stable per object&lt;td class=has-text-align-left data-align=left&gt;Not meaningful, there’s no identity to hash&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;&lt;code&gt;WeakReference&lt;/code&gt; / &lt;code&gt;SoftReference&lt;/code&gt;&lt;td class=has-text-align-left data-align=left&gt;Supported&lt;td class=has-text-align-left data-align=left&gt;Throws an exception; there’s no single canonical instance to hold weakly&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;Mutable fields&lt;td class=has-text-align-left data-align=left&gt;Allowed&lt;td class=has-text-align-left data-align=left&gt;Disallowed; every field must be final&lt;/table&gt;&lt;/figure&gt;&lt;p class=wp-block-paragraph&gt;The synchronization loss deserves a second look, since it’s the one most likely to surprise a team migrating an existing class. If any code path anywhere locks on an instance of a type you’re converting to a value class, that code stops compiling, or stops working, the moment the conversion lands. It’s a genuinely useful early-warning signal, in most cases a class holding pure immutable data was never a sensible thing to synchronize on anyway, but it means the migration is not always as simple as adding one keyword.&lt;h2 class=wp-block-heading&gt;What You Gain: Flat Memory Layout and JIT Inlining&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;The payoff for giving up identity is that the JVM no longer has to guarantee a value object lives at one canonical heap address. Without that guarantee, the runtime is free to embed the object’s fields directly into whatever’s holding it, a containing object’s fields, or consecutive slots in an array, instead of storing a pointer to a separately allocated block of memory. This is the mechanism the Valhalla team calls &lt;strong&gt;heap flattening&lt;/strong&gt;, and it’s the reason value classes exist at all, not the syntax, the flattening.&lt;div class=wp-block-image&gt;&lt;figure class=&#34;aligncenter size-full&#34;&gt;&lt;a href=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-29-48.png&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-29-48.png fetchpriority=high decoding=async width=771 height=398 data-src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-29-48.png alt class=wp-image-145154 data-srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-29-48.png 771w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-29-48-300x155.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-29-48-768x396.png 768w&#34; data-sizes=&#34;(max-width: 771px) 100vw, 771px&#34;&gt;&lt;noscript&gt;&lt;img fetchpriority=high decoding=async width=771 height=398 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-29-48.png alt class=wp-image-145154 srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-29-48.png 771w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-29-48-300x155.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-29-48-768x396.png 768w&#34; sizes=&#34;(max-width: 771px) 100vw, 771px&#34;&gt;&lt;/noscript&gt;&lt;/a&gt;&lt;figcaption class=wp-element-caption&gt;Illustrative memory cost per element for an array of 1,000,000 two-int Point objects, based on documented JVM object layout rules (8-byte compact header, 8-byte array reference, 8 bytes of int fields). Actual savings depend on JIT decisions and array size.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p class=wp-block-paragraph&gt;An array of a million ordinary &lt;code&gt;Point&lt;/code&gt; objects stores a million 8-byte references, each pointing to a separately allocated object carrying its own header plus its two &lt;code&gt;int&lt;/code&gt; fields. An array of a million flattened value &lt;code&gt;Point&lt;/code&gt;s can, when the JIT chooses to flatten it, store the sixteen bytes of actual field data back-to-back with nothing else, no header per element, no pointer indirection, no separate allocation to chase during a cache miss. That’s the concrete shape of the win Valhalla has been chasing since 2014: primitive-like storage density for something that still looks and behaves like a class.&lt;h2 class=wp-block-heading&gt;Benchmarking the Difference&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Oracle’s own walkthrough for this early-access build includes a small, repeatable demo worth reproducing rather than taking on faith. It runs a date-heavy computation across several iterations, once using ordinary identity objects and once using value objects for the same data, and reports the timing for each pass. In that walkthrough’s own results, later iterations using value objects settled into roughly the mid-20-millisecond range, down from around 40 milliseconds on the first pass, as the JIT warmed up and began applying flattening-related optimizations that simply aren’t available to identity objects.&lt;h4 class=wp-block-heading&gt;How to run your own version of this benchmark&lt;/h4&gt;&lt;p class=wp-block-paragraph&gt;Treat any single machine’s numbers as directional. Oracle’s own walkthrough is explicit that results vary by hardware and array size, this is preview software, and JIT heuristics around flattening are still being tuned.&lt;p class=wp-block-paragraph&gt;Write the same computation twice, once against a plain class, once against its &lt;code&gt;value class&lt;/code&gt; equivalent, changing nothing but that one modifier.&lt;p class=wp-block-paragraph&gt;Run each version for enough iterations to let the JIT warm up, a handful of passes at minimum, and discard the first few results before measuring.&lt;p class=wp-block-paragraph&gt;Prefer a proper microbenchmarking harness like JMH over hand-rolled &lt;code&gt;System.nanoTime()&lt;/code&gt; loops if you’re publishing the numbers anywhere.&lt;div class=wp-block-image&gt;&lt;figure class=&#34;aligncenter size-full&#34;&gt;&lt;a href=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-30-48.png&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-30-48.png decoding=async width=779 height=397 data-src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-30-48.png alt class=wp-image-145155 data-srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-30-48.png 779w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-30-48-300x153.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-30-48-768x391.png 768w&#34; data-sizes=&#34;(max-width: 779px) 100vw, 779px&#34;&gt;&lt;noscript&gt;&lt;img decoding=async width=779 height=397 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-30-48.png alt class=wp-image-145155 srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-30-48.png 779w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-30-48-300x153.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-17_15-30-48-768x391.png 768w&#34; sizes=&#34;(max-width: 779px) 100vw, 779px&#34;&gt;&lt;/noscript&gt;&lt;/a&gt;&lt;figcaption class=wp-element-caption&gt;From Project Valhalla’s start to a preview build you can download today.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&lt;h2 class=wp-block-heading&gt;What We Learned&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;JEP 401 gives Java a real, runnable way to declare a class that trades away object identity for a flatter, cheaper memory representation, and after a decade of design churn, that trade is finally something you can compile and run against an early-access build rather than read about in a talk. Declaring one takes a single &lt;code&gt;value&lt;/code&gt; modifier on a class or record with only final fields, but the cost is concrete, not cosmetic: no synchronizing on the instance, no meaningful reference equality, no weak references, enforced by the JVM rather than left to convention.&lt;p class=wp-block-paragraph&gt;The reward is equally concrete, once the JVM can stop guaranteeing a canonical address for an object, it can flatten that object’s fields directly into arrays and containing objects, cutting out header and pointer overhead entirely for data-heavy workloads. The one thing worth being precise about, given how much of the coverage has gotten it wrong, is where this actually lands: JEP 401 is a preview feature targeting JDK 28 in March 2027, not JDK 26, even though the early-access build to try it on is sitting there right now.&lt;/p&gt;&lt;style&gt;.lepopup-progress-60 div.lepopup-progress-t1&gt;div{background-color:#e0e0e0;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{background-color:#bd4070;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{color:#ffffff;}.lepopup-progress-60 div.lepopup-progress-t1&gt;label{color:#444444;}.lepopup-form-60, .lepopup-form-60 *, .lepopup-progress-60 {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box span i{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box,.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;text&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;email&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;password&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input select,.lepopup-form-60 .lepopup-element div.lepopup-input select option,.lepopup-form-60 .lepopup-element div.lepopup-input textarea{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;background-color:rgba(255, 255, 255, 0.7);background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow: inset 0px 0px 15px -7px #000000;}.lepopup-form-60 .lepopup-element div.lepopup-input ::placeholder{color:#555555; opacity: 0.9;} .lepopup-form-60 .lepopup-element div.lepopup-input ::-ms-input-placeholder{color:#555555; opacity: 0.9;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect::-webkit-scrollbar-thumb{background-color:#cccccc;}.lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-left, .lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-right{font-size:20px;color:#444444;border-radius:0px;}.lepopup-form-60 .lepopup-element .lepopup-button,.lepopup-form-60 .lepopup-element .lepopup-button:visited{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#ffffff;font-weight:700;font-style:normal;text-decoration:none;text-align:center;background-color:#326693;background-image:none;border-width:1px;border-style:solid;border-color:#326693;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label{border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label span.lepopup-imageselect-label{font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label:after{background-color:rgba(255, 255, 255, 0.7);}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]+label:hover{background-color:#bd4070;color:#ffffff;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]:checked+label{background-color:#a93a65;color:#ffffff;}.lepopup-form-60 .lepopup-element input[type=&#39;checkbox&#39;].lepopup-tile+label, .lepopup-form-60 .lepopup-element input[type=&#39;radio&#39;].lepopup-tile+label {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:center;background-color:#ffffff;background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element-error{font-size:15px;color:#ffffff;font-style:normal;text-decoration:none;text-align:left;background-color:#d9534f;background-image:none;}.lepopup-form-60 .lepopup-element-2 {background-color:rgba(226, 236, 250, 1);background-image:none;border-width:1px;border-style:solid;border-color:rgba(216, 216, 216, 1);border-radius:3px;box-shadow: 1px 1px 15px -6px #d7e1eb;}.lepopup-form-60 .lepopup-element-3 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-3 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-3 .lepopup-element-html-content {min-height:73px;}.lepopup-form-60 .lepopup-element-4 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-4 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-4 .lepopup-element-html-content {min-height:23px;}.lepopup-form-60 .lepopup-element-5 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-5 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-5 .lepopup-element-html-content {min-height:24px;}.lepopup-form-60 .lepopup-element-6 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-6 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-6 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-7 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-7 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-7 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-8 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-8 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-8 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-9 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-9 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-9 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-10 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-10 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-10 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-11 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-11 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-11 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-12 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-12 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-12 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-13 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-13 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-13 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-left, .lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-right {line-height:36px;}.lepopup-form-60 .lepopup-element-15 div.lepopup-input{height:auto;line-height:1;}.lepopup-form-60 .lepopup-element-16 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-16 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-16 .lepopup-element-html-content {min-height:5px;}.lepopup-form-60 .lepopup-element-19 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-19 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-19 .lepopup-element-html-content {min-height:363px;}.lepopup-form-60 .lepopup-element-0 * {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-0 {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:#5cb85c;background-image:none;border-width:0px;border-style:solid;border-color:#ccc;border-radius:5px;box-shadow: 1px 1px 15px -6px #000000;padding-top:40px;padding-right:40px;padding-bottom:40px;padding-left:40px;}.lepopup-form-60 .lepopup-element-0 .lepopup-element-html-content {min-height:160px;}&lt;/style&gt;&lt;div class=lepopup-inline style=&#34;margin: 0 auto;&#34;&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-5CZlM13SGwgiA2V8 lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=5CZlM13SGwgiA2V8 data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=1 data-xd=off data-width=820 data-height=430 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:820px;height:430px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:820px;height:430px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-2 lepopup-element-rectangle&#34; data-type=rectangle data-top=0 data-left=0 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:501;top:0px;left:0px;width:820px;height:430px;&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-3 lepopup-element-html&#34; data-type=html data-top=7 data-left=10 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:502;top:7px;left:10px;width:797px;height:73px;&gt;&lt;div class=lepopup-element-html-content&gt;Do you want to know how to develop your skillset to become a &lt;span style=&#34;color: #CAB43D; text-shadow: 1px 1px #835D5D;&#34;&gt;Java Rockstar?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-4 lepopup-element-html&#34; data-type=html data-top=83 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:503;top:83px;left:308px;width:473px;height:23px;&gt;&lt;div class=lepopup-element-html-content&gt;Subscribe to our newsletter to start Rocking &lt;span style=&#34;text-decoration: underline;&#34;&gt;right now!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-5 lepopup-element-html&#34; data-type=html data-top=107 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:504;top:107px;left:308px;width:473px;height:24px;&gt;&lt;div class=lepopup-element-html-content&gt;To get you started we give you our best selling eBooks for &lt;span style=&#34;color:#e01404; text-shadow: 1px 1px #C99924; font-size: 15px;&#34;&gt;FREE!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-6 lepopup-element-html&#34; data-type=html data-top=136 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:505;top:136px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;1.&lt;/span&gt; JPA Mini Book&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-7 lepopup-element-html&#34; data-type=html data-top=156 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:506;top:156px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;2.&lt;/span&gt; JVM Troubleshooting Guide&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-8 lepopup-element-html&#34; data-type=html data-top=176 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:507;top:176px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;3.&lt;/span&gt; JUnit Tutorial for Unit Testing&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-9 lepopup-element-html&#34; data-type=html data-top=196 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:508;top:196px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;4.&lt;/span&gt; Java Annotations Tutorial&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-10 lepopup-element-html&#34; data-type=html data-top=216 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:509;top:216px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;5.&lt;/span&gt; Java Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-11 lepopup-element-html&#34; data-type=html data-top=236 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:510;top:236px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;6.&lt;/span&gt; Spring Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-12 lepopup-element-html&#34; data-type=html data-top=256 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:511;top:256px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;7.&lt;/span&gt; Android UI Design&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-13 lepopup-element-html&#34; data-type=html data-top=282 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:512;top:282px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;and many more ....&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-14&#34; data-type=email data-deps data-id=14 data-top=305 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:513;top:305px;left:308px;width:473px;height:36px;&gt;&lt;div class=lepopup-input&gt;&lt;input type=email name=lepopup-14 class=lepopup-ta-left placeholder=&#34;Enter your e-mail...&#34; autocomplete=email data-default aria-label=&#34;Email Field&#34; oninput=lepopup_input_changed(this); onfocus=lepopup_input_error_hide(this);&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-15&#34; data-type=checkbox data-deps data-id=15 data-top=344 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:514;top:344px;left:308px;width:160px;&gt;&lt;div class=&#34;lepopup-input lepopup-cr-layout-1 lepopup-cr-layout-left&#34;&gt;&lt;div class=&#34;lepopup-cr-container lepopup-cr-container-medium lepopup-cr-container-left&#34;&gt;&lt;div class=lepopup-cr-box&gt;&lt;input class=&#34;lepopup-checkbox lepopup-checkbox-classic lepopup-checkbox-medium&#34; type=checkbox name=lepopup-15[] id=lepopup-checkbox-2itSV7wtqeP11M3u-14-0 value=on data-default=off onchange=lepopup_input_changed(this);&gt;&lt;label for=lepopup-checkbox-2itSV7wtqeP11M3u-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-cr-label lepopup-ta-left&#34;&gt;&lt;label for=lepopup-checkbox-2itSV7wtqeP11M3u-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-16 lepopup-element-html&#34; data-type=html data-top=344 data-left=338 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:515;top:344px;left:338px;width:350px;height:5px;&gt;&lt;div class=lepopup-element-html-content&gt;I agree to the &lt;a href=https://www.javacodegeeks.com/about/terms-of-use target=_blank&gt;Terms&lt;/a&gt; and &lt;a href=https://www.javacodegeeks.com/about/privacy-policy target=_blank&gt;Privacy Policy&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-17&#34; data-type=button data-top=372 data-left=308 data-animation-in=bounceIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:516;top:372px;left:308px;width:85px;height:37px;&gt;&lt;a class=&#34;lepopup-button lepopup-button-zoom-out&#34; href=https://www.javacodegeeks.com/feed/ onclick=&#34;return lepopup_submit(this);&#34; data-label=&#34;Sign up&#34; data-loading=Loading...&gt;&lt;span&gt;Sign up&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-19 lepopup-element-html&#34; data-type=html data-top=67 data-left=-15 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:518;top:67px;left:-15px;width:320px;height:363px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png decoding=async data-src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png alt width=320 height=363&gt;&lt;noscript&gt;&lt;img decoding=async src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png alt width=320 height=363&gt;&lt;/noscript&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-5CZlM13SGwgiA2V8 lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=5CZlM13SGwgiA2V8 data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=confirmation data-xd=off data-width=420 data-height=320 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:420px;height:320px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:420px;height:320px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-0 lepopup-element-html&#34; data-type=html data-top=80 data-left=70 data-animation-in=bounceInDown data-animation-out=fadeOutUp style=animation-duration:1000ms;animation-delay:0ms;z-index:500;top:80px;left:70px;width:280px;height:160px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;h4 style=&#34;text-align: center; font-size: 18px; font-weight: bold;&#34;&gt;Thank you!&lt;/h4&gt;&lt;p style=&#34;text-align: center;&#34;&gt;We will contact you soon.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;input type=hidden id=lepopup-logic-5CZlM13SGwgiA2V8 value=[]&gt;&lt;/div&gt;&lt;div class=&#34;post-bottom-meta post-bottom-tags post-tags-classic&#34;&gt;&lt;div class=post-bottom-meta-title&gt;&lt;span class=tie-icon-tags aria-hidden=true&gt;&lt;/span&gt;Tags&lt;/div&gt;&lt;span class=tagcloud&gt;&lt;a href=https://www.javacodegeeks.com/tag/jep-401 rel=tag&gt;JEP 401&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/jvm-performance rel=tag&gt;JVM Performance&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/project-valhalla rel=tag&gt;Project Valhalla&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=post-extra-info&gt;&lt;div class=theiaStickySidebar&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=clearfix&gt;&lt;/div&gt;</description>
      <author>Eleftheria Drosopoulou</author>
      <guid>https://www.javacodegeeks.com/2026/08/project-valhalla-in-practice-writing-your-first-value-class.html</guid>
      <pubDate>Wed, 26 Aug 2026 05:27:00 +0000</pubDate>
    </item>
    <item>
      <title>Structured Concurrency: What Changes for the Try/Catch Generation</title>
      <link>https://www.javacodegeeks.com/2026/08/structured-concurrency-what-changes-for-the-try-catch-generation.html</link>
      <description>&lt;header class=entry-header-outer&gt;&lt;nav id=breadcrumb&gt;&lt;a href=https://www.javacodegeeks.com/&gt;&lt;span class=tie-icon-home aria-hidden=true&gt;&lt;/span&gt;Home&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;a href=https://www.javacodegeeks.com/category/java&gt;Java&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;a href=https://www.javacodegeeks.com/category/java/core-java&gt;Core Java&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;span class=current&gt;Structured Concurrency: What Changes for the Try/Catch Generation&lt;/span&gt;&lt;/nav&gt;&lt;div class=entry-header&gt;&lt;span class=post-cat-wrap&gt;&lt;a class=&#34;post-cat tie-cat-7&#34; href=https://www.javacodegeeks.com/category/java/core-java&gt;Core Java&lt;/a&gt;&lt;/span&gt;&lt;h1 class=&#34;post-title entry-title&#34;&gt;Structured Concurrency: What Changes for the Try/Catch Generation&lt;/h1&gt;&lt;/div&gt;&lt;/header&gt;&lt;div class=&#34;entry-content entry clearfix&#34;&gt;&lt;div class=&#34;stream-item stream-item-above-post-content&#34;&gt;&lt;div class=stream-item-size&gt;&lt;div id=adngin-in-post-0 style=&#34;float:left; margin-right:20px; margin-bottom:10px; width:300px; height:274px;&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class=wp-block-paragraph&gt;A real CompletableFuture chain, rewritten into StructuredTaskScope, plus the JDBC cancellation gap nobody’s fixed yet.&lt;p class=wp-block-paragraph&gt;Java developers who learned concurrency on &lt;code&gt;CompletableFuture&lt;/code&gt; chains and manual thread pools are about to get a genuinely different tool. Structured Concurrency changes how failure, cancellation, and thread lifetimes work, not just the syntax. But before getting to the migration, it’s worth correcting a detail that’s spreading faster than the feature itself: Structured Concurrency is not finalized. Not yet.&lt;h2 class=wp-block-heading&gt;Where Things Actually Stand&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;As of JDK 27, due in September 2026, Structured Concurrency is in its &lt;strong&gt;seventh&lt;/strong&gt; preview, delivered as JEP 533. It has previewed, in some form, in every release since JDK 19 in 2022, and JEP 533’s own text does not commit to a finalization timeline. The API is converging, the changes each round are smaller than the last, but “converging” and “final” are different words for a reason. If you’re planning production code around this feature today, it still needs &lt;code&gt;--enable-preview&lt;/code&gt; at compile time and runtime, and the API surface can still shift under you between JDK versions.&lt;p class=wp-block-paragraph&gt;What is finalized, and worth using without hesitation, is &lt;a href=https://openjdk.org/jeps/506 target=_blank rel=&#34;noreferrer noopener&#34;&gt;Scoped Values&lt;/a&gt;, delivered as JEP 506 in JDK 25. Scoped Values are the replacement for &lt;code&gt;ThreadLocal&lt;/code&gt; in virtual-thread code, and they integrate directly with structured concurrency scopes, subtasks automatically inherit the scoped value bindings of the parent. If you’re adopting one of these two features now, Scoped Values is the one you can ship without a preview flag.&lt;h2 class=wp-block-heading&gt;The Old Way: A CompletableFuture Chain&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Here’s a common pattern: fetch a user record and that user’s orders concurrently, combine them into a response, and give up if either call takes too long.&lt;pre class=brush:java&gt;CompletableFuture&amp;lt;User&amp;gt; userFuture = CompletableFuture&#xA;    .supplyAsync(() -&amp;gt; findUser(userId), executor)&#xA;    .orTimeout(2, TimeUnit.SECONDS);&#xA;&#xA;CompletableFuture&amp;lt;List&amp;lt;Order&amp;gt;&amp;gt; ordersFuture = CompletableFuture&#xA;    .supplyAsync(() -&amp;gt; fetchOrders(userId), executor)&#xA;    .orTimeout(2, TimeUnit.SECONDS);&#xA;&#xA;CompletableFuture&amp;lt;Response&amp;gt; combined = userFuture&#xA;    .thenCombine(ordersFuture, Response::new)&#xA;    .exceptionally(ex -&amp;gt; {&#xA;        userFuture.cancel(true);&#xA;        ordersFuture.cancel(true);&#xA;        throw new CompletionException(ex);&#xA;    });&#xA;&#xA;Response response = combined.join();&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;This works, but every line is doing manual bookkeeping the language should be handling. The &lt;code&gt;.exceptionally()&lt;/code&gt; block has to manually cancel the sibling future because &lt;code&gt;thenCombine&lt;/code&gt; won’t do it for you, and even that cancellation is mostly cosmetic: &lt;code&gt;CompletableFuture.cancel(true)&lt;/code&gt; marks the future as cancelled, it does not reliably interrupt the thread actually running &lt;code&gt;findUser()&lt;/code&gt; unless you’ve wired that up yourself. A thread dump under load shows a flat pool of generically named threads with no indication which request they belong to. None of this is a bug in &lt;code&gt;CompletableFuture&lt;/code&gt;, it’s simply an API built on unstructured concurrency, where tasks have no enforced relationship to each other.&lt;div style=&#34;display:inline-block; margin: 15px 0;&#34;&gt;&lt;div id=adngin-JavaCodeGeeks_incontent_video-0 style=display:inline-block;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;h2 class=wp-block-heading&gt;The New Way: StructuredTaskScope&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;The same logic, expressed with the current preview API from JEP 505 and JEP 525:&lt;pre class=brush:java&gt;Response handle(String userId) throws InterruptedException, ExecutionException {&#xA;    try (var scope = StructuredTaskScope.open(&#xA;            StructuredTaskScope.Joiner.awaitAllSuccessfulOrThrow(),&#xA;            cfg -&amp;gt; cfg.withTimeout(Duration.ofSeconds(2)))) {&#xA;&#xA;        StructuredTaskScope.Subtask&amp;lt;User&amp;gt; user =&#xA;            scope.fork(() -&amp;gt; findUser(userId));&#xA;        StructuredTaskScope.Subtask&amp;lt;List&amp;lt;Order&amp;gt;&amp;gt; orders =&#xA;            scope.fork(() -&amp;gt; fetchOrders(userId));&#xA;&#xA;        scope.join();&#xA;&#xA;        return new Response(user.get(), orders.get());&#xA;    }&#xA;}&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;The cancellation logic that took a manual &lt;code&gt;.exceptionally()&lt;/code&gt; block before is now the scope’s job. If either subtask fails, or the two-second timeout fires, &lt;code&gt;join()&lt;/code&gt; throws, the try-with-resources block closes the scope, and the scope interrupts whichever subtask is still running before returning control to the caller. Nobody wrote that coordination by hand, it’s a property of the scope itself.&lt;figure class=wp-block-table&gt;&lt;table class=has-fixed-layout&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th class=has-text-align-left data-align=left&gt;CompletableFuture concept&lt;th class=has-text-align-left data-align=left&gt;StructuredTaskScope equivalent&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;&lt;code&gt;supplyAsync(fn, executor)&lt;/code&gt;&lt;td class=has-text-align-left data-align=left&gt;&lt;code&gt;scope.fork(() -&amp;gt; ...)&lt;/code&gt;, runs on a virtual thread by default&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;&lt;code&gt;.orTimeout(...)&lt;/code&gt; per future&lt;td class=has-text-align-left data-align=left&gt;One timeout on the whole scope, via the configuration lambda&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;Manual &lt;code&gt;.cancel(true)&lt;/code&gt; on siblings&lt;td class=has-text-align-left data-align=left&gt;Automatic, scope cancels remaining subtasks on any failure&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;&lt;code&gt;.thenCombine()&lt;/code&gt; / &lt;code&gt;.join()&lt;/code&gt;&lt;td class=has-text-align-left data-align=left&gt;&lt;code&gt;scope.join()&lt;/code&gt;, then read each &lt;code&gt;Subtask.get()&lt;/code&gt;&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;Flat, unlabeled thread pool in a dump&lt;td class=has-text-align-left data-align=left&gt;Threads grouped under their owning scope in the thread dump&lt;/table&gt;&lt;/figure&gt;&lt;h2 class=wp-block-heading&gt;Where It Still Falls Short: The JDBC Problem&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;&lt;strong&gt;The gap that matters most in practice:&lt;/strong&gt; Structured Concurrency’s entire cancellation model depends on subtasks actually responding to interruption. The JEP’s own specification says it plainly, subtasks that block on methods that are not interruptible may delay the closing of a scope indefinitely, and the &lt;code&gt;close()&lt;/code&gt; method will wait for them to finish no matter what. That’s exactly what happens with most JDBC drivers today.&lt;p class=wp-block-paragraph&gt;A large share of production Java services fork a subtask to run a JDBC query. JDBC calls are blocking by design, and the underlying socket reads inside many drivers do not honor &lt;code&gt;Thread.interrupt()&lt;/code&gt; the way NIO channels do. When a sibling subtask fails and the scope tries to cancel that still-running database call, the interrupt gets delivered, but the thread sitting inside a blocking socket read simply doesn’t notice. The scope’s &lt;code&gt;close()&lt;/code&gt; call then blocks too, waiting for a subtask that has no intention of stopping until the underlying query finishes or the connection times out on its own. The clean, structured cancellation the whole feature is built around quietly stops working at exactly the boundary where most Java applications spend most of their I/O time.&lt;p class=wp-block-paragraph&gt;This isn’t a defect in Structured Concurrency, and it isn’t really a defect in JDBC either, it’s a mismatch between a cooperative interruption model and drivers written decades before that model existed. It also compounds with a related, separate issue: some JDBC drivers still use &lt;code&gt;synchronized&lt;/code&gt; blocks internally that pin virtual threads to their carrier during blocking calls, which is a scheduling problem rather than a cancellation one, but shows up in the same code paths and makes diagnosing the root cause harder.&lt;div class=wp-block-image&gt;&lt;figure class=&#34;aligncenter size-full&#34;&gt;&lt;a href=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-54-14.png&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-54-14.png fetchpriority=high decoding=async width=837 height=406 data-src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-54-14.png alt class=wp-image-145146 data-srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-54-14.png 837w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-54-14-300x146.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-54-14-768x373.png 768w&#34; data-sizes=&#34;(max-width: 837px) 100vw, 837px&#34;&gt;&lt;noscript&gt;&lt;img fetchpriority=high decoding=async width=837 height=406 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-54-14.png alt class=wp-image-145146 srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-54-14.png 837w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-54-14-300x146.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-54-14-768x373.png 768w&#34; sizes=&#34;(max-width: 837px) 100vw, 837px&#34;&gt;&lt;/noscript&gt;&lt;/a&gt;&lt;figcaption class=wp-element-caption&gt;Every JDK release Structured Concurrency has touched, and which preview round it shipped as. No release has finalized it yet.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&lt;h4 class=wp-block-heading&gt;What to actually do about it today&lt;/h4&gt;&lt;ul class=wp-block-list&gt;&lt;li&gt;Adopt Scoped Values now, they’re finalized in JDK 25 and safe to use without a preview flag.&lt;li&gt;Gate any Structured Concurrency code behind &lt;code&gt;--enable-preview&lt;/code&gt;, and expect the API to keep shifting slightly until it actually finalizes.&lt;li&gt;Audit which of your subtasks make blocking JDBC calls, and test what actually happens to scope shutdown time when one of those calls hangs.&lt;li&gt;Where possible, set aggressive query timeouts at the JDBC driver or connection-pool level, don’t rely on scope cancellation alone to bound a slow query.&lt;li&gt;Watch driver changelogs, several major JDBC drivers are actively working through virtual-thread and interruption compatibility issues; this gap is closing, not permanent.&lt;/ul&gt;&lt;h2 class=wp-block-heading&gt;What We Learned&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Structured Concurrency replaces the manual bookkeeping of &lt;code&gt;CompletableFuture&lt;/code&gt; chains, cancelling siblings by hand, chasing down which thread belongs to which request, with a scope that owns that coordination itself: fork subtasks, call &lt;code&gt;join()&lt;/code&gt;, and let a single timeout or failure cancel everything else automatically. But the feature is still in its seventh preview as of JDK 27, with no committed finalization date, so treat “production-ready” claims about it with the same caution the JEP authors themselves are showing. And its cancellation model has a real, specification-acknowledged limit: it only works if the code being cancelled actually responds to interruption, which a great deal of JDBC traffic still doesn’t.&lt;p class=wp-block-paragraph&gt;Scoped Values, by contrast, are finalized today and worth adopting regardless of how the rest of this story plays out. The try/catch generation isn’t being asked to abandon everything it knows, just to recognize that the biggest win here is structural correctness, not a syntax upgrade, and that the win still has a real edge where blocking I/O meets a cooperative cancellation model that assumes everyone plays along.&lt;/p&gt;&lt;style&gt;.lepopup-progress-60 div.lepopup-progress-t1&gt;div{background-color:#e0e0e0;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{background-color:#bd4070;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{color:#ffffff;}.lepopup-progress-60 div.lepopup-progress-t1&gt;label{color:#444444;}.lepopup-form-60, .lepopup-form-60 *, .lepopup-progress-60 {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box span i{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box,.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;text&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;email&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;password&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input select,.lepopup-form-60 .lepopup-element div.lepopup-input select option,.lepopup-form-60 .lepopup-element div.lepopup-input textarea{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;background-color:rgba(255, 255, 255, 0.7);background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow: inset 0px 0px 15px -7px #000000;}.lepopup-form-60 .lepopup-element div.lepopup-input ::placeholder{color:#555555; opacity: 0.9;} .lepopup-form-60 .lepopup-element div.lepopup-input ::-ms-input-placeholder{color:#555555; opacity: 0.9;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect::-webkit-scrollbar-thumb{background-color:#cccccc;}.lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-left, .lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-right{font-size:20px;color:#444444;border-radius:0px;}.lepopup-form-60 .lepopup-element .lepopup-button,.lepopup-form-60 .lepopup-element .lepopup-button:visited{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#ffffff;font-weight:700;font-style:normal;text-decoration:none;text-align:center;background-color:#326693;background-image:none;border-width:1px;border-style:solid;border-color:#326693;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label{border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label span.lepopup-imageselect-label{font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label:after{background-color:rgba(255, 255, 255, 0.7);}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]+label:hover{background-color:#bd4070;color:#ffffff;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]:checked+label{background-color:#a93a65;color:#ffffff;}.lepopup-form-60 .lepopup-element input[type=&#39;checkbox&#39;].lepopup-tile+label, .lepopup-form-60 .lepopup-element input[type=&#39;radio&#39;].lepopup-tile+label {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:center;background-color:#ffffff;background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element-error{font-size:15px;color:#ffffff;font-style:normal;text-decoration:none;text-align:left;background-color:#d9534f;background-image:none;}.lepopup-form-60 .lepopup-element-2 {background-color:rgba(226, 236, 250, 1);background-image:none;border-width:1px;border-style:solid;border-color:rgba(216, 216, 216, 1);border-radius:3px;box-shadow: 1px 1px 15px -6px #d7e1eb;}.lepopup-form-60 .lepopup-element-3 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-3 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-3 .lepopup-element-html-content {min-height:73px;}.lepopup-form-60 .lepopup-element-4 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-4 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-4 .lepopup-element-html-content {min-height:23px;}.lepopup-form-60 .lepopup-element-5 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-5 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-5 .lepopup-element-html-content {min-height:24px;}.lepopup-form-60 .lepopup-element-6 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-6 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-6 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-7 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-7 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-7 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-8 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-8 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-8 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-9 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-9 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-9 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-10 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-10 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-10 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-11 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-11 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-11 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-12 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-12 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-12 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-13 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-13 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-13 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-left, .lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-right {line-height:36px;}.lepopup-form-60 .lepopup-element-15 div.lepopup-input{height:auto;line-height:1;}.lepopup-form-60 .lepopup-element-16 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-16 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-16 .lepopup-element-html-content {min-height:5px;}.lepopup-form-60 .lepopup-element-19 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-19 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-19 .lepopup-element-html-content {min-height:363px;}.lepopup-form-60 .lepopup-element-0 * {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-0 {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:#5cb85c;background-image:none;border-width:0px;border-style:solid;border-color:#ccc;border-radius:5px;box-shadow: 1px 1px 15px -6px #000000;padding-top:40px;padding-right:40px;padding-bottom:40px;padding-left:40px;}.lepopup-form-60 .lepopup-element-0 .lepopup-element-html-content {min-height:160px;}&lt;/style&gt;&lt;div class=lepopup-inline style=&#34;margin: 0 auto;&#34;&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-jGBJhsKQGbzeYW7o lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=jGBJhsKQGbzeYW7o data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=1 data-xd=off data-width=820 data-height=430 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:820px;height:430px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:820px;height:430px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-2 lepopup-element-rectangle&#34; data-type=rectangle data-top=0 data-left=0 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:501;top:0px;left:0px;width:820px;height:430px;&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-3 lepopup-element-html&#34; data-type=html data-top=7 data-left=10 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:502;top:7px;left:10px;width:797px;height:73px;&gt;&lt;div class=lepopup-element-html-content&gt;Do you want to know how to develop your skillset to become a &lt;span style=&#34;color: #CAB43D; text-shadow: 1px 1px #835D5D;&#34;&gt;Java Rockstar?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-4 lepopup-element-html&#34; data-type=html data-top=83 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:503;top:83px;left:308px;width:473px;height:23px;&gt;&lt;div class=lepopup-element-html-content&gt;Subscribe to our newsletter to start Rocking &lt;span style=&#34;text-decoration: underline;&#34;&gt;right now!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-5 lepopup-element-html&#34; data-type=html data-top=107 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:504;top:107px;left:308px;width:473px;height:24px;&gt;&lt;div class=lepopup-element-html-content&gt;To get you started we give you our best selling eBooks for &lt;span style=&#34;color:#e01404; text-shadow: 1px 1px #C99924; font-size: 15px;&#34;&gt;FREE!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-6 lepopup-element-html&#34; data-type=html data-top=136 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:505;top:136px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;1.&lt;/span&gt; JPA Mini Book&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-7 lepopup-element-html&#34; data-type=html data-top=156 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:506;top:156px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;2.&lt;/span&gt; JVM Troubleshooting Guide&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-8 lepopup-element-html&#34; data-type=html data-top=176 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:507;top:176px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;3.&lt;/span&gt; JUnit Tutorial for Unit Testing&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-9 lepopup-element-html&#34; data-type=html data-top=196 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:508;top:196px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;4.&lt;/span&gt; Java Annotations Tutorial&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-10 lepopup-element-html&#34; data-type=html data-top=216 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:509;top:216px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;5.&lt;/span&gt; Java Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-11 lepopup-element-html&#34; data-type=html data-top=236 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:510;top:236px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;6.&lt;/span&gt; Spring Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-12 lepopup-element-html&#34; data-type=html data-top=256 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:511;top:256px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;7.&lt;/span&gt; Android UI Design&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-13 lepopup-element-html&#34; data-type=html data-top=282 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:512;top:282px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;and many more ....&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-14&#34; data-type=email data-deps data-id=14 data-top=305 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:513;top:305px;left:308px;width:473px;height:36px;&gt;&lt;div class=lepopup-input&gt;&lt;input type=email name=lepopup-14 class=lepopup-ta-left placeholder=&#34;Enter your e-mail...&#34; autocomplete=email data-default aria-label=&#34;Email Field&#34; oninput=lepopup_input_changed(this); onfocus=lepopup_input_error_hide(this);&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-15&#34; data-type=checkbox data-deps data-id=15 data-top=344 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:514;top:344px;left:308px;width:160px;&gt;&lt;div class=&#34;lepopup-input lepopup-cr-layout-1 lepopup-cr-layout-left&#34;&gt;&lt;div class=&#34;lepopup-cr-container lepopup-cr-container-medium lepopup-cr-container-left&#34;&gt;&lt;div class=lepopup-cr-box&gt;&lt;input class=&#34;lepopup-checkbox lepopup-checkbox-classic lepopup-checkbox-medium&#34; type=checkbox name=lepopup-15[] id=lepopup-checkbox-bChK9IS7eZwQbez8-14-0 value=on data-default=off onchange=lepopup_input_changed(this);&gt;&lt;label for=lepopup-checkbox-bChK9IS7eZwQbez8-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-cr-label lepopup-ta-left&#34;&gt;&lt;label for=lepopup-checkbox-bChK9IS7eZwQbez8-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-16 lepopup-element-html&#34; data-type=html data-top=344 data-left=338 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:515;top:344px;left:338px;width:350px;height:5px;&gt;&lt;div class=lepopup-element-html-content&gt;I agree to the &lt;a href=https://www.javacodegeeks.com/about/terms-of-use target=_blank&gt;Terms&lt;/a&gt; and &lt;a href=https://www.javacodegeeks.com/about/privacy-policy target=_blank&gt;Privacy Policy&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-17&#34; data-type=button data-top=372 data-left=308 data-animation-in=bounceIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:516;top:372px;left:308px;width:85px;height:37px;&gt;&lt;a class=&#34;lepopup-button lepopup-button-zoom-out&#34; href=https://www.javacodegeeks.com/feed/ onclick=&#34;return lepopup_submit(this);&#34; data-label=&#34;Sign up&#34; data-loading=Loading...&gt;&lt;span&gt;Sign up&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-19 lepopup-element-html&#34; data-type=html data-top=67 data-left=-15 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:518;top:67px;left:-15px;width:320px;height:363px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png decoding=async data-src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png alt width=320 height=363&gt;&lt;noscript&gt;&lt;img decoding=async src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png alt width=320 height=363&gt;&lt;/noscript&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-jGBJhsKQGbzeYW7o lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=jGBJhsKQGbzeYW7o data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=confirmation data-xd=off data-width=420 data-height=320 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:420px;height:320px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:420px;height:320px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-0 lepopup-element-html&#34; data-type=html data-top=80 data-left=70 data-animation-in=bounceInDown data-animation-out=fadeOutUp style=animation-duration:1000ms;animation-delay:0ms;z-index:500;top:80px;left:70px;width:280px;height:160px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;h4 style=&#34;text-align: center; font-size: 18px; font-weight: bold;&#34;&gt;Thank you!&lt;/h4&gt;&lt;p style=&#34;text-align: center;&#34;&gt;We will contact you soon.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;input type=hidden id=lepopup-logic-jGBJhsKQGbzeYW7o value=[]&gt;&lt;/div&gt;&lt;div class=&#34;post-bottom-meta post-bottom-tags post-tags-classic&#34;&gt;&lt;div class=post-bottom-meta-title&gt;&lt;span class=tie-icon-tags aria-hidden=true&gt;&lt;/span&gt;Tags&lt;/div&gt;&lt;span class=tagcloud&gt;&lt;a href=https://www.javacodegeeks.com/tag/jdk-25-26-27 rel=tag&gt;JDK 25/26/27&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/structured-concurrency rel=tag&gt;Structured Concurrency&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=post-extra-info&gt;&lt;div class=theiaStickySidebar&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=clearfix&gt;&lt;/div&gt;</description>
      <author>Eleftheria Drosopoulou</author>
      <guid>https://www.javacodegeeks.com/2026/08/structured-concurrency-what-changes-for-the-try-catch-generation.html</guid>
      <pubDate>Tue, 25 Aug 2026 16:52:00 +0000</pubDate>
    </item>
    <item>
      <title>Compact Object Headers in Production: The Free 15–25% Heap Reduction Nobody Enabled</title>
      <link>https://www.javacodegeeks.com/2026/08/compact-object-headers-in-production-the-free-15-25-heap-reduction-nobody-enabled.html</link>
      <description>&lt;header class=entry-header-outer&gt;&lt;nav id=breadcrumb&gt;&lt;a href=https://www.javacodegeeks.com/&gt;&lt;span class=tie-icon-home aria-hidden=true&gt;&lt;/span&gt;Home&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;a href=https://www.javacodegeeks.com/category/java&gt;Java&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;a href=https://www.javacodegeeks.com/category/java/core-java&gt;Core Java&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;span class=current&gt;Compact Object Headers in Production: The Free 15–25% Heap Reduction Nobody Enabled&lt;/span&gt;&lt;/nav&gt;&lt;div class=entry-header&gt;&lt;span class=post-cat-wrap&gt;&lt;a class=&#34;post-cat tie-cat-7&#34; href=https://www.javacodegeeks.com/category/java/core-java&gt;Core Java&lt;/a&gt;&lt;/span&gt;&lt;h1 class=&#34;post-title entry-title&#34;&gt;Compact Object Headers in Production: The Free 15–25% Heap Reduction Nobody Enabled&lt;/h1&gt;&lt;/div&gt;&lt;/header&gt;&lt;div class=&#34;entry-content entry clearfix&#34;&gt;&lt;div class=&#34;stream-item stream-item-above-post-content&#34;&gt;&lt;div class=stream-item-size&gt;&lt;div id=adngin-in-post-0 style=&#34;float:left; margin-right:20px; margin-bottom:10px; width:300px; height:274px;&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class=wp-block-paragraph&gt;JEP 519 shipped stable in JDK 25. It shrinks every single object header on the heap. It’s one JVM flag. Most teams still haven’t flipped it.&lt;p class=wp-block-paragraph&gt;Here’s a JVM optimization that costs nothing to try, requires no code changes, and has already been validated across hundreds of production services at Amazon. It shipped as a stable, production-ready feature in JDK 25. And if your team is like most, it’s sitting there unused. This is the story of Compact Object Headers, what they actually do, what the real numbers look like, and why “it’s automatic now” is the myth that’s keeping teams from claiming savings they’re already entitled to.&lt;h2 class=wp-block-heading&gt;What’s Actually Sitting in Every Object Header&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Every object on the Java heap carries a header before any of its actual data. That header isn’t optional, and until recently, it wasn’t small. On a typical 64-bit JVM with compressed object pointers enabled, a plain object header consumes 96 bits, 12 bytes, made up of a mark word (used for locking, garbage collection state, and identity hash codes) and a compressed class pointer. On larger heaps, above roughly 32 GB, where compressed pointers stop working, that header grows to 128 bits, 16 bytes.&lt;p class=wp-block-paragraph&gt;For an application with a handful of large objects, that overhead barely registers. But most real Java applications aren’t shaped like that. Spring Boot services, data pipelines, caching layers, anything built around small domain objects, DTOs, wrapper types, list nodes, tends to allocate enormous numbers of small objects. When each one is paying a fixed 12-to-16-byte tax just to exist, that tax adds up fast. It’s routine for header overhead alone to account for 15 to 25 percent of total heap usage in object-heavy workloads.&lt;h2 class=wp-block-heading&gt;The Fix: One 64-Bit Word Instead of Two&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;&lt;a href=https://openjdk.org/jeps/519 target=_blank rel=&#34;noreferrer noopener&#34;&gt;JEP 519, Compact Object Headers&lt;/a&gt;, takes the mark word and the class pointer, previously two separate fields, and merges them into a single compact 64-bit word. The class pointer itself gets compressed further, down to 22 bits, still enough headroom for roughly four million distinct classes, far beyond what any real application will ever load. The net result is straightforward: every object header on the heap shrinks from 96 or 128 bits down to a flat 64 bits, and every object gets smaller without a single line of application code changing.&lt;p class=wp-block-paragraph&gt;This didn’t appear out of nowhere in JDK 25. It’s the first shipped result of Project Lilliput, the OpenJDK effort dedicated specifically to shrinking object memory overhead, and it spent a full release cycle as an experimental feature under JEP 450 in JDK 24 before graduating to a stable product feature. Enabling it takes one flag:&lt;div style=&#34;display:inline-block; margin: 15px 0;&#34;&gt;&lt;div id=adngin-JavaCodeGeeks_incontent_video-0 style=display:inline-block;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;div class=wp-block-syntaxhighlighter-code&gt;&lt;pre class=&#34;brush: plain; title: ; notranslate&#34;&gt;-XX:+UseCompactObjectHeaders&#xA;&lt;/pre&gt;&lt;/div&gt;&lt;p class=wp-block-paragraph&gt;That’s the entire integration cost. No dependency changes, no application code touched, no build configuration beyond a JVM flag you can add to a deployment manifest today.&lt;h2 class=wp-block-heading&gt;The Myth: “It’s On by Default in Java 25”&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;&lt;strong&gt;The misconception:&lt;/strong&gt; Because JEP 519 promoted compact object headers to a stable, production-ready feature, plenty of teams assume upgrading to JDK 25 gets them the savings automatically. It doesn’t. Compact object headers remain opt-in in JDK 25. A separate proposal, JEP 534, exists specifically to flip the default and currently targets JDK 27, and its own text is explicit that the JDK 25 team deliberately held off, in their words, changes this size are best introduced carefully and gradually. If you’ve upgraded to JDK 25 and never added the flag, you’re running with the old 96-to-128-bit headers exactly as before.&lt;p class=wp-block-paragraph&gt;That gap, between “production-ready” and “on by default,” is precisely why this savings is still sitting unclaimed on so many clusters. Teams read “stable in JDK 25” and reasonably assume stable means enabled. It means tested, not turned on.&lt;div class=wp-block-image&gt;&lt;figure class=&#34;aligncenter size-full&#34;&gt;&lt;a href=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-14.png&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-14.png fetchpriority=high decoding=async width=833 height=401 data-src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-14.png alt class=wp-image-145142 data-srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-14.png 833w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-14-300x144.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-14-768x370.png 768w&#34; data-sizes=&#34;(max-width: 833px) 100vw, 833px&#34;&gt;&lt;noscript&gt;&lt;img fetchpriority=high decoding=async width=833 height=401 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-14.png alt class=wp-image-145142 srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-14.png 833w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-14-300x144.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-14-768x370.png 768w&#34; sizes=&#34;(max-width: 833px) 100vw, 833px&#34;&gt;&lt;/noscript&gt;&lt;/a&gt;&lt;figcaption class=wp-element-caption&gt;Object header size before and after JEP 519, per the OpenJDK specification.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&lt;h2 class=wp-block-heading&gt;The Real Numbers, Not Marketing Numbers&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;The headline figures come straight from OpenJDK’s own JEP 519 text, not a vendor benchmark. Running the SPECjbb2015 benchmark with compact object headers enabled showed 22 percent less heap space used, 8 percent less CPU time, and 15 percent fewer garbage collections with both the G1 and Parallel collectors, all with no application changes involved. A separate, highly parallel JSON parsing benchmark ran 10 percent faster. Those figures are exactly where the “15 to 25 percent” range in the title comes from, not a rounded-up marketing number.&lt;p class=wp-block-paragraph&gt;The validation behind those numbers is unusually thorough for a JVM-level change. Amazon ran compact object headers across hundreds of production services before JDK 25 ever shipped, largely using backports of the feature to JDK 17 and JDK 21. SAP went further still, enabling compact object headers by default in SapMachine, its own OpenJDK distribution, ahead of the upstream default flip. That’s not a lab result, it’s production traffic at two of the largest JVM operators on the planet.&lt;div class=wp-block-image&gt;&lt;figure class=&#34;aligncenter size-full&#34;&gt;&lt;a href=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-59.png&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-59.png decoding=async width=838 height=407 data-src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-59.png alt class=wp-image-145143 data-srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-59.png 838w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-59-300x146.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-59-768x373.png 768w&#34; data-sizes=&#34;(max-width: 838px) 100vw, 838px&#34;&gt;&lt;noscript&gt;&lt;img decoding=async width=838 height=407 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-59.png alt class=wp-image-145143 srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-59.png 838w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-59-300x146.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-45-59-768x373.png 768w&#34; sizes=&#34;(max-width: 838px) 100vw, 838px&#34;&gt;&lt;/noscript&gt;&lt;/a&gt;&lt;figcaption class=wp-element-caption&gt;From experimental flag to stable feature to a proposed default, across three release cycles.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p class=wp-block-paragraph&gt;Where the FinOps Case Writes Itself&lt;p class=wp-block-paragraph&gt;For any team already tracking JVM memory against container limits, this is about as close to a free lunch as infrastructure optimization gets. Smaller headers mean lower heap usage at the same workload, which means either a smaller memory request per pod, or more headroom before you hit a limit and get OOM-killed. Lower heap usage also means less garbage collection work per cycle, since the collector is scanning fewer bytes of live header data on every pass. If your team has already gone through the exercise of right-sizing JVM container memory requests, compact object headers is the next lever, and it’s a lever you pull with one flag instead of a re-architecture.&lt;h4 class=wp-block-heading&gt;Rollout checklist before you flip the flag&lt;/h4&gt;&lt;ul class=wp-block-list&gt;&lt;li&gt;Confirm you’re on JDK 25 or later, or a distribution that has backported JEP 519.&lt;li&gt;Check your heap size. Compact headers rely on compressed class pointers, which stop working above roughly 32 GB per heap.&lt;li&gt;Audit any native code or JNI integrations that assume a fixed object header layout, these are the most likely source of surprises.&lt;li&gt;Re-check debugging and profiling tooling. Anything that parses raw object headers needs to be header-layout aware.&lt;li&gt;Roll out to a non-critical service first and compare heap and GC metrics before and after, the same way you’d validate any other JVM flag change.&lt;/ul&gt;&lt;h2 class=wp-block-heading&gt;What We Learned&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Compact Object Headers, delivered through JEP 519, shrink every Java object’s header from 96 or 128 bits down to a single 64-bit word by merging the mark word and a compressed class pointer, with OpenJDK’s own SPECjbb2015 numbers showing 22 percent less heap and 8 percent less CPU time as a direct result. It shipped as a stable, production-ready feature in JDK 25, validated against hundreds of real production services at Amazon before it ever reached that milestone. The catch is entirely about defaults, not readiness, the feature is opt-in behind a single flag, and a separate JEP proposing to make it the default hasn’t landed yet. For any object-heavy Java workload running in containers with a memory limit attached to a cost line, that single flag is one of the highest-leverage, lowest-risk changes available today, and most teams simply haven’t flipped it yet.&lt;/p&gt;&lt;style&gt;.lepopup-progress-60 div.lepopup-progress-t1&gt;div{background-color:#e0e0e0;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{background-color:#bd4070;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{color:#ffffff;}.lepopup-progress-60 div.lepopup-progress-t1&gt;label{color:#444444;}.lepopup-form-60, .lepopup-form-60 *, .lepopup-progress-60 {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box span i{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box,.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;text&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;email&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;password&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input select,.lepopup-form-60 .lepopup-element div.lepopup-input select option,.lepopup-form-60 .lepopup-element div.lepopup-input textarea{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;background-color:rgba(255, 255, 255, 0.7);background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow: inset 0px 0px 15px -7px #000000;}.lepopup-form-60 .lepopup-element div.lepopup-input ::placeholder{color:#555555; opacity: 0.9;} .lepopup-form-60 .lepopup-element div.lepopup-input ::-ms-input-placeholder{color:#555555; opacity: 0.9;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect::-webkit-scrollbar-thumb{background-color:#cccccc;}.lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-left, .lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-right{font-size:20px;color:#444444;border-radius:0px;}.lepopup-form-60 .lepopup-element .lepopup-button,.lepopup-form-60 .lepopup-element .lepopup-button:visited{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#ffffff;font-weight:700;font-style:normal;text-decoration:none;text-align:center;background-color:#326693;background-image:none;border-width:1px;border-style:solid;border-color:#326693;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label{border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label span.lepopup-imageselect-label{font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label:after{background-color:rgba(255, 255, 255, 0.7);}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]+label:hover{background-color:#bd4070;color:#ffffff;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]:checked+label{background-color:#a93a65;color:#ffffff;}.lepopup-form-60 .lepopup-element input[type=&#39;checkbox&#39;].lepopup-tile+label, .lepopup-form-60 .lepopup-element input[type=&#39;radio&#39;].lepopup-tile+label {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:center;background-color:#ffffff;background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element-error{font-size:15px;color:#ffffff;font-style:normal;text-decoration:none;text-align:left;background-color:#d9534f;background-image:none;}.lepopup-form-60 .lepopup-element-2 {background-color:rgba(226, 236, 250, 1);background-image:none;border-width:1px;border-style:solid;border-color:rgba(216, 216, 216, 1);border-radius:3px;box-shadow: 1px 1px 15px -6px #d7e1eb;}.lepopup-form-60 .lepopup-element-3 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-3 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-3 .lepopup-element-html-content {min-height:73px;}.lepopup-form-60 .lepopup-element-4 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-4 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-4 .lepopup-element-html-content {min-height:23px;}.lepopup-form-60 .lepopup-element-5 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-5 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-5 .lepopup-element-html-content {min-height:24px;}.lepopup-form-60 .lepopup-element-6 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-6 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-6 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-7 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-7 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-7 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-8 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-8 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-8 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-9 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-9 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-9 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-10 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-10 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-10 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-11 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-11 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-11 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-12 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-12 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-12 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-13 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-13 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-13 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-left, .lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-right {line-height:36px;}.lepopup-form-60 .lepopup-element-15 div.lepopup-input{height:auto;line-height:1;}.lepopup-form-60 .lepopup-element-16 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-16 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-16 .lepopup-element-html-content {min-height:5px;}.lepopup-form-60 .lepopup-element-19 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-19 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-19 .lepopup-element-html-content {min-height:363px;}.lepopup-form-60 .lepopup-element-0 * {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-0 {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:#5cb85c;background-image:none;border-width:0px;border-style:solid;border-color:#ccc;border-radius:5px;box-shadow: 1px 1px 15px -6px #000000;padding-top:40px;padding-right:40px;padding-bottom:40px;padding-left:40px;}.lepopup-form-60 .lepopup-element-0 .lepopup-element-html-content {min-height:160px;}&lt;/style&gt;&lt;div class=lepopup-inline style=&#34;margin: 0 auto;&#34;&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-P4MNvYTlN6yJEmuM lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=P4MNvYTlN6yJEmuM data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=1 data-xd=off data-width=820 data-height=430 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:820px;height:430px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:820px;height:430px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-2 lepopup-element-rectangle&#34; data-type=rectangle data-top=0 data-left=0 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:501;top:0px;left:0px;width:820px;height:430px;&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-3 lepopup-element-html&#34; data-type=html data-top=7 data-left=10 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:502;top:7px;left:10px;width:797px;height:73px;&gt;&lt;div class=lepopup-element-html-content&gt;Do you want to know how to develop your skillset to become a &lt;span style=&#34;color: #CAB43D; text-shadow: 1px 1px #835D5D;&#34;&gt;Java Rockstar?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-4 lepopup-element-html&#34; data-type=html data-top=83 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:503;top:83px;left:308px;width:473px;height:23px;&gt;&lt;div class=lepopup-element-html-content&gt;Subscribe to our newsletter to start Rocking &lt;span style=&#34;text-decoration: underline;&#34;&gt;right now!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-5 lepopup-element-html&#34; data-type=html data-top=107 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:504;top:107px;left:308px;width:473px;height:24px;&gt;&lt;div class=lepopup-element-html-content&gt;To get you started we give you our best selling eBooks for &lt;span style=&#34;color:#e01404; text-shadow: 1px 1px #C99924; font-size: 15px;&#34;&gt;FREE!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-6 lepopup-element-html&#34; data-type=html data-top=136 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:505;top:136px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;1.&lt;/span&gt; JPA Mini Book&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-7 lepopup-element-html&#34; data-type=html data-top=156 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:506;top:156px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;2.&lt;/span&gt; JVM Troubleshooting Guide&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-8 lepopup-element-html&#34; data-type=html data-top=176 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:507;top:176px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;3.&lt;/span&gt; JUnit Tutorial for Unit Testing&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-9 lepopup-element-html&#34; data-type=html data-top=196 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:508;top:196px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;4.&lt;/span&gt; Java Annotations Tutorial&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-10 lepopup-element-html&#34; data-type=html data-top=216 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:509;top:216px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;5.&lt;/span&gt; Java Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-11 lepopup-element-html&#34; data-type=html data-top=236 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:510;top:236px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;6.&lt;/span&gt; Spring Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-12 lepopup-element-html&#34; data-type=html data-top=256 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:511;top:256px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;7.&lt;/span&gt; Android UI Design&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-13 lepopup-element-html&#34; data-type=html data-top=282 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:512;top:282px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;and many more ....&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-14&#34; data-type=email data-deps data-id=14 data-top=305 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:513;top:305px;left:308px;width:473px;height:36px;&gt;&lt;div class=lepopup-input&gt;&lt;input type=email name=lepopup-14 class=lepopup-ta-left placeholder=&#34;Enter your e-mail...&#34; autocomplete=email data-default aria-label=&#34;Email Field&#34; oninput=lepopup_input_changed(this); onfocus=lepopup_input_error_hide(this);&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-15&#34; data-type=checkbox data-deps data-id=15 data-top=344 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:514;top:344px;left:308px;width:160px;&gt;&lt;div class=&#34;lepopup-input lepopup-cr-layout-1 lepopup-cr-layout-left&#34;&gt;&lt;div class=&#34;lepopup-cr-container lepopup-cr-container-medium lepopup-cr-container-left&#34;&gt;&lt;div class=lepopup-cr-box&gt;&lt;input class=&#34;lepopup-checkbox lepopup-checkbox-classic lepopup-checkbox-medium&#34; type=checkbox name=lepopup-15[] id=lepopup-checkbox-txNCAcmnEiMQvQf6-14-0 value=on data-default=off onchange=lepopup_input_changed(this);&gt;&lt;label for=lepopup-checkbox-txNCAcmnEiMQvQf6-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-cr-label lepopup-ta-left&#34;&gt;&lt;label for=lepopup-checkbox-txNCAcmnEiMQvQf6-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-16 lepopup-element-html&#34; data-type=html data-top=344 data-left=338 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:515;top:344px;left:338px;width:350px;height:5px;&gt;&lt;div class=lepopup-element-html-content&gt;I agree to the &lt;a href=https://www.javacodegeeks.com/about/terms-of-use target=_blank&gt;Terms&lt;/a&gt; and &lt;a href=https://www.javacodegeeks.com/about/privacy-policy target=_blank&gt;Privacy Policy&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-17&#34; data-type=button data-top=372 data-left=308 data-animation-in=bounceIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:516;top:372px;left:308px;width:85px;height:37px;&gt;&lt;a class=&#34;lepopup-button lepopup-button-zoom-out&#34; href=https://www.javacodegeeks.com/feed/ onclick=&#34;return lepopup_submit(this);&#34; data-label=&#34;Sign up&#34; data-loading=Loading...&gt;&lt;span&gt;Sign up&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-19 lepopup-element-html&#34; data-type=html data-top=67 data-left=-15 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:518;top:67px;left:-15px;width:320px;height:363px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png decoding=async data-src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png alt width=320 height=363&gt;&lt;noscript&gt;&lt;img decoding=async src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png alt width=320 height=363&gt;&lt;/noscript&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-P4MNvYTlN6yJEmuM lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=P4MNvYTlN6yJEmuM data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=confirmation data-xd=off data-width=420 data-height=320 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:420px;height:320px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:420px;height:320px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-0 lepopup-element-html&#34; data-type=html data-top=80 data-left=70 data-animation-in=bounceInDown data-animation-out=fadeOutUp style=animation-duration:1000ms;animation-delay:0ms;z-index:500;top:80px;left:70px;width:280px;height:160px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;h4 style=&#34;text-align: center; font-size: 18px; font-weight: bold;&#34;&gt;Thank you!&lt;/h4&gt;&lt;p style=&#34;text-align: center;&#34;&gt;We will contact you soon.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;input type=hidden id=lepopup-logic-P4MNvYTlN6yJEmuM value=[]&gt;&lt;/div&gt;&lt;div class=&#34;post-bottom-meta post-bottom-tags post-tags-classic&#34;&gt;&lt;div class=post-bottom-meta-title&gt;&lt;span class=tie-icon-tags aria-hidden=true&gt;&lt;/span&gt;Tags&lt;/div&gt;&lt;span class=tagcloud&gt;&lt;a href=https://www.javacodegeeks.com/tag/finops rel=tag&gt;FinOps&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/jvm-internals rel=tag&gt;JVM Internals&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=post-extra-info&gt;&lt;div class=theiaStickySidebar&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=clearfix&gt;&lt;/div&gt;</description>
      <author>Eleftheria Drosopoulou</author>
      <guid>https://www.javacodegeeks.com/2026/08/compact-object-headers-in-production-the-free-15-25-heap-reduction-nobody-enabled.html</guid>
      <pubDate>Tue, 25 Aug 2026 05:44:00 +0000</pubDate>
    </item>
    <item>
      <title>The Actor Model’s Long Lineage: From Hewitt’s 1973 Paper to Kotlin Coroutines</title>
      <link>https://www.javacodegeeks.com/2026/08/the-actor-models-long-lineage-from-hewitts-1973-paper-to-kotlin-coroutines.html</link>
      <description>&lt;header class=entry-header-outer&gt;&lt;nav id=breadcrumb&gt;&lt;a href=https://www.javacodegeeks.com/&gt;&lt;span class=tie-icon-home aria-hidden=true&gt;&lt;/span&gt;Home&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;a href=https://www.javacodegeeks.com/category/software-development&gt;Software Development&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;span class=current&gt;The Actor Model’s Long Lineage: From Hewitt’s 1973 Paper to Kotlin Coroutines&lt;/span&gt;&lt;/nav&gt;&lt;div class=entry-header&gt;&lt;span class=post-cat-wrap&gt;&lt;a class=&#34;post-cat tie-cat-15&#34; href=https://www.javacodegeeks.com/category/software-development&gt;Software Development&lt;/a&gt;&lt;/span&gt;&lt;h1 class=&#34;post-title entry-title&#34;&gt;The Actor Model’s Long Lineage: From Hewitt’s 1973 Paper to Kotlin Coroutines&lt;/h1&gt;&lt;/div&gt;&lt;/header&gt;&lt;div class=&#34;entry-content entry clearfix&#34;&gt;&lt;div class=&#34;stream-item stream-item-above-post-content&#34;&gt;&lt;div class=stream-item-size&gt;&lt;div id=adngin-in-post-0 style=&#34;float:left; margin-right:20px; margin-bottom:10px; width:300px; height:274px;&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class=wp-block-paragraph&gt;Every “actor” you’ve used, Erlang’s, Akka’s, Kotlin’s, descends from a single 1973 formalism. What survived the trip from language primitive to library is not the same in each case.&lt;p class=wp-block-paragraph&gt;It’s common to hear the actor model described as “Erlang’s concurrency thing,” with Akka and its imitators treated as ports of an Erlang idea to other platforms. That framing skips a generation. The actor model didn’t originate with Erlang at all. It comes from a 1973 artificial intelligence paper by Carl Hewitt, Peter Bishop, and Richard Steiger, written more than a decade before Erlang existed, and Erlang itself arrived at similar ideas independently rather than by implementing Hewitt’s paper directly. Tracing the lineage properly, from a formal model, to a language built around it, to a library bolted onto languages that were never designed for it, shows exactly which guarantees survive each step and which ones quietly become the programmer’s responsibility instead of the runtime’s.&lt;h2 class=wp-block-heading&gt;The 1973 Formalism&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Hewitt, Bishop, and Steiger’s &lt;a href=https://www.ijcai.org/Proceedings/73/Papers/027B.pdf target=_blank rel=&#34;noreferrer noopener&#34;&gt;“A Universal Modular ACTOR Formalism for Artificial Intelligence”&lt;/a&gt; was not a systems paper about concurrency for its own sake. It was a position paper for the 1973 International Joint Conference on Artificial Intelligence, proposing actors as a single universal primitive underneath everything, control structures, data structures, even AI reasoning itself. The paper explicitly credits Alan Kay’s Smalltalk and Flex work as an influence, and the actor it describes is defined by exactly three capabilities: it can create new actors, it can send messages to actors it knows about, and it can designate how it will behave the next time it receives a message. Nothing else is a primitive. Everything else in a computation, in Hewitt’s formulation, is built out of those three moves.&lt;p class=wp-block-paragraph&gt;Two consequences follow directly from that definition, and both turn out to matter enormously once the model becomes real software decades later. First, actors never share mutable state; the only way to affect another actor is to send it a message, never to reach into its memory. Second, message delivery is asynchronous, an actor sends a message and continues, it does not block waiting for the message to be received or processed.&lt;h2 class=wp-block-heading&gt;Erlang: The Model Becomes a Language&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Joe Armstrong, Robert Virding, and Mike Williams built Erlang at Ericsson starting in 1986, aiming to solve a very concrete problem, telecom switching software that could not be allowed to go down. They arrived at a design built entirely around lightweight, isolated processes communicating only by message passing, and multiple retrospective accounts note that this converges conceptually with Hewitt’s 1973 actor formalism despite having been developed independently for a different purpose. In Erlang, the actor is not a design pattern you opt into, it is the only unit of concurrency the language gives you. There is no shared-memory alternative sitting next to it.&lt;p class=wp-block-paragraph&gt;Because the actor is a language-level primitive, the Erlang runtime, the BEAM virtual machine, can enforce guarantees that a library bolted onto another language simply cannot. Every Erlang process gets its own private heap and its own garbage collector, so a collection pause in one process never stops any other process in the system. A newly spawned process starts at roughly 327 words of memory, according to Erlang’s own official documentation, cheap enough that spawning a million of them is an ordinary benchmark rather than a stunt. On top of process isolation, Erlang’s OTP framework layers supervision trees and a “let it crash” philosophy: a process is allowed to fail outright, and a dedicated supervisor process, not the crashing process itself, decides how to recover, restart, or escalate the failure.&lt;div style=&#34;display:inline-block; margin: 15px 0;&#34;&gt;&lt;div id=adngin-JavaCodeGeeks_incontent_video-0 style=display:inline-block;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;div class=wp-block-image&gt;&lt;figure class=&#34;aligncenter size-full&#34;&gt;&lt;a href=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-38-36.png&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-38-36.png fetchpriority=high decoding=async width=835 height=423 data-src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-38-36.png alt class=wp-image-145138 data-srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-38-36.png 835w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-38-36-300x152.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-38-36-768x389.png 768w&#34; data-sizes=&#34;(max-width: 835px) 100vw, 835px&#34;&gt;&lt;noscript&gt;&lt;img fetchpriority=high decoding=async width=835 height=423 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-38-36.png alt class=wp-image-145138 srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-38-36.png 835w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-38-36-300x152.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-38-36-768x389.png 768w&#34; sizes=&#34;(max-width: 835px) 100vw, 835px&#34;&gt;&lt;/noscript&gt;&lt;/a&gt;&lt;figcaption class=wp-element-caption&gt;Approximate memory overhead per unit of concurrency, log scale. Erlang and Akka figures are from their own official documentation; the JVM native thread figure is HotSpot’s default 64-bit stack size.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&lt;h2 class=wp-block-heading&gt;Akka: The Model Becomes a Library&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Jonas Bonér started Akka in 2009 explicitly because he wanted Erlang’s approach to concurrency and fault tolerance available on the JVM, where Java and Scala developers were still managing shared-memory threads and locks by hand. Akka’s actors keep the parts of the model that a library running inside an existing language runtime can still enforce by convention: each actor has a private mailbox, processes one message at a time, and Akka layers supervisor hierarchies on top, deliberately modeled on Erlang’s, to handle failure by restarting or stopping child actors rather than letting an exception propagate uncontrolled.&lt;p class=wp-block-paragraph&gt;What Akka cannot do is change the ground it’s standing on. The JVM itself has no concept of an isolated, per-actor heap, every Akka actor’s state lives on the same shared heap as everything else in the process, garbage collected together. Nothing in the JVM stops one actor’s code from directly touching another actor’s fields; the isolation Erlang’s runtime enforces mechanically, Akka can only ask you to respect by not writing code that reaches across actor boundaries. It is convention backed by documentation and API design, not a guarantee the underlying platform makes impossible to violate. Akka’s own materials cite roughly 2.5 million actors per gigabyte of heap, remarkably lightweight for a JVM library, but that efficiency comes from actors sharing a small pool of real OS threads through Akka’s dispatcher, not from each actor getting anything resembling Erlang’s dedicated per-process heap and scheduler slice.&lt;h2 class=wp-block-heading&gt;Kotlin Coroutines: The Model Becomes a Pattern&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Kotlin’s coroutines library shipped an &lt;code&gt;actor&lt;/code&gt; coroutine builder, a coroutine paired with a &lt;code&gt;Channel&lt;/code&gt; that serves as its mailbox, giving you the surface shape of an actor, a single point of message entry, sequential processing, without any of the surrounding machinery. There is no supervision hierarchy. There is no isolated failure handling beyond ordinary coroutine cancellation. There is no scheduler-level guarantee about how the actor’s work is isolated from anything else running in the same process. It is, structurally, a convenience wrapper around a channel and a loop.&lt;p class=wp-block-paragraph&gt;The kotlinx.coroutines project itself eventually conceded the point. The &lt;code&gt;actor&lt;/code&gt; builder was marked with the &lt;code&gt;@ObsoleteCoroutinesApi&lt;/code&gt; annotation, and its own documentation states plainly that it will become obsolete once a more complete actor implementation exists, a replacement that, years later, still has not shipped as a first-class API. The library’s 0.26 release, which introduced structured concurrency as Kotlin’s primary concurrency model, deprecated standalone builders like the original &lt;code&gt;actor&lt;/code&gt; function in favor of scoped, structured alternatives. What began as “Kotlin has actors too” quietly became “Kotlin has a channel with a for-loop that we used to call an actor.”&lt;figure class=wp-block-table&gt;&lt;table class=has-fixed-layout&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th class=has-text-align-left data-align=left&gt;Property&lt;th class=has-text-align-left data-align=left&gt;Erlang (language primitive)&lt;th class=has-text-align-left data-align=left&gt;Akka (library on the JVM)&lt;th class=has-text-align-left data-align=left&gt;Kotlin coroutines (deprecated builder)&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;Isolated per-actor heap&lt;td class=has-text-align-left data-align=left&gt;Yes, enforced by the BEAM&lt;td class=has-text-align-left data-align=left&gt;No, shared JVM heap&lt;td class=has-text-align-left data-align=left&gt;No, shared JVM heap&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;Supervision hierarchy&lt;td class=has-text-align-left data-align=left&gt;Yes, built into OTP&lt;td class=has-text-align-left data-align=left&gt;Yes, modeled on Erlang’s&lt;td class=has-text-align-left data-align=left&gt;No&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;Preemptive scheduling of actors&lt;td class=has-text-align-left data-align=left&gt;Yes, BEAM schedulers use reduction counting&lt;td class=has-text-align-left data-align=left&gt;Cooperative, via dispatcher thread pool&lt;td class=has-text-align-left data-align=left&gt;Cooperative, via the coroutine dispatcher&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;“Let it crash” failure semantics&lt;td class=has-text-align-left data-align=left&gt;Yes, a first-class runtime feature&lt;td class=has-text-align-left data-align=left&gt;Approximated through supervisor strategies&lt;td class=has-text-align-left data-align=left&gt;No equivalent; failures are ordinary exceptions&lt;tr&gt;&lt;td class=has-text-align-left data-align=left&gt;Status today&lt;td class=has-text-align-left data-align=left&gt;Core language feature&lt;td class=has-text-align-left data-align=left&gt;Actively maintained library&lt;td class=has-text-align-left data-align=left&gt;Marked obsolete by its own maintainers&lt;/table&gt;&lt;/figure&gt;&lt;figure class=&#34;wp-block-image size-full&#34;&gt;&lt;a href=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-39-25.png&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-39-25.png decoding=async width=831 height=426 data-src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-39-25.png alt class=wp-image-145139 data-srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-39-25.png 831w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-39-25-300x154.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-39-25-768x394.png 768w&#34; data-sizes=&#34;(max-width: 831px) 100vw, 831px&#34;&gt;&lt;noscript&gt;&lt;img decoding=async width=831 height=426 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-39-25.png alt class=wp-image-145139 srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-39-25.png 831w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-39-25-300x154.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/2026-08-16_22-39-25-768x394.png 768w&#34; sizes=&#34;(max-width: 831px) 100vw, 831px&#34;&gt;&lt;/noscript&gt;&lt;/a&gt;&lt;figcaption class=wp-element-caption&gt;The actor model’s path from formalism to language to library to a deprecated convenience API.&lt;/figcaption&gt;&lt;/figure&gt;&lt;h4 class=wp-block-heading&gt;What actually survives the trip to a library&lt;/h4&gt;&lt;ul class=wp-block-list&gt;&lt;li&gt;&lt;strong&gt;The mailbox.&lt;/strong&gt; Every implementation here preserves the idea of a single, ordered inbox per actor, this is cheap to build on any platform and rarely gets cut.&lt;li&gt;&lt;strong&gt;Sequential message processing.&lt;/strong&gt; One actor handles one message at a time everywhere in this lineage, since it’s the easiest guarantee to keep without runtime support.&lt;li&gt;&lt;strong&gt;What tends to disappear first is failure isolation.&lt;/strong&gt; Supervision and “let it crash” depend on the runtime actually stopping a fault from spreading, and that’s exactly what a library running inside a general-purpose language cannot fully guarantee.&lt;li&gt;&lt;strong&gt;Memory isolation is the hardest guarantee to port.&lt;/strong&gt; It requires a dedicated per-actor heap and garbage collector, which only a purpose-built runtime like the BEAM provides.&lt;/ul&gt;&lt;h2 class=wp-block-heading&gt;What We Learned&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;The actor model didn’t start as a concurrency mechanism at all, it started as Carl Hewitt’s 1973 attempt at a universal computational primitive for artificial intelligence, built on nothing but actors that create other actors, send messages, and decide how to handle the next one. Erlang, arriving at similar ideas independently more than a decade later, turned that formalism into a language where isolation, preemptive scheduling, and supervised failure are enforced by a purpose-built runtime, the BEAM. Akka carried the mailbox and the supervision philosophy onto the JVM, but as a library it can only ask actors to respect isolation the shared heap doesn’t actually enforce.&lt;p class=wp-block-paragraph&gt;Kotlin’s coroutine-based &lt;code&gt;actor&lt;/code&gt; builder went further still, keeping only the mailbox and sequential processing, and its own maintainers eventually marked it obsolete because a channel with a loop was never really the same guarantee Hewitt described in 1973. The lineage is real, but each step down from language primitive to library is a step where the runtime does less and the programmer’s discipline is asked to do more.&lt;p class=wp-block-paragraph&gt;&lt;style&gt;.lepopup-progress-60 div.lepopup-progress-t1&gt;div{background-color:#e0e0e0;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{background-color:#bd4070;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{color:#ffffff;}.lepopup-progress-60 div.lepopup-progress-t1&gt;label{color:#444444;}.lepopup-form-60, .lepopup-form-60 *, .lepopup-progress-60 {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box span i{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box,.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;text&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;email&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;password&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input select,.lepopup-form-60 .lepopup-element div.lepopup-input select option,.lepopup-form-60 .lepopup-element div.lepopup-input textarea{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;background-color:rgba(255, 255, 255, 0.7);background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow: inset 0px 0px 15px -7px #000000;}.lepopup-form-60 .lepopup-element div.lepopup-input ::placeholder{color:#555555; opacity: 0.9;} .lepopup-form-60 .lepopup-element div.lepopup-input ::-ms-input-placeholder{color:#555555; opacity: 0.9;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect::-webkit-scrollbar-thumb{background-color:#cccccc;}.lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-left, .lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-right{font-size:20px;color:#444444;border-radius:0px;}.lepopup-form-60 .lepopup-element .lepopup-button,.lepopup-form-60 .lepopup-element .lepopup-button:visited{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#ffffff;font-weight:700;font-style:normal;text-decoration:none;text-align:center;background-color:#326693;background-image:none;border-width:1px;border-style:solid;border-color:#326693;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label{border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label span.lepopup-imageselect-label{font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label:after{background-color:rgba(255, 255, 255, 0.7);}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]+label:hover{background-color:#bd4070;color:#ffffff;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]:checked+label{background-color:#a93a65;color:#ffffff;}.lepopup-form-60 .lepopup-element input[type=&#39;checkbox&#39;].lepopup-tile+label, .lepopup-form-60 .lepopup-element input[type=&#39;radio&#39;].lepopup-tile+label {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:center;background-color:#ffffff;background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element-error{font-size:15px;color:#ffffff;font-style:normal;text-decoration:none;text-align:left;background-color:#d9534f;background-image:none;}.lepopup-form-60 .lepopup-element-2 {background-color:rgba(226, 236, 250, 1);background-image:none;border-width:1px;border-style:solid;border-color:rgba(216, 216, 216, 1);border-radius:3px;box-shadow: 1px 1px 15px -6px #d7e1eb;}.lepopup-form-60 .lepopup-element-3 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-3 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-3 .lepopup-element-html-content {min-height:73px;}.lepopup-form-60 .lepopup-element-4 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-4 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-4 .lepopup-element-html-content {min-height:23px;}.lepopup-form-60 .lepopup-element-5 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-5 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-5 .lepopup-element-html-content {min-height:24px;}.lepopup-form-60 .lepopup-element-6 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-6 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-6 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-7 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-7 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-7 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-8 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-8 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-8 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-9 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-9 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-9 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-10 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-10 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-10 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-11 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-11 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-11 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-12 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-12 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-12 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-13 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-13 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-13 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-left, .lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-right {line-height:36px;}.lepopup-form-60 .lepopup-element-15 div.lepopup-input{height:auto;line-height:1;}.lepopup-form-60 .lepopup-element-16 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-16 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-16 .lepopup-element-html-content {min-height:5px;}.lepopup-form-60 .lepopup-element-19 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-19 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-19 .lepopup-element-html-content {min-height:363px;}.lepopup-form-60 .lepopup-element-0 * {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-0 {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:#5cb85c;background-image:none;border-width:0px;border-style:solid;border-color:#ccc;border-radius:5px;box-shadow: 1px 1px 15px -6px #000000;padding-top:40px;padding-right:40px;padding-bottom:40px;padding-left:40px;}.lepopup-form-60 .lepopup-element-0 .lepopup-element-html-content {min-height:160px;}&lt;/style&gt;&lt;div class=lepopup-inline style=&#34;margin: 0 auto;&#34;&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-KsDDmPTZcarpKFlz lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=KsDDmPTZcarpKFlz data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=1 data-xd=off data-width=820 data-height=430 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:820px;height:430px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:820px;height:430px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-2 lepopup-element-rectangle&#34; data-type=rectangle data-top=0 data-left=0 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:501;top:0px;left:0px;width:820px;height:430px;&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-3 lepopup-element-html&#34; data-type=html data-top=7 data-left=10 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:502;top:7px;left:10px;width:797px;height:73px;&gt;&lt;div class=lepopup-element-html-content&gt;Do you want to know how to develop your skillset to become a &lt;span style=&#34;color: #CAB43D; text-shadow: 1px 1px #835D5D;&#34;&gt;Java Rockstar?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-4 lepopup-element-html&#34; data-type=html data-top=83 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:503;top:83px;left:308px;width:473px;height:23px;&gt;&lt;div class=lepopup-element-html-content&gt;Subscribe to our newsletter to start Rocking &lt;span style=&#34;text-decoration: underline;&#34;&gt;right now!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-5 lepopup-element-html&#34; data-type=html data-top=107 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:504;top:107px;left:308px;width:473px;height:24px;&gt;&lt;div class=lepopup-element-html-content&gt;To get you started we give you our best selling eBooks for &lt;span style=&#34;color:#e01404; text-shadow: 1px 1px #C99924; font-size: 15px;&#34;&gt;FREE!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-6 lepopup-element-html&#34; data-type=html data-top=136 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:505;top:136px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;1.&lt;/span&gt; JPA Mini Book&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-7 lepopup-element-html&#34; data-type=html data-top=156 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:506;top:156px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;2.&lt;/span&gt; JVM Troubleshooting Guide&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-8 lepopup-element-html&#34; data-type=html data-top=176 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:507;top:176px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;3.&lt;/span&gt; JUnit Tutorial for Unit Testing&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-9 lepopup-element-html&#34; data-type=html data-top=196 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:508;top:196px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;4.&lt;/span&gt; Java Annotations Tutorial&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-10 lepopup-element-html&#34; data-type=html data-top=216 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:509;top:216px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;5.&lt;/span&gt; Java Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-11 lepopup-element-html&#34; data-type=html data-top=236 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:510;top:236px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;6.&lt;/span&gt; Spring Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-12 lepopup-element-html&#34; data-type=html data-top=256 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:511;top:256px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;7.&lt;/span&gt; Android UI Design&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-13 lepopup-element-html&#34; data-type=html data-top=282 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:512;top:282px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;and many more ....&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-14&#34; data-type=email data-deps data-id=14 data-top=305 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:513;top:305px;left:308px;width:473px;height:36px;&gt;&lt;div class=lepopup-input&gt;&lt;input type=email name=lepopup-14 class=lepopup-ta-left placeholder=&#34;Enter your e-mail...&#34; autocomplete=email data-default aria-label=&#34;Email Field&#34; oninput=lepopup_input_changed(this); onfocus=lepopup_input_error_hide(this);&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-15&#34; data-type=checkbox data-deps data-id=15 data-top=344 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:514;top:344px;left:308px;width:160px;&gt;&lt;div class=&#34;lepopup-input lepopup-cr-layout-1 lepopup-cr-layout-left&#34;&gt;&lt;div class=&#34;lepopup-cr-container lepopup-cr-container-medium lepopup-cr-container-left&#34;&gt;&lt;div class=lepopup-cr-box&gt;&lt;input class=&#34;lepopup-checkbox lepopup-checkbox-classic lepopup-checkbox-medium&#34; type=checkbox name=lepopup-15[] id=lepopup-checkbox-hVOJaQXT596qODoS-14-0 value=on data-default=off onchange=lepopup_input_changed(this);&gt;&lt;label for=lepopup-checkbox-hVOJaQXT596qODoS-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-cr-label lepopup-ta-left&#34;&gt;&lt;label for=lepopup-checkbox-hVOJaQXT596qODoS-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-16 lepopup-element-html&#34; data-type=html data-top=344 data-left=338 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:515;top:344px;left:338px;width:350px;height:5px;&gt;&lt;div class=lepopup-element-html-content&gt;I agree to the &lt;a href=https://www.javacodegeeks.com/about/terms-of-use target=_blank&gt;Terms&lt;/a&gt; and &lt;a href=https://www.javacodegeeks.com/about/privacy-policy target=_blank&gt;Privacy Policy&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-17&#34; data-type=button data-top=372 data-left=308 data-animation-in=bounceIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:516;top:372px;left:308px;width:85px;height:37px;&gt;&lt;a class=&#34;lepopup-button lepopup-button-zoom-out&#34; href=https://www.javacodegeeks.com/feed/ onclick=&#34;return lepopup_submit(this);&#34; data-label=&#34;Sign up&#34; data-loading=Loading...&gt;&lt;span&gt;Sign up&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-19 lepopup-element-html&#34; data-type=html data-top=67 data-left=-15 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:518;top:67px;left:-15px;width:320px;height:363px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png decoding=async data-src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png alt width=320 height=363&gt;&lt;noscript&gt;&lt;img decoding=async src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png alt width=320 height=363&gt;&lt;/noscript&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-KsDDmPTZcarpKFlz lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=KsDDmPTZcarpKFlz data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=confirmation data-xd=off data-width=420 data-height=320 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:420px;height:320px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:420px;height:320px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-0 lepopup-element-html&#34; data-type=html data-top=80 data-left=70 data-animation-in=bounceInDown data-animation-out=fadeOutUp style=animation-duration:1000ms;animation-delay:0ms;z-index:500;top:80px;left:70px;width:280px;height:160px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;h4 style=&#34;text-align: center; font-size: 18px; font-weight: bold;&#34;&gt;Thank you!&lt;/h4&gt;&lt;p style=&#34;text-align: center;&#34;&gt;We will contact you soon.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;input type=hidden id=lepopup-logic-KsDDmPTZcarpKFlz value=[]&gt;&lt;/div&gt;&lt;div class=&#34;post-bottom-meta post-bottom-tags post-tags-classic&#34;&gt;&lt;div class=post-bottom-meta-title&gt;&lt;span class=tie-icon-tags aria-hidden=true&gt;&lt;/span&gt;Tags&lt;/div&gt;&lt;span class=tagcloud&gt;&lt;a href=https://www.javacodegeeks.com/tag/actor-model rel=tag&gt;Actor Model&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/concurrency rel=tag&gt;Concurrency&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/erlang-akka rel=tag&gt;Erlang &amp;amp; Akka&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=post-extra-info&gt;&lt;div class=theiaStickySidebar&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=clearfix&gt;&lt;/div&gt;</description>
      <author>Eleftheria Drosopoulou</author>
      <guid>https://www.javacodegeeks.com/2026/08/the-actor-models-long-lineage-from-hewitts-1973-paper-to-kotlin-coroutines.html</guid>
      <pubDate>Mon, 24 Aug 2026 16:36:00 +0000</pubDate>
    </item>
    <item>
      <title>Containerize a Node.js App with Docker and Deploy with GitHub Actions</title>
      <link>https://www.javacodegeeks.com/containerize-a-node-js-app-with-docker-and-deploy-with-github-actions.html</link>
      <description>&lt;header class=entry-header-outer&gt;&lt;nav id=breadcrumb&gt;&lt;a href=https://www.javacodegeeks.com/&gt;&lt;span class=tie-icon-home aria-hidden=true&gt;&lt;/span&gt;Home&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;a href=https://www.javacodegeeks.com/category/web-development&gt;Web Development&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;a href=https://www.javacodegeeks.com/category/web-development/javascript&gt;JavaScript&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;a href=https://www.javacodegeeks.com/category/web-development/javascript/node-js&gt;Node.js&lt;/a&gt;&lt;em class=delimiter&gt;»&lt;/em&gt;&lt;span class=current&gt;Containerize a Node.js App with Docker and Deploy with GitHub Actions&lt;/span&gt;&lt;/nav&gt;&lt;div class=entry-header&gt;&lt;span class=post-cat-wrap&gt;&lt;a class=&#34;post-cat tie-cat-2096&#34; href=https://www.javacodegeeks.com/category/web-development/javascript/node-js&gt;Node.js&lt;/a&gt;&lt;/span&gt;&lt;h1 class=&#34;post-title entry-title&#34;&gt;Containerize a Node.js App with Docker and Deploy with GitHub Actions&lt;/h1&gt;&lt;/div&gt;&lt;/header&gt;&lt;div class=&#34;entry-content entry clearfix&#34;&gt;&lt;div class=&#34;stream-item stream-item-above-post-content&#34;&gt;&lt;div class=stream-item-size&gt;&lt;div id=adngin-in-post-0 style=&#34;float:left; margin-right:20px; margin-bottom:10px; width:300px; height:274px;&#34;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class=wp-block-paragraph&gt;Building an application is only one part of the software development process. Once an application is ready, it needs to be packaged, tested, distributed, and deployed consistently across different environments. Performing these tasks manually can quickly become repetitive and error-prone, especially when an application is updated frequently.&lt;p class=wp-block-paragraph&gt;Docker and GitHub Actions provide a practical solution to this problem. For example, Docker packages a Node.js application and its dependencies into a portable container image, while GitHub Actions automates the process of testing, building, and publishing that image. The deployment environment can then retrieve the newly published image and start the updated application automatically.&lt;p class=wp-block-paragraph&gt;In this article, we will build a workflow for a Node.js application. We will start by creating the application, containerize it with Docker, publish the image to Docker Hub, and then configure a GitHub Actions workflow that automatically builds and publishes a new image whenever changes are pushed to the GitHub repository.&lt;h2 class=wp-block-heading&gt;1. The Problem with Traditional Deployments&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;A traditional deployment often requires a developer to manually connect to a server, retrieve the latest source code, install dependencies, restart the application, and verify that everything is working correctly.&lt;p class=wp-block-paragraph&gt;This process may appear manageable for a small project. However, as an application evolves and deployments become more frequent, manual operations introduce unnecessary risk. We might forget to install a dependency, use the wrong Node.js version, leave an old process running, or deploy code that has not been tested properly.&lt;p class=wp-block-paragraph&gt;There is also the problem of environment differences. The development machine might use one Node.js version while the production server uses another. Operating system libraries, environment variables, filesystem configuration, and dependency versions can also differ.&lt;p class=wp-block-paragraph&gt;Docker addresses the environment problem by packaging the application with the runtime environment it requires. Instead of asking the production server to recreate the application’s environment manually, the server runs a Docker image containing the application and its required dependencies.&lt;p class=wp-block-paragraph&gt;CI/CD addresses another part of the problem: automation. Instead of manually testing and packaging every change, a pipeline can perform these operations whenever code is pushed to a particular branch. The result is a deployment process that is more consistent, repeatable, and easier to maintain.&lt;h2 class=wp-block-heading&gt;2. What is Docker and How It Works&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Docker provides a way to package applications into lightweight, isolated containers. A Docker container contains the application and the software required to run it, allowing the application to behave consistently across environments.&lt;p class=wp-block-paragraph&gt;There are several Docker concepts that are important for this article. A &lt;strong&gt;Dockerfile&lt;/strong&gt; describes how an application image should be built. A &lt;strong&gt;Docker image&lt;/strong&gt; is the packaged result of that build process. A &lt;strong&gt;container&lt;/strong&gt; is a running instance of an image. Finally, a &lt;strong&gt;container registry&lt;/strong&gt; stores images so that they can be downloaded by other systems.&lt;p class=wp-block-paragraph&gt;For example, we can build an image locally and run it as a container. The same image can then be pushed to Docker Hub and pulled onto a Virtual Private Server.&lt;p class=wp-block-paragraph&gt;This separation is useful because the server does not need to rebuild the application from source code. It simply downloads the already-built image and runs it.&lt;p class=wp-block-paragraph&gt;Docker images are also immutable in the sense that a particular image represents a specific application build. When a new version is created, a new image can be published. This makes it easier to identify which version is running and, when appropriate, roll back to an earlier image.&lt;h3 class=wp-block-heading&gt;Key Docker Concepts&lt;/h3&gt;&lt;p class=wp-block-paragraph&gt;&lt;strong&gt;Image&lt;/strong&gt;&lt;br&gt;A blueprint for creating containers. It is built from a Dockerfile.&lt;p class=wp-block-paragraph&gt;&lt;strong&gt;Container&lt;/strong&gt;&lt;br&gt;A running instance of an image.&lt;p class=wp-block-paragraph&gt;&lt;strong&gt;Dockerfile&lt;/strong&gt;&lt;br&gt;A script that defines how an image is built.&lt;p class=wp-block-paragraph&gt;&lt;strong&gt;Registry&lt;/strong&gt;&lt;br&gt;A storage location for Docker images (e.g., Docker Hub, GitHub Container Registry).&lt;h2 class=wp-block-heading&gt;3. Prerequisites&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;This tutorial assumes that the application will be developed locally, stored in a GitHub repository, published to Docker Hub, and eventually deployed to a Linux-based Virtual Private Server.&lt;p class=wp-block-paragraph&gt;You should have &lt;a href=https://nodejs.org/en target=_blank rel=&#34;noreferrer noopener&#34;&gt;Node.js&lt;/a&gt; and &lt;a href=https://www.npmjs.com/ target=_blank rel=&#34;noreferrer noopener&#34;&gt;npm&lt;/a&gt; installed locally, together with &lt;a href=https://www.docker.com/ target=_blank rel=&#34;noreferrer noopener&#34;&gt;Docker&lt;/a&gt; and &lt;a href=https://git-scm.com/ target=_blank rel=&#34;noreferrer noopener&#34;&gt;Git&lt;/a&gt;. You will also need a GitHub account and a Docker Hub account.&lt;p class=wp-block-paragraph&gt;For the deployment portion, you will need a VPS with Docker installed and SSH access configured. The exact VPS provider is not important because the deployment process relies primarily on SSH and Docker.&lt;p class=wp-block-paragraph&gt;It is also useful to have a basic understanding of Node.js, Express, Git, Docker commands, and YAML configuration files. You do not need previous experience with GitHub Actions because the workflow will be explained.&lt;h2 class=wp-block-heading&gt;4. Build a Production-Ready Node.js Application&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;The first step is to create the application that will eventually be placed inside a Docker container. Although the example application is intentionally small, the same principles can be applied to larger REST APIs and backend services.&lt;p class=wp-block-paragraph&gt;Create a new Node.js project and initialize npm.&lt;pre class=brush:bash&gt;mkdir node-docker-app &#xA;cd node-docker-app &#xA;npm init -y &#xA;npm install express&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;These commands create the project directory, initialize a Node.js project, and install Express as the application’s web framework. The resulting project will contain a &lt;code&gt;package.json&lt;/code&gt; file describing the application and its dependencies.&lt;p class=wp-block-paragraph&gt;Create an &lt;code&gt;index.js&lt;/code&gt; file containing the application logic.&lt;pre class=brush:javascript&gt;const express = require(&amp;#34;express&amp;#34;);&#xA;const app = express();&#xA;app.use(express.json());&#xA;&#xA;const PORT = process.env.PORT || 3000;&#xA;&#xA;app.get(&amp;#34;/&amp;#34;, (req, res) =&amp;gt; {&#xA;    res.json({&#xA;        message: &amp;#34;Hello from a Dockerized Node.js application&amp;#34;,&#xA;        environment: process.env.NODE_ENV || &amp;#34;development&amp;#34;&#xA;    });&#xA;});&#xA;&#xA;app.get(&amp;#34;/health&amp;#34;, (req, res) =&amp;gt; {&#xA;    res.status(200).json({&#xA;        status: &amp;#34;OK&amp;#34;&#xA;    });&#xA;});&#xA;&#xA;app.listen(PORT, () =&amp;gt; {&#xA;    console.log(`Server running on port ${PORT}`);&#xA;});&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;The application exposes two endpoints. The root endpoint provides a simple response that confirms the application is running, while &lt;code&gt;/health&lt;/code&gt; acts as a health endpoint that can be used by deployment and monitoring systems.&lt;p class=wp-block-paragraph&gt;Notice that the application obtains its port from the &lt;code&gt;PORT&lt;/code&gt; environment variable and falls back to port &lt;code&gt;3000&lt;/code&gt;. This is important for containerized applications because the same image can be deployed in environments where the application port is configured differently.&lt;p class=wp-block-paragraph&gt;Update the &lt;code&gt;package.json&lt;/code&gt; scripts:&lt;pre class=brush:javascript&gt;  &amp;#34;scripts&amp;#34;: {&#xA;    &amp;#34;start&amp;#34;: &amp;#34;node src/index.js&amp;#34;&#xA;  }&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;The &lt;code&gt;start&lt;/code&gt; script provides a standard command for launching the application. Docker and deployment environments can use this command rather than depending on a machine-specific startup process.&lt;p class=wp-block-paragraph&gt;Before introducing Docker, test the application locally:&lt;pre class=brush:bash&gt;npm start&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;Running the application locally first provides a useful baseline. If the application does not work before containerization, Docker is unlikely to solve the underlying application problem.&lt;h2 class=wp-block-heading&gt;5. Understanding the Dockerfile&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;The Dockerfile is the central configuration file used to transform the Node.js project into a Docker image. It describes the base image, working directory, dependencies, source files, exposed port, and command used to start the application.&lt;p class=wp-block-paragraph&gt;Create a file named &lt;code&gt;Dockerfile&lt;/code&gt; in the root of the project.&lt;pre class=brush:plain&gt;FROM node:20-alpine &#xA;&#xA;WORKDIR /app &#xA;&#xA;COPY package*.json ./ &#xA;&#xA;RUN npm ci --omit=dev&#xA;&#xA;COPY . . &#xA;&#xA;ENV NODE_ENV=production &#xA;&#xA;EXPOSE 3000 &#xA;&#xA;CMD [&amp;#34;node&amp;#34;, &amp;#34;src/index.js&amp;#34;]&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;The &lt;code&gt;FROM&lt;/code&gt; instruction selects the Node.js runtime used by the application. The Alpine variant provides a relatively small base image, which can reduce image size and transfer time.&lt;div style=&#34;display:inline-block; margin: 15px 0;&#34;&gt;&lt;div id=adngin-JavaCodeGeeks_incontent_video-0 style=display:inline-block;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;p class=wp-block-paragraph&gt;&lt;code&gt;WORKDIR&lt;/code&gt; establishes &lt;code&gt;/app&lt;/code&gt; as the working directory inside the container. The package files are copied before the rest of the source code so Docker can reuse the dependency installation layer when application source files change but the dependencies remain unchanged.&lt;p class=wp-block-paragraph&gt;&lt;code&gt;RUN npm ci --omit=dev&lt;/code&gt; installs the exact dependency versions recorded in &lt;code&gt;package-lock.json&lt;/code&gt; and excludes development dependencies. Development-only packages are excluded because they are not required to run the application in production.&lt;div class=tip&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;br&gt;The ordering of these instructions is important because Docker builds images in layers. Structuring the &lt;code&gt;Dockerfile&lt;/code&gt; properly allows Docker to reuse unchanged layers and significantly reduce build time.&lt;/div&gt;&lt;p class=wp-block-paragraph&gt;&lt;strong&gt;Optimizing with .dockerignore&lt;/strong&gt;&lt;p class=wp-block-paragraph&gt;Not every file in the project should be copied into the Docker build context. Local dependencies, Git metadata, logs, and development files are unnecessary for the production image.&lt;p class=wp-block-paragraph&gt;Create a &lt;code&gt;.dockerignore&lt;/code&gt; file:&lt;pre class=brush:plain&gt;node_modules &#xA;npm-debug.log &#xA;.git &#xA;.gitignore &#xA;Dockerfile &#xA;.dockerignore &#xA;.env&#xA;README.md&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;This configuration prevents unnecessary files from being sent to Docker during the build. In particular, excluding &lt;code&gt;node_modules&lt;/code&gt; is important because dependencies should be installed inside the image using the package manifest.&lt;p class=wp-block-paragraph&gt;The &lt;code&gt;.env&lt;/code&gt; file is also excluded because sensitive configuration should not be baked into the Docker image. Production secrets should instead be supplied through the deployment environment. Keeping the Docker build context small can improve build performance and reduce the possibility of accidentally exposing development files or sensitive information.&lt;h2 class=wp-block-heading&gt;6. Building and Running the Container&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;With the Dockerfile and &lt;code&gt;.dockerignore&lt;/code&gt; in place, the application can now be converted into a Docker image.&lt;p class=wp-block-paragraph&gt;Build the image with:&lt;pre class=brush:bash&gt;docker build -t node-docker-app .&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;The &lt;code&gt;docker build&lt;/code&gt; command reads the Dockerfile and creates an image. The &lt;code&gt;-t&lt;/code&gt; option assigns the image the name &lt;code&gt;node-docker-app&lt;/code&gt;, while the final period tells Docker to use the current directory as the build context.&lt;p class=wp-block-paragraph&gt;After building the image, start a container:&lt;pre class=brush:bash&gt;docker run -p 3000:3000 --name node-app node-docker-app&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;The &lt;code&gt;-p&lt;/code&gt; option maps port &lt;code&gt;3000&lt;/code&gt; on the host machine to port &lt;code&gt;3000&lt;/code&gt; inside the container. The &lt;code&gt;--name&lt;/code&gt; option gives the container a convenient name. The application can now be accessed through the host machine at port &lt;code&gt;3000&lt;/code&gt;.&lt;p class=wp-block-paragraph&gt;For a background process, the container can be started in detached mode:&lt;pre class=brush:bash&gt;docker run -d -p 3000:3000 --name node-app node-docker-app&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;The &lt;code&gt;-d&lt;/code&gt; option runs the container in the background. This is closer to how a container will normally run on a server. You can inspect the running container with:&lt;pre class=brush:bash&gt;docker ps&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;And stop it with:&lt;pre class=brush:bash&gt;docker stop node-app&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;These commands are useful during local development because they allow us to verify that the Docker image behaves correctly before introducing the CI/CD pipeline.&lt;p class=wp-block-paragraph&gt;&lt;strong&gt;Multi-Stage Builds for Smaller Images&lt;/strong&gt;&lt;p class=wp-block-paragraph&gt;For simple Node.js applications, a single-stage Dockerfile may be sufficient. Larger applications, however, can benefit from multi-stage builds. A multi-stage build allows the Dockerfile to use one stage for building the application and another stage for running it.&lt;pre class=brush:bash&gt;FROM node:20-alpine AS builder&#xA;&#xA;WORKDIR /app&#xA;&#xA;COPY package*.json ./&#xA;&#xA;RUN npm ci&#xA;&#xA;COPY src ./src&#xA;&#xA;&#xA;FROM node:20-alpine AS production&#xA;&#xA;WORKDIR /app&#xA;&#xA;COPY package*.json ./&#xA;&#xA;RUN npm ci --omit=dev&#xA;&#xA;COPY --from=builder /app/src ./src&#xA;&#xA;ENV NODE_ENV=production&#xA;&#xA;EXPOSE 3000&#xA;&#xA;CMD [&amp;#34;node&amp;#34;, &amp;#34;src/index.js&amp;#34;]&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;The first stage installs all dependencies and prepares the application. The second stage starts from a clean Node.js image and copies the application from the builder stage.&lt;p class=wp-block-paragraph&gt;The final image does not need to contain the tooling or development dependencies used during the build stage. This can reduce the size of the final image and decrease the amount of unnecessary software present in the production container.&lt;p class=wp-block-paragraph&gt;For applications that require compilation, TypeScript, frontend builds, or other build-time tooling, multi-stage Dockerfiles become particularly useful.&lt;h2 class=wp-block-heading&gt;7. Tagging and Pushing to a Registry&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;A locally built Docker image is not automatically available to a production server. The image needs to be published to a container registry that the deployment server can access.&lt;p class=wp-block-paragraph&gt;Docker Hub is one option for storing container images. First, authenticate with Docker Hub:&lt;pre class=brush:bash&gt;docker login&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;After authentication, tag the image using your Docker Hub repository name:&lt;pre class=brush:bash&gt;docker tag node-docker-app yourusername/node-docker-app:latest&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;The tag identifies where the image should be published. The &lt;code&gt;latest&lt;/code&gt; tag is commonly used for the most recent build, although version-specific tags are preferable for production deployments.&lt;p class=wp-block-paragraph&gt;Push the image:&lt;pre class=brush:bash&gt;docker push yourusername/node-docker-app:latest&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;Docker uploads the image layers to Docker Hub. Once the operation completes, another machine with permission to access the repository can pull the image.&lt;p class=wp-block-paragraph&gt;Version tags can also be used:&lt;pre class=brush:bash&gt;docker tag node-docker-app yourusername/node-docker-app:1.0.0 &#xA;docker push yourusername/node-docker-app:1.0.0&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;Versioned images make deployments easier to trace because a deployment can explicitly reference a known version instead of relying entirely on a moving &lt;code&gt;latest&lt;/code&gt; tag.&lt;h2 class=wp-block-heading&gt;8. Introduction to GitHub Actions CI/CD&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;At this point, the application can be containerized and published manually. The next step is to remove that manual work by introducing GitHub Actions. GitHub Actions provides automation directly within a GitHub repository. A workflow can respond to repository events, execute commands, run tests, build Docker images, and publish artifacts.&lt;p class=wp-block-paragraph&gt;The goal of this article is to create a workflow where we can edit the source code, commit the change, and push it to GitHub. Once the change reaches the configured branch, GitHub Actions takes over the repetitive deployment tasks.&lt;p class=wp-block-paragraph&gt;The complete process will be:&lt;p class=wp-block-paragraph&gt;&lt;strong&gt;Code Change → Git Commit → Git Push → Automated Tests → Docker Image Build → Docker Hub Publication → VPS Deployment&lt;/strong&gt;&lt;p class=wp-block-paragraph&gt;This approach turns the Git repository into the starting point for the deployment process.&lt;p class=wp-block-paragraph&gt;&lt;strong&gt;Creating the Workflow File&lt;/strong&gt;&lt;p class=wp-block-paragraph&gt;GitHub Actions workflows are YAML files stored inside the &lt;code&gt;.github/workflows&lt;/code&gt; directory of the repository. Create a file named &lt;code&gt;deploy.yml&lt;/code&gt;.&lt;pre class=brush:plain&gt;name: Node.js CI/CD&#xA;&#xA;on:&#xA;  push:&#xA;    branches:&#xA;      - main&#xA;&#xA;jobs:&#xA;  build-and-publish:&#xA;    runs-on: ubuntu-latest&#xA;&#xA;    steps:&#xA;      - name: Checkout source code&#xA;        uses: actions/checkout@v4&#xA;&#xA;      - name: Set up Node.js&#xA;        uses: actions/setup-node@v4&#xA;        with:&#xA;          node-version: 20&#xA;&#xA;      - name: Install dependencies&#xA;        run: npm ci&#xA;&#xA;      - name: Log in to Docker Hub&#xA;        uses: docker/login-action@v3&#xA;        with:&#xA;          username: ${{ secrets.DOCKER_USERNAME }}&#xA;          password: ${{ secrets.DOCKER_PASSWORD }}&#xA;&#xA;      - name: Build Docker image&#xA;        run: docker build -t ${{ secrets.DOCKER_USERNAME }}/node-docker-app:latest .&#xA;&#xA;      - name: Push Docker image&#xA;        run: docker push ${{ secrets.DOCKER_USERNAME }}/node-docker-app:latest&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;This workflow is triggered whenever code is pushed to the &lt;code&gt;main&lt;/code&gt; branch. GitHub creates an Ubuntu-based runner and executes the defined steps sequentially.&lt;p class=wp-block-paragraph&gt;The first step checks out the repository so that the workflow has access to the Node.js source code, &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;package-lock.json&lt;/code&gt;, &lt;code&gt;Dockerfile&lt;/code&gt;, and other project files.&lt;p class=wp-block-paragraph&gt;The Node.js setup step configures Node.js 20 on the GitHub Actions runner. The &lt;code&gt;npm ci&lt;/code&gt; command then installs the dependencies specified by &lt;code&gt;package-lock.json&lt;/code&gt;. Using &lt;code&gt;npm ci&lt;/code&gt; is appropriate for CI environments because it provides a clean and reproducible dependency installation.&lt;p class=wp-block-paragraph&gt;After the dependencies are installed, the workflow authenticates with Docker Hub using credentials stored as GitHub Actions secrets. It then builds the Docker image using the &lt;code&gt;Dockerfile&lt;/code&gt; located in the project root.&lt;p class=wp-block-paragraph&gt;The image is tagged using the Docker Hub username stored in &lt;code&gt;DOCKER_USERNAME&lt;/code&gt;:&lt;pre class=brush:plain&gt;yourusername/node-docker-app:latest&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;Finally, &lt;code&gt;docker push&lt;/code&gt; publishes the image to Docker Hub. At this point, the newly built image is available for the deployment environment to retrieve.&lt;p class=wp-block-paragraph&gt;At this stage, the project should have a structure similar to the following:&lt;pre class=brush:plain&gt;node-docker-app/&#xA;├── .github/&#xA;│   └── workflows/&#xA;│       └── deploy.yml&#xA;├── src/&#xA;│   └── index.js&#xA;├── .dockerignore&#xA;├── .env&#xA;├── .gitignore&#xA;├── Dockerfile&#xA;├── package.json&#xA;└── package-lock.json&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;The &lt;code&gt;src&lt;/code&gt; directory contains the Node.js application, while the &lt;code&gt;Dockerfile&lt;/code&gt; describes how the application is packaged into a container. The &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt; file contains the CI/CD workflow that GitHub Actions will execute.&lt;p class=wp-block-paragraph&gt;&lt;strong&gt;Managing Secrets Securely&lt;/strong&gt;&lt;p class=wp-block-paragraph&gt;A CI/CD pipeline frequently needs access to credentials, API keys, SSH keys, and other sensitive configuration. These values should never be committed directly to the repository. Docker Hub credentials are used by the GitHub Actions workflow to authenticate with Docker Hub before building and publishing the image.&lt;p class=wp-block-paragraph&gt;Go to:&lt;p class=wp-block-paragraph&gt;&lt;strong&gt;GitHub repository → Settings → Secrets and variables → Actions → Secrets → New repository secret&lt;/strong&gt;&lt;p class=wp-block-paragraph&gt;Add these two secrets:&lt;figure class=&#34;wp-block-table is-style-stripes&#34;&gt;&lt;table class=has-fixed-layout&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Secret&lt;th&gt;Value&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;DOCKER_USERNAME&lt;td&gt;Your Docker Hub username&lt;tr&gt;&lt;td&gt;DOCKER_PASSWORD&lt;td&gt;Your Docker Hub access token&lt;/table&gt;&lt;/figure&gt;&lt;p class=wp-block-paragraph&gt;GitHub injects these values into the workflow when it runs without requiring them to appear in the source code. For a VPS deployment, additional secrets will be required, such as the server hostname, username, and SSH private key. This separation is important because the workflow definition can remain in the repository while sensitive credentials remain protected by the GitHub Actions secrets mechanism.&lt;p class=wp-block-paragraph&gt;&lt;strong&gt;Commit and Push the Workflow&lt;/strong&gt;&lt;p class=wp-block-paragraph&gt;After creating the workflow file, stage it, create a commit with and push the changes to the &lt;code&gt;main&lt;/code&gt; branch using:&lt;pre class=brush:bash&gt;git add .&#xA;git commit -m &amp;#34;Add GitHub Actions CI/CD workflow&amp;#34;&#xA;git push origin main&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;The push to &lt;code&gt;main&lt;/code&gt; is what triggers the GitHub Actions workflow.&lt;p class=wp-block-paragraph&gt;After pushing the workflow, open the GitHub repository in your browser and select the &lt;strong&gt;Actions&lt;/strong&gt; tab. You should see a workflow named: &lt;code&gt;Node.js CI/CD&lt;/code&gt;.&lt;p class=wp-block-paragraph&gt;Click the workflow run to see the individual steps being executed. A successful run should show steps similar to:&lt;div class=wp-block-image&gt;&lt;figure class=&#34;aligncenter size-large&#34;&gt;&lt;a href=https://www.javacodegeeks.com/wp-content/uploads/2026/08/github-action-screenshot.png&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/github-action-screenshot-1024x629.png fetchpriority=high decoding=async width=1024 height=629 data-src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/github-action-screenshot-1024x629.png alt=&#34;Figure 1: GitHub Actions workflow for containerizing a Node.js application with Docker and deploying it automatically.&#34; class=wp-image-145076 data-srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/github-action-screenshot-1024x629.png 1024w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/github-action-screenshot-300x184.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/github-action-screenshot-768x471.png 768w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/github-action-screenshot.png 1440w&#34; data-sizes=&#34;(max-width: 1024px) 100vw, 1024px&#34;&gt;&lt;noscript&gt;&lt;img fetchpriority=high decoding=async width=1024 height=629 src=https://www.javacodegeeks.com/wp-content/uploads/2026/08/github-action-screenshot-1024x629.png alt=&#34;Figure 1: GitHub Actions workflow for containerizing a Node.js application with Docker and deploying it automatically.&#34; class=wp-image-145076 srcset=&#34;https://www.javacodegeeks.com/wp-content/uploads/2026/08/github-action-screenshot-1024x629.png 1024w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/github-action-screenshot-300x184.png 300w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/github-action-screenshot-768x471.png 768w, https://www.javacodegeeks.com/wp-content/uploads/2026/08/github-action-screenshot.png 1440w&#34; sizes=&#34;(max-width: 1024px) 100vw, 1024px&#34;&gt;&lt;/noscript&gt;&lt;/a&gt;&lt;figcaption class=wp-element-caption&gt;Figure 1: GitHub Actions workflow for containerizing a Node.js application with Docker and deploying it automatically.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p class=wp-block-paragraph&gt;Once the workflow completes successfully, open your Docker Hub repository. You should see: &lt;code&gt;node-docker-app:latest&lt;/code&gt;. This confirms that GitHub Actions successfully built the Docker image and published it to Docker Hub.&lt;p class=wp-block-paragraph&gt;At this point, the CI portion of the pipeline is working. The next stage is to configure the Virtual Private Server so that it can pull the newly published Docker image and automatically restart the application whenever a new image is available.&lt;h2 class=wp-block-heading&gt;9. Deploying the Docker Image to a VPS&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;Once GitHub Actions has successfully built the Docker image and published it to Docker Hub, the image can be deployed to a Virtual Private Server or another Docker-enabled server. The server does not need the application source code because it can retrieve the already-built image directly from Docker Hub.&lt;p class=wp-block-paragraph&gt;First, connect to your VPS through SSH and pull the latest image:&lt;pre class=brush:bash&gt;docker pull yourusername/node-docker-app:latest&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;Replace &lt;code&gt;yourusername&lt;/code&gt; with your actual Docker Hub username. The &lt;code&gt;docker pull&lt;/code&gt; command downloads the image published by the GitHub Actions workflow to the server.&lt;p class=wp-block-paragraph&gt;Once the image has been downloaded, Docker has everything required to start the application without needing to clone the GitHub repository or install Node.js directly on the VPS.&lt;p class=wp-block-paragraph&gt;After pulling the image, start the application with:&lt;pre class=brush:bash&gt;docker run -d \&#xA;  --name node-app \&#xA;  -p 3000:3000 \&#xA;  -e NODE_ENV=production \&#xA;  -e PORT=3000 \&#xA;  yourusername/node-docker-app:latest&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;When a new version of the application is pushed to &lt;code&gt;main&lt;/code&gt;, GitHub Actions builds a new Docker image and publishes it to Docker Hub. The VPS can then retrieve the latest image and replace the currently running container.&lt;h2 class=wp-block-heading&gt;10. Using Docker Compose for Better Management&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;As the application grows, managing containers with long &lt;code&gt;docker run&lt;/code&gt; commands can become difficult, especially when environment variables, restart policies, volumes, and networking need to be configured. Docker Compose provides a cleaner way to define the application’s container configuration in a YAML file and manage the container with simple commands.&lt;p class=wp-block-paragraph&gt;Create a &lt;code&gt;compose.yml&lt;/code&gt; file in the project root:&lt;pre class=brush:plain&gt;services:&#xA;  app:&#xA;    image: yourusername/node-docker-app:latest&#xA;    container_name: node-app&#xA;    ports:&#xA;      - &amp;#34;3000:3000&amp;#34;&#xA;    environment:&#xA;      NODE_ENV: production&#xA;      PORT: 3000&#xA;    restart: unless-stopped&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;The &lt;code&gt;image&lt;/code&gt; property specifies the Docker image that Docker Compose should run, while &lt;code&gt;container_name&lt;/code&gt; gives the container a predictable name.&lt;p class=wp-block-paragraph&gt;The &lt;code&gt;ports&lt;/code&gt; configuration maps port &lt;code&gt;3000&lt;/code&gt; on the VPS to port &lt;code&gt;3000&lt;/code&gt; inside the container. The &lt;code&gt;environment&lt;/code&gt; section supplies the production environment variables used by the Node.js application.&lt;p class=wp-block-paragraph&gt;The &lt;code&gt;restart: unless-stopped&lt;/code&gt; policy tells Docker to automatically restart the container if it stops unexpectedly or if the VPS is restarted. The container will remain stopped only when it has been explicitly stopped by the administrator.&lt;p class=wp-block-paragraph&gt;The application can then be started with:&lt;pre class=brush:bash&gt;docker compose up -d&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;&lt;strong&gt;Health Checks and Monitoring&lt;/strong&gt;&lt;p class=wp-block-paragraph&gt;A running Docker container does not necessarily mean that the application inside it is functioning correctly. The Node.js process could stop responding while the container itself remains running, which is why a health check is useful. The &lt;code&gt;/health&lt;/code&gt; endpoint already implemented in this application provides a simple way to verify that the Express server is responding.&lt;p class=wp-block-paragraph&gt;Docker Compose can use this endpoint to determine whether the application is healthy. Add a &lt;code&gt;healthcheck&lt;/code&gt; configuration to the Compose file:&lt;pre class=brush:plain&gt;services:&#xA;  app:&#xA;    image: yourusername/node-docker-app:latest&#xA;    container_name: node-app&#xA;    ports:&#xA;      - &amp;#34;3000:3000&amp;#34;&#xA;    environment:&#xA;      NODE_ENV: production&#xA;      PORT: 3000&#xA;    restart: unless-stopped&#xA;    healthcheck:&#xA;      test: [&amp;#34;CMD&amp;#34;, &amp;#34;wget&amp;#34;, &amp;#34;--spider&amp;#34;, &amp;#34;-q&amp;#34;, &amp;#34;http://localhost:3000/health&amp;#34;]&#xA;      interval: 30s&#xA;      timeout: 10s&#xA;      retries: 3&#xA;      start_period: 10s&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;The &lt;code&gt;healthcheck&lt;/code&gt; instructs Docker to periodically request the application’s &lt;code&gt;/health&lt;/code&gt; endpoint. The &lt;code&gt;interval&lt;/code&gt; determines how frequently the check runs, while &lt;code&gt;timeout&lt;/code&gt; specifies how long Docker waits for a response.&lt;p class=wp-block-paragraph&gt;The &lt;code&gt;retries&lt;/code&gt; property specifies how many consecutive failures are required before Docker considers the container unhealthy. The &lt;code&gt;start_period&lt;/code&gt; gives the Node.js application a short amount of time to start before health checks begin counting failures.&lt;p class=wp-block-paragraph&gt;You can check the health status with:&lt;pre class=brush:bash&gt;docker compose ps&#xA;&lt;/pre&gt;&lt;p class=wp-block-paragraph&gt;A healthy container should show a status similar to:&lt;pre class=brush:plain&gt;NAME        IMAGE                              STATUS&#xA;node-app    yourusername/node-docker-app:latest   Up ... (healthy)&#xA;&lt;/pre&gt;&lt;h2 class=wp-block-heading&gt;11. Conclusion&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;In this article, we explored how to containerize a Node.js application with Docker and build a CI/CD pipeline using GitHub Actions. We started by creating a Dockerfile for the Node.js application and used a multi-stage build to separate the application preparation process from the production runtime image. We then configured environment variables, built and tested the Docker image locally, and published the image to Docker Hub through an automated GitHub Actions workflow.&lt;p class=wp-block-paragraph&gt;We also covered how the published Docker image can be deployed to a Virtual Private Server and managed using Docker Compose. The deployment process can pull new images from Docker Hub and recreate the running container with the latest application version. Finally, we added a health-check endpoint and Docker health checks to provide a simple way to verify that the application is running correctly.&lt;p class=wp-block-paragraph&gt;The resulting workflow provides a foundation for continuous delivery: we push changes to GitHub, GitHub Actions builds the Docker image and publishes it to Docker Hub, and the VPS can retrieve and run the latest version.&lt;h2 class=wp-block-heading&gt;12. Download the Source Code&lt;/h2&gt;&lt;p class=wp-block-paragraph&gt;This article explored the process of packaging a Node.js application with Docker and deploying it using &lt;a href=https://www.javacodegeeks.com/2023/11/github-actions-vs-traditional-build-servers-a-modern-approach-to-continuous-integration-and-deployment.html target=_blank rel=&#34;noreferrer noopener&#34;&gt;GitHub Actions&lt;/a&gt;.&lt;div class=download&gt;&lt;strong&gt;Download&lt;/strong&gt;&lt;br&gt;You can download the full source code of this example here: &lt;a href=https://www.javacodegeeks.com/wp-content/uploads/2026/08/node-docker-app.zip&gt;&lt;strong&gt;containerize a node js app with docker and deploy with github actions&lt;/strong&gt;&lt;/a&gt;&lt;/div&gt;&lt;style&gt;.lepopup-progress-60 div.lepopup-progress-t1&gt;div{background-color:#e0e0e0;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{background-color:#bd4070;}.lepopup-progress-60 div.lepopup-progress-t1&gt;div&gt;div{color:#ffffff;}.lepopup-progress-60 div.lepopup-progress-t1&gt;label{color:#444444;}.lepopup-form-60, .lepopup-form-60 *, .lepopup-progress-60 {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box span i{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-signature-box,.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;text&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;email&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;password&#39;],.lepopup-form-60 .lepopup-element div.lepopup-input select,.lepopup-form-60 .lepopup-element div.lepopup-input select option,.lepopup-form-60 .lepopup-element div.lepopup-input textarea{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#555555;font-style:normal;text-decoration:none;text-align:left;background-color:rgba(255, 255, 255, 0.7);background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow: inset 0px 0px 15px -7px #000000;}.lepopup-form-60 .lepopup-element div.lepopup-input ::placeholder{color:#555555; opacity: 0.9;} .lepopup-form-60 .lepopup-element div.lepopup-input ::-ms-input-placeholder{color:#555555; opacity: 0.9;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect::-webkit-scrollbar-thumb{background-color:#cccccc;}.lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-left, .lepopup-form-60 .lepopup-element div.lepopup-input&gt;i.lepopup-icon-right{font-size:20px;color:#444444;border-radius:0px;}.lepopup-form-60 .lepopup-element .lepopup-button,.lepopup-form-60 .lepopup-element .lepopup-button:visited{font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#ffffff;font-weight:700;font-style:normal;text-decoration:none;text-align:center;background-color:#326693;background-image:none;border-width:1px;border-style:solid;border-color:#326693;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label{border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element div.lepopup-input .lepopup-imageselect+label span.lepopup-imageselect-label{font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label:after{background-color:rgba(255, 255, 255, 0.7);}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-square:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl:checked+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;checkbox&#39;].lepopup-checkbox-tgl+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-classic+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-fa-check+label,.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot+label{background-color:rgba(255, 255, 255, 0.7);border-color:#cccccc;color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input input[type=&#39;radio&#39;].lepopup-radio-dot:checked+label:after{background-color:#555555;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]+label:hover{background-color:#bd4070;color:#ffffff;}.lepopup-form-60 .lepopup-element div.lepopup-input div.lepopup-multiselect&gt;input[type=&#39;checkbox&#39;]:checked+label{background-color:#a93a65;color:#ffffff;}.lepopup-form-60 .lepopup-element input[type=&#39;checkbox&#39;].lepopup-tile+label, .lepopup-form-60 .lepopup-element input[type=&#39;radio&#39;].lepopup-tile+label {font-size:15px;color:#444444;font-style:normal;text-decoration:none;text-align:center;background-color:#ffffff;background-image:none;border-width:1px;border-style:solid;border-color:#cccccc;border-radius:0px;box-shadow:none;}.lepopup-form-60 .lepopup-element-error{font-size:15px;color:#ffffff;font-style:normal;text-decoration:none;text-align:left;background-color:#d9534f;background-image:none;}.lepopup-form-60 .lepopup-element-2 {background-color:rgba(226, 236, 250, 1);background-image:none;border-width:1px;border-style:solid;border-color:rgba(216, 216, 216, 1);border-radius:3px;box-shadow: 1px 1px 15px -6px #d7e1eb;}.lepopup-form-60 .lepopup-element-3 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-3 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:26px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-3 .lepopup-element-html-content {min-height:73px;}.lepopup-form-60 .lepopup-element-4 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-4 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:19px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-4 .lepopup-element-html-content {min-height:23px;}.lepopup-form-60 .lepopup-element-5 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-5 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-5 .lepopup-element-html-content {min-height:24px;}.lepopup-form-60 .lepopup-element-6 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-6 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-6 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-7 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-7 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-7 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-8 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-8 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-8 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-9 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-9 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-9 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-10 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-10 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-10 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-11 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-11 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-11 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-12 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-12 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-12 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-13 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-13 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:15px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-13 .lepopup-element-html-content {min-height:18px;}.lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-left, .lepopup-form-60 .lepopup-element-14 div.lepopup-input .lepopup-icon-right {line-height:36px;}.lepopup-form-60 .lepopup-element-15 div.lepopup-input{height:auto;line-height:1;}.lepopup-form-60 .lepopup-element-16 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-16 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:14px;color:#333333;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-16 .lepopup-element-html-content {min-height:5px;}.lepopup-form-60 .lepopup-element-19 * {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-19 {font-family:&#39;Arial&#39;,&#39;arial&#39;;font-size:13px;color:#333333;font-style:normal;text-decoration:none;text-align:left;background-color:transparent;background-image:none;border-width:1px;border-style:none;border-color:transparent;border-radius:0px;box-shadow:none;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.lepopup-form-60 .lepopup-element-19 .lepopup-element-html-content {min-height:363px;}.lepopup-form-60 .lepopup-element-0 * {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;}.lepopup-form-60 .lepopup-element-0 {font-size:15px;color:#ffffff;font-weight:normal;font-style:normal;text-decoration:none;text-align:left;background-color:#5cb85c;background-image:none;border-width:0px;border-style:solid;border-color:#ccc;border-radius:5px;box-shadow: 1px 1px 15px -6px #000000;padding-top:40px;padding-right:40px;padding-bottom:40px;padding-left:40px;}.lepopup-form-60 .lepopup-element-0 .lepopup-element-html-content {min-height:160px;}&lt;/style&gt;&lt;div class=lepopup-inline style=&#34;margin: 0 auto;&#34;&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-P8elDuTqF2SGfpie lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=P8elDuTqF2SGfpie data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=1 data-xd=off data-width=820 data-height=430 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:820px;height:430px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:820px;height:430px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-2 lepopup-element-rectangle&#34; data-type=rectangle data-top=0 data-left=0 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:501;top:0px;left:0px;width:820px;height:430px;&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-3 lepopup-element-html&#34; data-type=html data-top=7 data-left=10 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:502;top:7px;left:10px;width:797px;height:73px;&gt;&lt;div class=lepopup-element-html-content&gt;Do you want to know how to develop your skillset to become a &lt;span style=&#34;color: #CAB43D; text-shadow: 1px 1px #835D5D;&#34;&gt;Java Rockstar?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-4 lepopup-element-html&#34; data-type=html data-top=83 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:503;top:83px;left:308px;width:473px;height:23px;&gt;&lt;div class=lepopup-element-html-content&gt;Subscribe to our newsletter to start Rocking &lt;span style=&#34;text-decoration: underline;&#34;&gt;right now!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-5 lepopup-element-html&#34; data-type=html data-top=107 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:504;top:107px;left:308px;width:473px;height:24px;&gt;&lt;div class=lepopup-element-html-content&gt;To get you started we give you our best selling eBooks for &lt;span style=&#34;color:#e01404; text-shadow: 1px 1px #C99924; font-size: 15px;&#34;&gt;FREE!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-6 lepopup-element-html&#34; data-type=html data-top=136 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:505;top:136px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;1.&lt;/span&gt; JPA Mini Book&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-7 lepopup-element-html&#34; data-type=html data-top=156 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:506;top:156px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;2.&lt;/span&gt; JVM Troubleshooting Guide&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-8 lepopup-element-html&#34; data-type=html data-top=176 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:507;top:176px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;3.&lt;/span&gt; JUnit Tutorial for Unit Testing&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-9 lepopup-element-html&#34; data-type=html data-top=196 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:508;top:196px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;4.&lt;/span&gt; Java Annotations Tutorial&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-10 lepopup-element-html&#34; data-type=html data-top=216 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:509;top:216px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;5.&lt;/span&gt; Java Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-11 lepopup-element-html&#34; data-type=html data-top=236 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:510;top:236px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;6.&lt;/span&gt; Spring Interview Questions&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-12 lepopup-element-html&#34; data-type=html data-top=256 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:511;top:256px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;span style=&#34;font-weight: bold;&#34;&gt;7.&lt;/span&gt; Android UI Design&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-13 lepopup-element-html&#34; data-type=html data-top=282 data-left=308 data-animation-in=bounceInDown data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:512;top:282px;left:308px;width:473px;height:18px;&gt;&lt;div class=lepopup-element-html-content&gt;and many more ....&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-14&#34; data-type=email data-deps data-id=14 data-top=305 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:513;top:305px;left:308px;width:473px;height:36px;&gt;&lt;div class=lepopup-input&gt;&lt;input type=email name=lepopup-14 class=lepopup-ta-left placeholder=&#34;Enter your e-mail...&#34; autocomplete=email data-default aria-label=&#34;Email Field&#34; oninput=lepopup_input_changed(this); onfocus=lepopup_input_error_hide(this);&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-15&#34; data-type=checkbox data-deps data-id=15 data-top=344 data-left=308 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:514;top:344px;left:308px;width:160px;&gt;&lt;div class=&#34;lepopup-input lepopup-cr-layout-1 lepopup-cr-layout-left&#34;&gt;&lt;div class=&#34;lepopup-cr-container lepopup-cr-container-medium lepopup-cr-container-left&#34;&gt;&lt;div class=lepopup-cr-box&gt;&lt;input class=&#34;lepopup-checkbox lepopup-checkbox-classic lepopup-checkbox-medium&#34; type=checkbox name=lepopup-15[] id=lepopup-checkbox-UGlSK9o1GhBTGIZj-14-0 value=on data-default=off onchange=lepopup_input_changed(this);&gt;&lt;label for=lepopup-checkbox-UGlSK9o1GhBTGIZj-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-cr-label lepopup-ta-left&#34;&gt;&lt;label for=lepopup-checkbox-UGlSK9o1GhBTGIZj-14-0 onclick=lepopup_input_error_hide(this);&gt;&lt;/label&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-16 lepopup-element-html&#34; data-type=html data-top=344 data-left=338 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:515;top:344px;left:338px;width:350px;height:5px;&gt;&lt;div class=lepopup-element-html-content&gt;I agree to the &lt;a href=https://www.javacodegeeks.com/about/terms-of-use target=_blank&gt;Terms&lt;/a&gt; and &lt;a href=https://www.javacodegeeks.com/about/privacy-policy target=_blank&gt;Privacy Policy&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-17&#34; data-type=button data-top=372 data-left=308 data-animation-in=bounceIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:516;top:372px;left:308px;width:85px;height:37px;&gt;&lt;a class=&#34;lepopup-button lepopup-button-zoom-out&#34; href=https://www.javacodegeeks.com/feed/ onclick=&#34;return lepopup_submit(this);&#34; data-label=&#34;Sign up&#34; data-loading=Loading...&gt;&lt;span&gt;Sign up&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-element lepopup-element-19 lepopup-element-html&#34; data-type=html data-top=67 data-left=-15 data-animation-in=fadeIn data-animation-out=fadeOut style=animation-duration:0ms;animation-delay:0ms;z-index:518;top:67px;left:-15px;width:320px;height:363px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;img data-lazyloaded=1 src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png decoding=async data-src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png alt width=320 height=363&gt;&lt;noscript&gt;&lt;img decoding=async src=https://www.javacodegeeks.com/wp-content/uploads/2015/01/books_promo.png alt width=320 height=363&gt;&lt;/noscript&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;lepopup-form lepopup-form-60 lepopup-form-P8elDuTqF2SGfpie lepopup-form-icon-inside lepopup-form-position-middle-right&#34; data-session=0 data-id=P8elDuTqF2SGfpie data-form-id=60 data-slug=7lQM6oyWL5bTm5lw data-title=&#34;Under the Post Inline&#34; data-page=confirmation data-xd=off data-width=420 data-height=320 data-position=middle-right data-esc=off data-enter=on data-disable-scrollbar=off style=display:none;width:420px;height:320px; onclick=event.stopPropagation();&gt;&lt;div class=lepopup-form-inner style=width:420px;height:320px;&gt;&lt;div class=&#34;lepopup-element lepopup-element-0 lepopup-element-html&#34; data-type=html data-top=80 data-left=70 data-animation-in=bounceInDown data-animation-out=fadeOutUp style=animation-duration:1000ms;animation-delay:0ms;z-index:500;top:80px;left:70px;width:280px;height:160px;&gt;&lt;div class=lepopup-element-html-content&gt;&lt;h4 style=&#34;text-align: center; font-size: 18px; font-weight: bold;&#34;&gt;Thank you!&lt;/h4&gt;&lt;p style=&#34;text-align: center;&#34;&gt;We will contact you soon.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;input type=hidden id=lepopup-logic-P8elDuTqF2SGfpie value=[]&gt;&lt;/div&gt;&lt;div class=&#34;post-bottom-meta post-bottom-tags post-tags-classic&#34;&gt;&lt;div class=post-bottom-meta-title&gt;&lt;span class=tie-icon-tags aria-hidden=true&gt;&lt;/span&gt;Tags&lt;/div&gt;&lt;span class=tagcloud&gt;&lt;a href=https://www.javacodegeeks.com/tag/ci-cd rel=tag&gt;CI/CD&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/containerization rel=tag&gt;Containerization&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/continuous-deployment rel=tag&gt;Continuous Deployment&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/continuous-integration rel=tag&gt;Continuous Integration&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/devops rel=tag&gt;DevOps&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/docker rel=tag&gt;Docker&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/docker-hub rel=tag&gt;Docker Hub&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/github rel=tag&gt;GitHub&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/github-actions rel=tag&gt;GitHub Actions&lt;/a&gt; &lt;a href=https://www.javacodegeeks.com/tag/node-js rel=tag&gt;Node.js&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=post-extra-info&gt;&lt;div class=theiaStickySidebar&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=clearfix&gt;&lt;/div&gt;</description>
      <author>Omozegie Aziegbe</author>
      <guid>https://www.javacodegeeks.com/containerize-a-node-js-app-with-docker-and-deploy-with-github-actions.html</guid>
      <pubDate>Mon, 24 Aug 2026 16:20:42 +0000</pubDate>
    </item>
  </channel>
</rss>