{"id":263655,"date":"2025-09-29T11:19:13","date_gmt":"2025-09-29T11:19:13","guid":{"rendered":"https:\/\/www.europesays.com\/us\/263655\/"},"modified":"2025-09-29T11:19:13","modified_gmt":"2025-09-29T11:19:13","slug":"java-news-roundup-new-jeps-liberica-nik-spring-ai-milestone-open-liberty-jobrunr-langchain4j","status":"publish","type":"post","link":"https:\/\/www.europesays.com\/us\/263655\/","title":{"rendered":"Java News Roundup: New JEPs, Liberica NIK, Spring AI Milestone, Open Liberty, JobRunr, LangChain4j"},"content":{"rendered":"<p>This week&#8217;s Java roundup for September 22nd, 2025, features news highlighting: new OpenJDK JEPs Lazy Constants (Second Preview) and Structured Concurrency (Sixth Preview); BellSoft Liberica Native Image Toolkit 25; the October 2025 edition of Open Liberty; the second milestone release of Spring AI 1.1.0; and point releases of JobRunr, LangChain4j and Quarkus.<\/p>\n<p>OpenJDK<\/p>\n<p>JEP 526, <a href=\"https:\/\/openjdk.org\/jeps\/526\" rel=\"nofollow noopener\" target=\"_blank\">Lazy Constants (Second Preview)<\/a>, has been <a href=\"https:\/\/mail.openjdk.org\/pipermail\/jdk-dev\/2025-September\/010501.html\" rel=\"nofollow noopener\" target=\"_blank\">elevated<\/a> from its <strong>JEP Draft 8359894<\/strong> to <strong>Candidate<\/strong> status. Formerly known as Stable Values and Computed Constants, this JEP proposes a second preview, with changes, after the first round of preview, namely: JEP 502, <a href=\"https:\/\/openjdk.org\/jeps\/502\" rel=\"nofollow noopener\" target=\"_blank\">Stable Values (Preview)<\/a>, for JDK 26. This feature introduces the concept of computed constants, defined as immutable value holders that are initialized at most once. This offers the performance and safety benefits of <strong>final<\/strong> fields, while offering greater flexibility as to the timing of initialization. Revisions for this JEP include: the name change from Stable Values to Lazy Constants as the new name better captures the intent of a high-level use case; and enhanced discoverability.<\/p>\n<p>JEP 525, <a href=\"https:\/\/openjdk.org\/jeps\/525\" rel=\"nofollow noopener\" target=\"_blank\">Structured Concurrency (Sixth Preview)<\/a>, has been <a href=\"https:\/\/mail.openjdk.org\/pipermail\/jdk-dev\/2025-September\/010492.html\" rel=\"nofollow noopener\" target=\"_blank\">elevated<\/a> from its <strong>JEP Draft 8366891<\/strong> to <strong>Candidate<\/strong> status. This JEP proposes a sixth preview after five rounds of previous preview delivered in JDK 19 through JDK 25. This feature simplifies concurrent programming by introducing the concept of structured concurrency to &#8220;treat groups of related tasks running in different threads as a single unit of work, thereby streamlining error handling and cancellation, improving reliability, and enhancing observability.&#8221; The only significant change is the addition of a <strong>onTimeout()<\/strong> method to the <strong><a href=\"https:\/\/cr.openjdk.org\/~alanb\/sc-jdk26\/api\/java.base\/java\/util\/concurrent\/StructuredTaskScope.Joiner.html\" rel=\"nofollow noopener\" target=\"_blank\">StructuredTaskScope.Joiner<\/a><\/strong> interface, that allows for implementations of that interface to return a result after the timeout expires.<\/p>\n<p>JDK 26<\/p>\n<p><a href=\"https:\/\/github.com\/openjdk\/jdk\/releases\/tag\/jdk-26%2B17\" rel=\"nofollow noopener\" target=\"_blank\">Build 17<\/a> of the JDK 26 <a href=\"https:\/\/jdk.java.net\/26\/\" rel=\"nofollow noopener\" target=\"_blank\">early-access builds<\/a> was made available this past week featuring <a href=\"https:\/\/github.com\/openjdk\/jdk\/compare\/jdk-26%2B16...jdk-26%2B17\" rel=\"nofollow noopener\" target=\"_blank\">updates<\/a> from Build 16 that include fixes for various <a href=\"https:\/\/bugs.openjdk.org\/issues\/?jql=project%20%3D%20JDK%20AND%20fixversion%20%3D%2026%20and%20%22resolved%20in%20build%22%20%3D%20b17%20order%20by%20component%2C%20subcomponent\" rel=\"nofollow noopener\" target=\"_blank\">issues<\/a>. More details on this release may be found in the <a href=\"https:\/\/jdk.java.net\/26\/release-notes\" rel=\"nofollow noopener\" target=\"_blank\">release notes<\/a>.<\/p>\n<p>BellSoft<\/p>\n<p>BellSoft has <a href=\"https:\/\/bell-sw.com\/blog\/liberica-native-image-kit-25-0-0-1-is-available\/\" rel=\"nofollow noopener\" target=\"_blank\">released<\/a> version 25.0.0.0 of their <a href=\"https:\/\/bell-sw.com\/liberica-native-image-kit\/\" rel=\"nofollow noopener\" target=\"_blank\">Liberica Native Image Kit<\/a> builds based on the <a href=\"https:\/\/www.infoq.com\/news\/2025\/09\/java25-released\/\" rel=\"nofollow noopener\" target=\"_blank\">recent release of JDK 25<\/a>. The release features: initial optimization support for Vector API operations in native images transformed to efficient machine instructions; and the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Sparse_conditional_constant_propagation\" rel=\"nofollow noopener\" target=\"_blank\">Whole-Program Sparse Conditional Constant Propagation<\/a> (WP-SCCP), now enabled by default, improves on <a href=\"https:\/\/medium.com\/graalvm\/skipflow-producing-smaller-executables-with-graalvm-f18ca98279c2\" rel=\"nofollow noopener\" target=\"_blank\">points-to analysis precision<\/a> to potentially reduce the size of the resulting binary native image.<\/p>\n<p>Spring Framework<\/p>\n<p>The <a href=\"https:\/\/spring.io\/blog\/2025\/09\/19\/spring-ai-1-1-0-M2-mcp-focused\" rel=\"nofollow noopener\" target=\"_blank\">second milestone release<\/a> of <a href=\"https:\/\/spring.io\/projects\/spring-ai\" rel=\"nofollow noopener\" target=\"_blank\">Spring AI<\/a> 1.1.0 delivers bug fixes, improvements in documentation, dependency upgrades and notable features such as: enhanced support for the Model Context Protocol (MCP) with an upgrade version 0.13.1 of the <a href=\"https:\/\/github.com\/modelcontextprotocol\/java-sdk\/blob\/main\/README.md\" rel=\"nofollow noopener\" target=\"_blank\">MCP Java SDK<\/a>; and new implementations of the <strong><a href=\"https:\/\/docs.spring.io\/spring-ai\/docs\/1.1.0-M2\/api\/org\/springframework\/ai\/embedding\/EmbeddingOptions.html\" rel=\"nofollow noopener\" target=\"_blank\">EmbeddingOptions<\/a><\/strong> and <strong><a href=\"https:\/\/docs.spring.io\/spring-ai\/docs\/1.1.0-M2\/api\/org\/springframework\/ai\/embedding\/EmbeddingOptions.Builder.html\" rel=\"nofollow noopener\" target=\"_blank\">EmbeddingOptions.Builder<\/a><\/strong> interfaces to align with the design of <strong><a href=\"https:\/\/docs.spring.io\/spring-ai\/docs\/1.1.0-M2\/api\/org\/springframework\/ai\/chat\/prompt\/ChatOptions.html\" rel=\"nofollow noopener\" target=\"_blank\">ChatOptions<\/a><\/strong> interface. Further details on this release may be found in the <a href=\"https:\/\/github.com\/spring-projects\/spring-ai\/releases\/tag\/v1.1.0-M2\" rel=\"nofollow noopener\" target=\"_blank\">release notes<\/a>.<\/p>\n<p>JobRunr<\/p>\n<p>The <a href=\"https:\/\/www.jobrunr.io\/en\/blog\/jobrunr-v8.1.0\/\" rel=\"nofollow noopener\" target=\"_blank\">release<\/a> of <a href=\"https:\/\/www.jobrunr.io\/en\/\" rel=\"nofollow noopener\" target=\"_blank\">JobRunr<\/a> 8.1.0 ships with bug fixes, dependency upgrades and new features such as: support for JDK 25; support for the <strong><a href=\"https:\/\/github.com\/jobrunr\/jobrunr\/blob\/master\/framework-support\/jobrunr-spring-boot-3-starter\/src\/main\/java\/org\/jobrunr\/jobs\/annotations\/AsyncJob.java\" rel=\"nofollow noopener\" target=\"_blank\">@AsyncJob<\/a><\/strong> annotation in Quarkus and Micronaut applications; and the ability to directly obtain the current retry count of a job from the <strong><a href=\"https:\/\/github.com\/jobrunr\/jobrunr\/blob\/master\/core\/src\/main\/java\/org\/jobrunr\/jobs\/context\/JobContext.java\" rel=\"nofollow noopener\" target=\"_blank\">JobContext<\/a><\/strong> class that allows for redefining the behavior of an application after a certain number of failed job attempts. More details on this release may be found in the <a href=\"https:\/\/github.com\/jobrunr\/jobrunr\/releases\/tag\/v8.1.0\" rel=\"nofollow noopener\" target=\"_blank\">release notes<\/a>.<\/p>\n<p>Quarkus<\/p>\n<p>Versions 3.28.0 and 3.27.0 of <a href=\"https:\/\/quarkus.io\/\" rel=\"nofollow noopener\" target=\"_blank\">Quarkus<\/a>, announced <a href=\"https:\/\/quarkus.io\/blog\/quarkus-3-28-released\/\" rel=\"nofollow noopener\" target=\"_blank\">here<\/a> and <a href=\"https:\/\/quarkus.io\/blog\/quarkus-3-27-released\/\" rel=\"nofollow noopener\" target=\"_blank\">here<\/a>, provides bug fixes, dependency upgrades and new features such as: support for multiple clients in the <a href=\"https:\/\/quarkus.io\/extensions\/io.quarkus\/quarkus-liquibase-mongodb\/\" rel=\"nofollow noopener\" target=\"_blank\">Liquibase MongoDB<\/a> extension; the ability to <a href=\"https:\/\/quarkus.io\/guides\/security-csrf-prevention#csrf-prevention-programmatic-set-up\" rel=\"nofollow noopener\" target=\"_blank\">programmatically configure<\/a> prevention of Cross-Site Request Forgery (CSRF); and <strong><a href=\"https:\/\/github.com\/quarkusio\/quarkus\/blob\/main\/extensions\/oidc-common\/runtime\/src\/main\/java\/io\/quarkus\/oidc\/common\/OidcRequestFilter.java\" rel=\"nofollow noopener\" target=\"_blank\">OidcRequestFilter<\/a><\/strong> and <strong><a href=\"https:\/\/github.com\/quarkusio\/quarkus\/blob\/main\/extensions\/oidc-common\/runtime\/src\/main\/java\/io\/quarkus\/oidc\/common\/OidcResponseFilter.java\" rel=\"nofollow noopener\" target=\"_blank\">OidcResponseFilter<\/a><\/strong> interfaces may now be restricted to a specific authentication flow by using the <strong><a href=\"https:\/\/github.com\/quarkusio\/quarkus\/blob\/main\/extensions\/oidc\/runtime\/src\/main\/java\/io\/quarkus\/oidc\/BearerTokenAuthentication.java\" rel=\"nofollow noopener\" target=\"_blank\">@BearerTokenAuthentication<\/a><\/strong> and <strong><a href=\"https:\/\/github.com\/quarkusio\/quarkus\/blob\/main\/extensions\/oidc\/runtime\/src\/main\/java\/io\/quarkus\/oidc\/AuthorizationCodeFlow.java\" rel=\"nofollow noopener\" target=\"_blank\">@AuthorizationCodeFlow<\/a><\/strong> annotations. Further details on these releases may be found in the <a href=\"https:\/\/github.com\/quarkusio\/quarkus\/releases\/tag\/3.28.1\" rel=\"nofollow noopener\" target=\"_blank\">release notes<\/a>.<\/p>\n<p>Open Liberty<\/p>\n<p>The <a href=\"https:\/\/openliberty.io\/blog\/2025\/09\/23\/25.0.0.10-beta.html\" rel=\"nofollow noopener\" target=\"_blank\">beta release<\/a> of <a href=\"https:\/\/openliberty.io\/\" rel=\"nofollow noopener\" target=\"_blank\">Open Liberty<\/a> 25.0.0.10 features: support for JDK 25; and a new <strong>overrideLibraryRef<\/strong> attribute for the <strong><\/strong> element in the <strong>server.xml<\/strong> file that allows for the library class path to be searched before the application class path to override classes that are already included in the application.<\/p>\n<p>LangChain4j<\/p>\n<p>The formal release (along with the twelfth beta release) of <a href=\"https:\/\/docs.langchain4j.dev\/\" rel=\"nofollow noopener\" target=\"_blank\">LangChain4j<\/a> 1.6.0 features new integrations: <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/container-apps\/sessions\" rel=\"nofollow noopener\" target=\"_blank\">dynamic sessions in Azure Container Apps<\/a> and <strong><a href=\"https:\/\/github.com\/langchain4j\/langchain4j\/blob\/main\/document-parsers\/langchain4j-document-parser-markdown\/src\/main\/java\/dev\/langchain4j\/data\/document\/parser\/markdown\/MarkdownDocumentParser.java\" rel=\"nofollow noopener\" target=\"_blank\">MarkdownDocumentParser<\/a><\/strong> class. Other notable changes include: a new <strong><a href=\"https:\/\/github.com\/langchain4j\/langchain4j\/blob\/main\/langchain4j-agentic\/src\/main\/java\/dev\/langchain4j\/agentic\/declarative\/HumanInTheLoop.java\" rel=\"nofollow noopener\" target=\"_blank\">@HumanInTheLoop<\/a><\/strong> annotation for use in the declarative agentic API; and the ability to configure an instance of the <strong><a href=\"https:\/\/github.com\/langchain4j\/langchain4j\/blob\/main\/langchain4j\/src\/main\/java\/dev\/langchain4j\/memory\/chat\/ChatMemoryProvider.java\" rel=\"nofollow noopener\" target=\"_blank\">ChatMemoryProvider<\/a><\/strong> functional interface on a <strong><a href=\"https:\/\/github.com\/langchain4j\/langchain4j\/blob\/main\/langchain4j-agentic\/src\/main\/java\/dev\/langchain4j\/agentic\/supervisor\/SupervisorAgent.java\" rel=\"nofollow noopener\" target=\"_blank\">SupervisorAgent<\/a><\/strong> interface. More details on this release may be found in the <a href=\"https:\/\/github.com\/langchain4j\/langchain4j\/releases\/tag\/1.6.0\" rel=\"nofollow noopener\" target=\"_blank\">release notes<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"This week&#8217;s Java roundup for September 22nd, 2025, features news highlighting: new OpenJDK JEPs Lazy Constants (Second Preview)&hellip;\n","protected":false},"author":3,"featured_media":263656,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21],"tags":[691,9017,738,2556,9024,137831,137837,137836,137835,137832,137833,137834,137838,137839,158,67,132,68],"class_list":{"0":"post-263655","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-artificial-intelligence","8":"tag-ai","9":"tag-architecture-design","10":"tag-artificial-intelligence","11":"tag-development","12":"tag-java","13":"tag-java-news-roundup-sep22-2025","14":"tag-jdk-26","15":"tag-jobrunr","16":"tag-langchain","17":"tag-libericajdk","18":"tag-open-jdk","19":"tag-open-liberty","20":"tag-quarkus","21":"tag-spring-ai","22":"tag-technology","23":"tag-united-states","24":"tag-unitedstates","25":"tag-us"},"share_on_mastodon":{"url":"https:\/\/pubeurope.com\/@us\/115287317767633463","error":""},"_links":{"self":[{"href":"https:\/\/www.europesays.com\/us\/wp-json\/wp\/v2\/posts\/263655","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.europesays.com\/us\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.europesays.com\/us\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/us\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/us\/wp-json\/wp\/v2\/comments?post=263655"}],"version-history":[{"count":0,"href":"https:\/\/www.europesays.com\/us\/wp-json\/wp\/v2\/posts\/263655\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/us\/wp-json\/wp\/v2\/media\/263656"}],"wp:attachment":[{"href":"https:\/\/www.europesays.com\/us\/wp-json\/wp\/v2\/media?parent=263655"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.europesays.com\/us\/wp-json\/wp\/v2\/categories?post=263655"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.europesays.com\/us\/wp-json\/wp\/v2\/tags?post=263655"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}