This feed does not validate.
line 36, column 2: (12 occurrences) [help]
<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/09/IJ-so ...
^
... /2025/08/blogcover.jpg</featuredImage> <product ><![CDATA[idea]]></product>
^
In addition, interoperability with the widest range of feed readers could be improved by implementing the following recommendations.
line 54, column 0: (8 occurrences) [help]
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-emb ...
line 67, column 0: (23 occurrences) [help]
line 67, column 0: (23 occurrences) [help]
line 67, column 0: (23 occurrences) [help]
line 67, column 0: (23 occurrences) [help]
line 67, column 0: (23 occurrences) [help]
line 67, column 0: (23 occurrences) [help]
line 67, column 0: (23 occurrences) [help]
line 139, column 0: (14 occurrences) [help]
line 253, column 0: (26 occurrences) [help]
line 293, column 0: (7 occurrences) [help]
line 293, column 0: (7 occurrences) [help]
line 439, column 0: (24 occurrences) [help]
<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:media="http://search.yahoo.com/mrss/" >
<channel>
<title>IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog</title>
<atom:link href="https://blog.jetbrains.com/idea/feed/" rel="self" type="application/rss+xml" />
<link>https://blog.jetbrains.com</link>
<description>Developer Tools for Professionals and Teams</description>
<lastBuildDate>Wed, 17 Sep 2025 20:08:26 +0000</lastBuildDate>
<language>en-US</language>
<sy:updatePeriod>
hourly </sy:updatePeriod>
<sy:updateFrequency>
1 </sy:updateFrequency>
<image>
<url>https://blog.jetbrains.com/wp-content/uploads/2024/01/cropped-mstile-310x310-1-32x32.png</url>
<title>IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog</title>
<link>https://blog.jetbrains.com</link>
<width>32</width>
<height>32</height>
</image>
<item>
<title>Spring Debugger: ApplicationContext at Your Fingertips</title>
<link>https://blog.jetbrains.com/idea/2025/09/spring-debugger-applicationcontext-at-your-fingertips/</link>
<dc:creator><![CDATA[Siva Katamreddy]]></dc:creator>
<pubDate>Wed, 17 Sep 2025 11:14:19 +0000</pubDate>
<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/09/IJ-social-BlogFeatured-1280x720-2x-5.png</featuredImage> <category><![CDATA[idea]]></category>
<category><![CDATA[java]]></category>
<category><![CDATA[debugging]]></category>
<category><![CDATA[intellij-idea]]></category>
<category><![CDATA[springboot]]></category>
<category><![CDATA[springdebugger]]></category>
<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&p=596461</guid>
<description><![CDATA[IntelliJ IDEA has great support for debugging Java and Kotlin applications. But if you are building Spring Boot applications, you may want to access Spring components along with their metadata. That’s where the Spring Debugger plugin comes in. It makes life easier by letting you explore and use the entire Spring ApplicationContext right from your […]]]></description>
<content:encoded><![CDATA[
<p>IntelliJ IDEA has great support for debugging Java and Kotlin applications. But if you are building Spring Boot applications, you may want to access Spring components along with their metadata. That’s where the <a href="https://plugins.jetbrains.com/plugin/25302-spring-debugger" target="_blank" rel="noopener">Spring Debugger</a> plugin comes in. It makes life easier by letting you explore and use the entire Spring ApplicationContext right from your debugger.</p>
<p>Let’s dive into how this powerful plugin can revolutionize your debugging workflow.</p>
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Spring Debugger: Application Context At Your Finger Tips" width="500" height="281" src="https://www.youtube.com/embed/kjVyyGiUoM0?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div><figcaption class="wp-element-caption">Spring Debugger: ApplicationContext at Your Fingertips </figcaption></figure>
<h2 class="wp-block-heading">Beyond the Scope: Access Any Spring Bean</h2>
<p>Imagine you are building a bookmarks management <a href="https://github.com/sivaprasadreddy/spring-debugger-demo" target="_blank" rel="noopener">application</a> using Spring Boot and you have a Spring bean <code>BookmarkService</code> with <code>createBookmark()</code> method as follows:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@Service
public class BookmarkService {
private final BookmarkRepository bookmarkRepository;
private final CategoryService categoryService;
public BookmarkService(BookmarkRepository bookmarkRepository,
CategoryService categoryService) {
this.bookmarkRepository = bookmarkRepository;
this.categoryService = categoryService;
}
@Transactional
public Bookmark createBookmark(CreateBookmarkCmd cmd) {
var bookmark = new Bookmark(cmd.title(), cmd.url());
if(cmd.categoryName() != null) {
Category category = categoryService.findByName(cmd.categoryName()).orElse(null);
if (category == null) {
category = categoryService.createCategory(new Category(cmd.categoryName()));
}
bookmark.setCategory(category);
}
bookmarkRepository.save(bookmark);
return bookmark;
}
}</pre>
<p>The <code>BookmarkService</code> has <code>BookmarkRepository</code> and <code>CategoryService</code> beans injected. While creating a bookmark, we first check if there is a Category exists with the given name. If not, we will create a new Category and then save Bookmark.</p>
<p>The <code>CategoryService</code> is also a Spring bean with <code>findByName(String)</code> method as follows:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@Service
public class CategoryService {
private final CategoryRepository categoryRepository;
public CategoryService(CategoryRepository categoryRepository) {
this.categoryRepository = categoryRepository;
}
@Cacheable("category-by-name")
public Optional<Category> findByName(String name) {
return categoryRepository.findByNameEqualsIgnoreCase(name);
}
}</pre>
<p>The <code>findByName()</code> method is annotated with <code>@Cacheable("category-by-name")</code> to cache the method result so that if you call this method with the same input it will return the cached result instead of executing the method logic again.</p>
<p>Now, Imagine you’re debugging create bookmark use case. You hit a breakpoint in <code>BookmarkService.createBookmark()</code> method. Usually, you can access objects within the current scope, such as <code>bookmarkRepository</code>, <code>bookmark</code>, or <code>categoryService</code>. </p>
<p>But what if you need to inspect or interact with a bean that isn’t directly injected into your current class. For example, you may want to clear existing data or insert new data into the database by using a repository directly.</p>
<p>Let’s say while debugging <code>BookmarkService.createBookmark()</code> method, we would like to temporarily delete all the categories using <code>CategoryRepository.deleteAll()</code>? Usually, you’d be out of luck.</p>
<p>This is where the Spring Debugger plugin shines. It allows you to access any Spring bean that exists within your <code>ApplicationContext</code>. Simply start typing the bean name into the expression input box, and the plugin will show matching beans. You can then invoke any methods on them, like calling <code>categoryRepository.findAll()</code> method and you can view the result. </p>
<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2025/09/SD-invoke-bean-method.mp4"></video></figure>
<p>This capability extends your debugging reach far beyond the immediate scope.</p>
<h2 class="wp-block-heading">Manipulate Application State On-the-Fly</h2>
<p>Consider a common scenario: you have a service method, like <code>CategoryService.findByName()</code>, that caches its results. If you’re debugging an issue related to this method and call it repeatedly with the same input, the breakpoint won’t be hit because the results are served from the cache.</p>
<p>Traditionally, you might need to restart your application or temporarily disable caching to force the breakpoint to hit. With the Spring Debugger plugin, there’s a much more elegant solution.</p>
<p>You can directly access the <code>cacheManager</code> bean from your <code>ApplicationContext</code>. Inspect the available caches, find the specific cache (e.g., category-by-name), and then invoke the <code>invalidate()</code> method on it.</p>
<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2025/09/SD-invalidate-cache.mp4"></video></figure>
<p>After invalidating the cache, when you resume execution, the breakpoint in <code>CategoryService</code> will now be hit because there’s no entry in the cache for that name.</p>
<p>This demonstrates the incredible power to invoke any method on any Spring bean to dynamically control and debug your application’s flow.</p>
<h2 class="wp-block-heading">Access Core Spring Components and Properties</h2>
<p>Sometimes we may get tricky problems due to configuration issues or misunderstanding of conventions. While debugging such issues, we may want to explore the application’s runtime configuration or access low-level components to interact with database or publish application events using <code>ApplicationEventPublisher</code>.</p>
<p>The utility of the Spring Debugger plugin isn’t limited to your custom beans. It also provides <strong>direct access to core Spring components</strong> that are part of your <code>ApplicationContext</code>:</p>
<ul>
<li><strong>EntityManager</strong>: If you’re using JPA, you can directly access the <code>entityManager</code> and invoke any methods on it.</li>
<li><strong>Environment</strong>: Gain access to the <code>environment</code> bean, which provides an abstraction to all application properties. You can query specific property values to see their current configuration.</li>
</ul>
<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2025/09/SD-em-env.mp4"></video></figure>
<h2 class="wp-block-heading">Streamline Your Debugging Workflow and Save Time</h2>
<p>The ability to access any Spring bean has significant implications for your overall debugging process.</p>
<ul>
<li><strong>Eliminate Temporary Code Changes</strong>: How many times have you temporarily injected a bean, added log statements, or introduced other debugging code, only to have to remove it once the issue is found? With Spring Debugger, you don’t need to make those temporary changes. You can directly access any bean and explore your use case as needed.</li>
</ul>
<ul>
<li><strong>Effortless Test Data Setup</strong>: Imagine debugging a scenario that requires specific test data, perhaps an action only an administrator can perform. Instead of logging out, and logging in as an administrator, performing the action, and then returning to your debug flow, you can simply access a service bean directly to insert test data into the database, bypassing complex setup steps.<br></li>
</ul>
<p>In essence, the Spring Debugger plugin empowers you with all the power of the Spring <code>ApplicationContext</code> right at your fingertips while debugging. It significantly enhances your ability to understand, inspect, and manipulate your Spring Boot application’s state, making your debugging sessions more efficient and productive.</p>
<p>Go ahead and install the <a href="https://plugins.jetbrains.com/plugin/25302-spring-debugger" target="_blank" rel="noopener">Spring Debugger</a> plugin to explore its powers yourself!</p>
]]></content:encoded>
</item>
<item>
<title>IntelliJ IDEA 2025.3 Early Access Program Is Open!</title>
<link>https://blog.jetbrains.com/idea/2025/09/intellij-idea-2025-3-eap/</link>
<dc:creator><![CDATA[Maria Kosukhina]]></dc:creator>
<pubDate>Tue, 16 Sep 2025 11:46:24 +0000</pubDate>
<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/09/IJ-IDEA-2025.3-EAP.png</featuredImage> <category><![CDATA[eap]]></category>
<category><![CDATA[2025-3-eap]]></category>
<category><![CDATA[intellij-idea]]></category>
<category><![CDATA[intellij-idea-2025-3]]></category>
<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&p=599251</guid>
<description><![CDATA[We’re kicking off the next development cycle and inviting you to join it. The Early Access Program (EAP) for IntelliJ IDEA 2025.3 is now open, offering an early look at the new features and improvements we’re working on. By evaluating new features and sharing constructive feedback, you help us provide you with powerful, reliable tooling […]]]></description>
<content:encoded><![CDATA[
<p>We’re kicking off the next development cycle and inviting you to join it.</p>
<p>The Early Access Program (EAP) for IntelliJ IDEA 2025.3 is now open, offering an early look at the new features and improvements we’re working on. By evaluating new features and sharing constructive feedback, you help us provide you with powerful, reliable tooling for professional development.</p>
<figure class="wp-block-image size-full"><img decoding="async" fetchpriority="high" width="2560" height="1440" src="https://blog.jetbrains.com/wp-content/uploads/2025/09/IJ-IDEA-2025.3-EAP-1.png" alt="" class="wp-image-599279"/></figure>
<p>As always, EAP builds are free to use and can be installed side by side with your stable IDE version. You can get EAP builds from the <a href="https://www.jetbrains.com/toolbox-app/" target="_blank" rel="noopener">Toolbox App</a>, download them from the <a href="https://www.jetbrains.com/idea/nextversion/" target="_blank" rel="noopener">website</a>, or use snaps for Ubuntu.</p>
<p align="center"><a class="jb-download-button" href="https://www.jetbrains.com/idea/nextversion/" target="_blank" rel="noopener">Download IntelliJ IDEA 2025.3 EAP</a></p>
<p><strong>Please note that EAP builds are not fully tested and might be unstable, as the version is still a work in progress. Please keep this in mind when using them.</strong></p>
<p>In this post, we’d like to share a glimpse of what’s in our planning dashboards for the upcoming release. The list below is neither final nor exhaustive, but it’s meant to show the direction we’re heading.</p>
<p><strong>Single distribution</strong> </p>
<p>In 2025.3, IntelliJ IDEA will move to <a href="https://blog.jetbrains.com/idea/2025/07/intellij-idea-unified-distribution-plan/">unified distribution</a>, and several important changes related will appear during the EAP cycle. These include more features becoming available without subscription, such as wizards, basic highlighting for JavaScript, SQL, JPQL, template engines markup, and support database schema exploration. A detailed list of features going free will be published closer to the release.</p>
<p>Also there will be no IntelliJ IDEA Community Edition EAP builds available in the Toolbox App or from the IntelliJ Platform Gradle plugin. Please use the EAP builds of IntelliJ IDEA Ultimate instead. More information about Gradle builds will be published later on <a href="http://platform.jetbrains.com/" target="_blank" rel="noopener">platform.jetbrains.com</a>.</p>
<p><strong>Technology updates</strong> </p>
<p>We’re continuing our effort to support the latest technologies you may use in your projects. This release brings full support for Java 25, Spring Boot 4, JUnit 6, all expected to be released within the next few months.<br><br><strong>Spring </strong></p>
<p>In addition to supporting new features introduced for Spring 7, we’re working on significantly improving Spring Data JDBC support and extending the capabilities of the <a href="https://blog.jetbrains.com/idea/2025/06/demystifying-spring-boot-with-spring-debugger/" data-type="link" data-id="https://blog.jetbrains.com/idea/2025/06/demystifying-spring-boot-with-spring-debugger/">Spring Debugger</a> introduced in v2025.2.</p>
<p><strong>Kotlin</strong></p>
<p>Kotlin support in the IDE continues to improve, with enhancements to code completion and overall quality in K2 mode. In addition to support for Spring 7, the Kotlin Routing DSL is getting better IDE assistance, along with various quality-of-life improvements for Spring development.</p>
<p>For Kotlin Notebook, we’re also improving stability and adding more improvements, like support for database integration – one of the most common scenarios in server-side development.</p>
<p><strong>Kubernetes support</strong></p>
<p>Starting with 2025.3, we’re improving the experience of working with Kubernetes YAML files. We’re aiming to enable inlay quick actions in the editor for faster port forwarding, resource status updates, current context selection, and easier access to secrets.</p>
<p><strong>User experience</strong></p>
<p>In v2025.3, IntelliJ IDEA is getting a visual upgrade – the new <em>Islands</em> theme. Based on the feedback we’ve collected and our experiments in the previous release cycle, we’re now looking into making it the new default. We are going to share more details about the new theme soon.</p>
<p>Meanwhile, you can try the Islands theme in this EAP build by enabling it in <em>Settings | Appearance & Behavior | Appearance | Theme</em>.</p>
<p>Another notable change we’re working on is the new<strong> </strong><strong><em>Welcome screen</em></strong> that takes you straight into the IDE, with no extra dialog windows or additional clicks.</p>
<p>We’re also working on improving how the IDE communicates with you while project indexes are still being built. This includes a clearer overview of background tasks and more transparent, predictable progress indicators so you can stay focused on your code with fewer distractions.</p>
<p><strong>Remote development</strong></p>
<p>Following the improvements introduced in the previous release to refine the <a href="https://blog.jetbrains.com/idea/2025/08/whats-fixed-intellij-idea-2025-2/#remote-development">remote development experience</a>, we’re continuing in the same direction. In v2025.3, we plan to enable smoother typing for more languages including CSS, JavaScript, TypeScript, and shell scripts. Additionally, the launch experience is being revamped to accelerate startup and make it more seamless.</p>
<p><strong>Terminal</strong></p>
<p>In v2025.3, we’re bringing AI support to the terminal, starting with inline completion as the first step.</p>
<p><strong>Stability</strong></p>
<p>A large portion of our team’s workload is dedicated to maintaining the quality and stability of the IDE. We’ll communicate those improvements in a dedicated <em>What’s Fixed</em> post, <a href="https://blog.jetbrains.com/idea/2025/08/whats-fixed-intellij-idea-2025-2">like we did for the previous release</a>.</p>
<p>For the full list of fixes and improvements already included in the first 2025.3 EAP build, please refer to the <a href="https://youtrack.jetbrains.com/articles/IDEA-A-2100662503/IntelliJ-IDEA-2025.3-EAP-1-253.17525.95-build-Release-Notes" target="_blank" rel="noopener">release notes</a>.</p>
<p><strong>Share your feedback</strong></p>
<p>Take part in the Early Access Program by trying out the EAP builds and sharing your feedback with us. You can get in touch with us on <a href="https://x.com/intellijidea" data-type="link" data-id="https://x.com/intellijidea" target="_blank">X</a>, <a href="https://bsky.app/profile/intellijidea.com" data-type="link" data-id="https://bsky.app/profile/intellijidea.com" target="_blank" rel="noopener">BlueSky</a> or <a href="https://www.linkedin.com/showcase/intellijidea" data-type="link" data-id="https://www.linkedin.com/showcase/intellijidea" target="_blank" rel="noopener">LinkedIn</a>, or leave a comment below. If you come across a bug or something that doesn’t work as expected, please report it via our <a href="https://youtrack.jetbrains.com/issues/IDEA" target="_blank" rel="noopener">issue tracker</a>.</p>
<p>Happy developing!</p>
]]></content:encoded>
</item>
<item>
<title>Java 25 LTS and IntelliJ IDEA</title>
<link>https://blog.jetbrains.com/idea/2025/09/java-25-lts-and-intellij-idea/</link>
<dc:creator><![CDATA[Marit van Dijk]]></dc:creator>
<pubDate>Tue, 16 Sep 2025 11:15:34 +0000</pubDate>
<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/09/IJ-social-BlogSocialShare-1280x720-2x-4.png</featuredImage> <category><![CDATA[java]]></category>
<category><![CDATA[news]]></category>
<category><![CDATA[tutorials]]></category>
<category><![CDATA[update]]></category>
<category><![CDATA[intellij-idea]]></category>
<category><![CDATA[java-25-2]]></category>
<category><![CDATA[java-release]]></category>
<category><![CDATA[java-support]]></category>
<category><![CDATA[jdk-25]]></category>
<category><![CDATA[release]]></category>
<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&p=604053</guid>
<description><![CDATA[The Java release cadence means we get a new Java version every six months. Java 25 was released on September 16, 2025. At JetBrains, we are committed to supporting new technologies in IntelliJ IDEA and adding useful enhancements for both stable and preview features. In this blog post, we will give you an overview of […]]]></description>
<content:encoded><![CDATA[
<p>The Java release cadence means we get a new Java version every six months. Java 25 was released on September 16, 2025. At JetBrains, we are committed to supporting new technologies in IntelliJ IDEA and adding useful enhancements for both stable and preview features. In this blog post, we will give you an overview of some changes to the Java language and how they are supported in IntelliJ IDEA. This post is limited to stable features only. Preview features will be covered separately in dedicated blog posts on relevant topics.</p>
<p><a href="https://openjdk.org/projects/jdk/25/" target="_blank" rel="noopener">Java 25</a> includes several changes to the language that make Java easier to use. Features like <a href="https://openjdk.org/jeps/512" target="_blank" rel="noopener">compact source files and instance main methods</a>, as well as <a href="https://openjdk.org/jeps/511" target="_blank" rel="noopener">module import declarations</a>, make it easier to get started with Java, both for students and when creating small projects like prototypes or hobby projects. <a href="https://openjdk.org/jeps/513" target="_blank" rel="noopener">Flexible constructor bodies</a> allow more flexibility in constructors, giving you the option to calculate or validate data before calling the constructor of the super class. <a href="https://openjdk.org/jeps/506" target="_blank" rel="noopener">Scoped values</a> are a new model for thread-local variables, adapted to virtual threads. They will be more useful with <a href="https://openjdk.org/jeps/505" target="_blank" rel="noopener">structured concurrency</a>, which is currently still in preview.</p>
<p>Apart from changes to the language itself, there are improvements to both performance and performance insights. <a href="https://openjdk.org/jeps/519" target="_blank" rel="noopener">Compact object headers</a> reduce memory footprint and improve cache efficiency. <a href="https://openjdk.org/jeps/515" target="_blank" rel="noopener">Ahead-of-time method profiling</a> lets the JVM warm up more quickly by using execution data from prior runs, improving startup performance. Improvements to garbage collection (GC) like <a href="https://openjdk.org/jeps/521" target="_blank" rel="noopener">generational Shenandoah</a>, plus better class-loading and linking optimizations, contribute to noticeably smoother server-style workloads.</p>
<p>As Java 25 is an <a href="https://www.oracle.com/nl/java/technologies/java-se-support-roadmap.html" target="_blank" rel="noopener">LTS (long-term support) release</a>, many people will be migrating to this version from Java 21, 17, 11, or even earlier. If you are coming to Java 25 from Java 21, have a look at the section describing the most relevant changes since Java 21.</p>
<p>Before diving into the new features, let’s set up IntelliJ IDEA to use Java 25.</p>
<h1 class="wp-block-heading">Using Java 25 in IntelliJ IDEA (setup)</h1>
<p>To use Java 25, you will need to download the JDK. You can do so from inside IntelliJ IDEA or by using tools like SDKMAN! To download a JDK from IntelliJ IDEA, open the <em>Project Structure</em>, go to the tab <em>Project Settings | Project</em>, open the drop-down menu in the <em>SDK </em>field, and select <em>Download JDK</em>. </p>
<figure class="wp-block-image size-full"><img decoding="async" width="1999" height="1125" src="https://blog.jetbrains.com/wp-content/uploads/2025/09/image18.png" alt="" class="wp-image-604055"/><figcaption class="wp-element-caption"><em>Downloading JDK from inside IntelliJ IDEA</em></figcaption></figure>
<p>In the <em>Download JDK</em> popup that opens, set <em>Version</em> to <em>25</em>,<em> </em>and in the <em>Vendor</em> field, select the vendor you want to use. </p>
<p>You can also download Early Access (EA) versions of the JDK from inside IntelliJ IDEA, for example, when the next release becomes available or if you’d like to try Valhalla (which is based on Java 23). IntelliJ IDEA will warn you that these are not intended for production use. </p>
<figure class="wp-block-image size-full"><img decoding="async" loading="lazy" width="1999" height="1125" src="https://blog.jetbrains.com/wp-content/uploads/2025/09/image17.png" alt="" class="wp-image-604066"/><figcaption class="wp-element-caption"><em>Downloading an Early Access version</em></figcaption></figure>
<p>Next, you need to configure IntelliJ IDEA to use the right language level. To use Java 25 stable features, which is recommended for production code, set <em>Language level</em> to <em>25 – Compact source files, module imports</em>.</p>
<figure class="wp-block-image size-full"><img decoding="async" loading="lazy" width="1999" height="1125" src="https://blog.jetbrains.com/wp-content/uploads/2025/09/image4-2.png" alt="" class="wp-image-604273"/><figcaption class="wp-element-caption"><em>Setting </em>Language level<em> to </em>25</figcaption></figure>
<p>If you want to try out preview features, set <em>Language level</em> to <em>25 (Preview) – Primitive Types in Patterns, etc</em>.</p>
<figure class="wp-block-image size-full"><img decoding="async" loading="lazy" width="1999" height="1125" src="https://blog.jetbrains.com/wp-content/uploads/2025/09/image5.png" alt="" class="wp-image-604284"/><figcaption class="wp-element-caption"><em>Setting </em>Language level<em> to </em>25 (Preview)</figcaption></figure>
<h1 class="wp-block-heading">New stable features in Java 25</h1>
<p>Let’s take a look at some of the features Java 25 introduces and how IntelliJ IDEA can help you use them.</p>
<h2 class="wp-block-heading">Compact Source Files and Instance Main Methods (JEP 512)</h2>
<p>Java has been working on the so-called “on-ramp”, making the language easier to use. <a href="https://openjdk.org/jeps/512" target="_blank" rel="noopener">Compact source files and instance main methods</a> are part of that effort. It is now possible for beginners to start writing code without needing to learn about language concepts that they won’t need until they start writing larger programs. For experienced programmers, this feature can help them quickly prototype ideas without needing a lot of boilerplate code. Code can be evolved and expanded as skills and applications grow. </p>
<p>To quickly see the difference, let’s look at a classic example: <code>HelloWorld</code>. We have probably all written a HelloWorld example when we first started, possibly in a language other than Java or English. The classic <code>HelloWorld.java</code> looks like this:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}</pre>
<p>To write this code, you had to declare a class and a lengthy main method, including concepts like <code>public</code> and <code>static</code> that are not relevant to beginners. Let’s compare this to the <code>HelloWorld</code> example using new features from compact source files and instance main methods. </p>
<p>When creating a new Java class via <em>New | Java Class</em>, in the <em>New Java Class</em> popup, select the <em>Compact source file </em>option. Note that this compact source file is created in the root directory of your project, even if you create it from another package. IntelliJ IDEA automatically adds an instance main method – <code>void main()</code> – to the file. Next, you can add a method to print “Hello, World!”. You can now use <code>IO.println()</code> as a convenience method without needing to understand what <code>System.out</code> means and without even needing to add a static import. If you do want to add a static import for <code>java.lang.IO</code>, IntelliJ IDEA offers a quick-fix to do so.</p>
<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2025/09/Java25_HelloWorld-2.mp4"></video><figcaption class="wp-element-caption"><em>Creating `HelloWorld.java`</em></figcaption></figure>
<p>Note that different variations of the main method are now possible, as described <a href="https://blog.jetbrains.com/idea/2024/02/helloworld-and-main-meet-minimalistic/#variations-of-the-main-method-in-the-implicit-class">here</a>.</p>
<p>IntelliJ IDEA has some new <a href="https://www.jetbrains.com/help/idea/using-live-templates.html" target="_blank" rel="noopener">live templates</a> to add a main method to an implicit class, either with or without arguments: <code>main</code>, <code>maina</code>, <code>psvm</code>, and <code>psvma</code>. Using the <code>psvm</code> or <code>main</code> live templates inside a compact source file will add the new main method, while they will continue to add the classic main method inside a class, as you can see in the preview.</p>
<figure class="wp-block-image size-full"><img decoding="async" loading="lazy" width="1999" height="1125" src="https://blog.jetbrains.com/wp-content/uploads/2025/09/image15.png" alt="" class="wp-image-604121"/><figcaption class="wp-element-caption"><em>Live templates for the main method in a compact source file</em></figcaption></figure>
<figure class="wp-block-image size-full"><img decoding="async" loading="lazy" width="1999" height="1125" src="https://blog.jetbrains.com/wp-content/uploads/2025/09/image1-1.png" alt="" class="wp-image-604110"/><figcaption class="wp-element-caption"><em>Live templates for the main method in a compact source file</em></figcaption></figure>
<p>Our new version of <code>HelloWorld</code> now looks like this:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">void main() {
IO.println("Hello, World!");
}</pre>
<p>Compare this code to the original example. It is much shorter, contains less boilerplate, and is limited to only the things we need: a main method and a call to print a line with the provided “Hello, World!” <code>String</code>.</p>
<p>As beginners often need to interact with the console, a convenient <code>readln()</code> method was also added. This is an overloaded method which can take a <code>String</code> argument that is printed to the console before reading the input. Let’s expand our previous example to read a name from the console. To help you use these new convenience methods, IntelliJ IDEA introduces two new live templates: <code>iop</code> for <code>println()</code> and <code>ior</code> for <code>readln()</code>.</p>
<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2025/09/Java25_ReadName-2.mp4"></video><figcaption class="wp-element-caption"><em>Expanding the example to use the convenience method readln()</em></figcaption></figure>
<p>Note that these changes to the language are also taken into account when creating new projects. When you create a new Java project, set <em>Build system</em> to <em>IntelliJ</em>, and select <em>Add sample code</em>, a compact source file with a <code>void main()</code> method will be added. </p>
<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2025/09/Java25_NewProject_IJ-1.mp4"></video><figcaption class="wp-element-caption"><em>Creating a new project with the IntelliJ build system</em></figcaption></figure>
<h3 class="wp-block-heading">Prototyping and teaching</h3>
<p>While extremely useful for students and teachers, this feature does not just benefit beginners. It also allows experienced developers to quickly try out ideas or create a prototype. </p>
<p>When you create a new Java project with Maven or Gradle as the selected build system, the generated source code will include a regular class, but with <code>IO.println()</code> instead of <code>System.out.println()</code>. If you are using Maven or Gradle, you’re likely working on something bigger, with actual classes instead of compact source files. Another reason to use classes is that a compact source file needs to be in the default package, and frameworks generally don’t support this. </p>
<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2025/09/Java25_NewProject_Maven-1.mp4"></video><figcaption class="wp-element-caption"><em>Creating a new project with Maven</em></figcaption></figure>
<p>To quickly create a prototype, you can create a Java compact file from the <code>src/main/java</code> directory in the <em>Project </em>tool window. IntelliJ IDEA will provide a default name for the file, so your thought process is not disrupted when you want to quickly try something out.</p>
<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2025/09/Java25_CompactSourceFile-1.mp4"></video><figcaption class="wp-element-caption"><em>Creating a Java compact file</em></figcaption></figure>
<p>When prototyping, learning, or teaching, you can gradually expand your code to include features you might need when writing code that is part of a larger project, or when introducing new concepts to your students. You can convert an implicit class to a regular class using the <em>Convert an implicitly declared class of a compact source file into a regular class </em>quick-fix.</p>
<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2025/09/Java25_ConvertFileToClass-1.mp4"></video><figcaption class="wp-element-caption"><em>Converting an implicitly declared class of a compact source file into a regular class</em></figcaption></figure>
<p>Should you prefer to use an implicit class at any point, the reverse is also possible. Similarly, there are quick-fixes to convert <code>IO.println()</code> to <code>System.out.println()</code>, and vice versa. These are probably not things you would do as part of your daily work. But you might use features like this for coding challenges, like Advent of Code, or other fun side projects.</p>
<p>The new <code>void main()</code> method does not need <code>String[] args</code>. However, should you decide to use the <code>args</code> in your code, IntelliJ IDEA will help you by adding them to the method, as you can see below. If you like this kind of completion, please let us know in the comments what you are currently missing. </p>
<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2025/09/Java25_Args-1.mp4"></video><figcaption class="wp-element-caption"><em>Completion to add `args` to the main method</em></figcaption></figure>
<p>With this feature, we finally have a separation in Java between prototypes and other small projects, and enterprise applications. IntelliJ IDEA supports both small and large applications. </p>
<p>We have already covered this feature in a previous <a href="https://blog.jetbrains.com/idea/2025/03/java-24-and-intellij-idea/">Java 24 and IntelliJ IDEA</a> post, when it was still in preview. Please have a look at that post to learn about additional support for this feature in IntelliJ IDEA. For a more in-depth explanation of this specific feature, see <a href="https://blog.jetbrains.com/author/malagupta/">Mala Gupta</a>’s previous post <a href="https://blog.jetbrains.com/idea/2024/02/helloworld-and-main-meet-minimalistic/">Java 24: ‘HelloWorld’ and ‘main()’ meet minimalistic</a>. There are examples of practical use cases on when and how to use it to create small programs and prototypes in <a href="https://blog.jetbrains.com/idea/2025/02/java-24-build-games-prototypes-utilities-and-more-with-less-boilerplate/">Java 24: Build Games, Prototypes, Utilities, and More – With Less Boilerplate</a>. Note that (among other things) the following was changed in Java 25: Compact source files were previously called simple source files, and you now need to use the qualified name <code>IO.println()</code> or use an import statement.</p>
<h2 class="wp-block-heading">Module Import Declarations (JEP 511)</h2>
<p><a href="https://openjdk.org/jeps/511" target="_blank" rel="noopener">Module import declarations</a> simplify the importing of frequently used classes (<code>java.base</code>) or modular libraries, without having to keep adding individual import statements to keep the compiler happy (even though IntelliJ IDEA can do this for you 😉). This feature makes things easier. You can write code without needing to worry about imports, which is useful when learning or prototyping.</p>
<p>Alternatively, if you have a class that imports multiple classes from a module, you can replace them with a module import statement. When you perform the <em>Optimize imports </em>action, the individual imports for classes imported by the module will be removed.</p>
<p>As your codebase grows, you might prefer to add import statements with specific imports, which you can do using the <em>Replace with single class imports </em>quick-fix.</p>
<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2025/09/Java25_OptimizeImports-1.mp4"></video><figcaption class="wp-element-caption"><em>Optimizing imports</em></figcaption></figure>
<p>If you would like to remove unused module imports when performing <em>Optimize imports</em>, you can configure this in the settings. Open <em>Settings</em> | <em>Editor | Code Style | Java</em> and go to the <em>Imports</em> tab. Then, select the <em>Delete unused module imports </em>option.</p>
<figure class="wp-block-image size-full"><img decoding="async" loading="lazy" width="1999" height="1125" src="https://blog.jetbrains.com/wp-content/uploads/2025/09/image12.png" alt="" class="wp-image-604209"/><figcaption class="wp-element-caption"><em>Configuring the IDE to delete unused module imports</em></figcaption></figure>
<p>To see which packages are exported by a module, click on the module name in the editor or use the relevant shortcut for <em>Go to Declaration or Usages</em>, as shown <a href="https://blog.jetbrains.com/idea/2025/03/java-24-and-intellij-idea/#which-packages-are-exported-by-the-module-java.base-or-other-modules">here</a>. </p>
<p>You might wonder what the difference is between module imports and wildcard imports. Wildcard imports in Java allow you to replace the import for multiple classes from the same package with one line, containing an <code>*</code>. Module imports allow you to import classes from different packages. One downside of this is the risk of potential namespace clashes. But don’t worry, IntelliJ IDEA can help you identify and fix these, as described <a href="https://blog.jetbrains.com/idea/2025/07/module-import-declarations-no-more-import-hell/#name-conflicts-compilation-error">here</a>. </p>
<p>Should you replace your current import statements with module imports? Probably not. In enterprise code, most developers prefer to have single imports. Note that IntelliJ IDEA allows you to configure the number of imports to add before replacing them with a wildcard. By default, this number is set to five. To change it, open <em>Settings</em>, go to <em>Editor | Code Style | Java</em>, and open the <em>Imports</em> tab. Then, set <em>Class count to use import with ‘*’</em> to the desired number. Since most coding standards prefer single imports over wildcard imports, we assume the same will be true for module imports. For this reason, we are not planning to have an inspection to automatically replace existing imports with <code>import module java.base;</code>. </p>
<p>However, even if you’re not using this feature explicitly, you will use it implicitly when using compact source files (described above). This feature was previously described in <a href="https://blog.jetbrains.com/idea/2025/03/java-24-and-intellij-idea/#module-import-declarations">Java 24 and IntelliJ IDEA</a>. For more background information, see <a href="https://blog.jetbrains.com/idea/2025/07/module-import-declarations-no-more-import-hell/">Module Import Declarations: No More Import Hell</a> by Mala Gupta.</p>
<h2 class="wp-block-heading">Flexible Constructor Bodies (JEP 513)</h2>
<p>With <a href="https://openjdk.org/jeps/513" target="_blank" rel="noopener">flexible constructor bodies</a>, previously known as “statements before super()”, you are now allowed to write statements in the constructor of a derived class before calling the constructor of the super class. This is useful if you want to validate or compute data in your constructor before passing it to <code>super()</code>, or when a superclass calls a method from its constructor that you want to override in the subclass and access a field from the subclass inside this method. </p>
<p>Previously, the call to <code>super()</code> had to be the first call in the constructor. IntelliJ IDEA would give you a warning if you tried to add statements before <code>super()</code>.</p>
<figure class="wp-block-image size-full"><img decoding="async" loading="lazy" width="1874" height="1046" src="https://blog.jetbrains.com/wp-content/uploads/2025/09/image11.png" alt="" class="wp-image-604220"/><figcaption class="wp-element-caption"><em>Warning about a statement before `super()`</em></figcaption></figure>
<p>A workaround for this restriction is to call static methods inline, as arguments passed to <code>super()</code>. While this is still possible, you now have the flexibility to call these methods before calling <code>super()</code> with the results.</p>
<p>There are some limitations on which types of statements you can execute before the call to <code>super()</code>. The statements cannot access the object under construction, which means you cannot access instance members of a class before the execution of <code>super()</code> completes or call methods of the derived class.</p>
<p>This new functionality should be used responsibly. Just because you <em>can</em> put arbitrary code before <code>super()</code> doesn’t mean you should move every possible validation or I/O operation into constructors. Constructors are best kept lightweight, deterministic, and free of heavy side effects. Expensive operations, retries, or external resource access are better handled in factories, builders, or initialization methods.</p>
<p>In short, this feature lets you model object invariants more naturally through inheritance, but it doesn’t change the golden rule – constructors should remain focused and predictable.</p>
<p>While this feature might not be that exciting by itself, it is a necessary step to make <a href="https://openjdk.org/jeps/401" target="_blank" rel="noopener">value classes and objects</a> (currently in preview), as well as upcoming <a href="https://openjdk.org/jeps/8316779" target="_blank" rel="noopener">null-restricted value class types</a> (currently in draft), possible. Both of these features are part of <a href="https://openjdk.org/projects/valhalla/" target="_blank" rel="noopener">Project Valhalla</a>. We will discuss this topic later in a separate blog post.</p>
<p>For a more detailed explanation of this feature and examples of how to use it, have a look at the following video featuring Dr. Venkat Subramaniam:</p>
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="JEP Explained. JEP 482: Flexible Constructor Bodies" width="500" height="281" src="https://www.youtube.com/embed/3k2bIMFeIp8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<p>This feature was previously described in <a href="https://blog.jetbrains.com/idea/2025/03/java-24-and-intellij-idea/#flexible-constructor-bodies">Java 24 and IntelliJ IDEA</a>. For additional details and examples, see Mala Gupta’s previous blog post <a href="https://blog.jetbrains.com/idea/2024/02/constructor-makeover-in-java-22/">Constructor Makeover in Java 22</a>. Note that this post was written when this feature was still in preview. The only significant change since then is that a constructor body is now allowed to initialize fields in the same class before invoking a constructor. </p>
<h2 class="wp-block-heading">Scoped Values (JEP 506)</h2>
<p><a href="https://openjdk.org/jeps/506" target="_blank" rel="noopener">Scoped values</a> are a new model for thread-local variables adapted to virtual threads. They make it possible to share immutable data within a thread and with child threads in a convenient, safe, and scalable way.</p>
<p>In some cases, you want to share data between components of your application or between your application and a framework, such as information about a logged-in user and their permissions. While it is possible to use thread-local variables (variables of type <code>ThreadLocal</code>), there are several downsides to doing so, which might cause potential issues.</p>
<p><code>ThreadLocal</code> variables are mutable, which makes it hard to keep track of their current value and to reason about the code. The value of a <code>ThreadLocal</code> variable is retained for the lifetime of a thread, unless explicitly removed by calling the <code>remove()</code> method. Developers may forget to do so, which means data might be stored in memory longer than needed, leading to potential performance problems, as well as security issues because data might be visible to unrelated code running on the same thread. <code>ThreadLocal</code> variables can be inherited by a child thread, but each child thread will need to create a copy of the variable, which can add to the memory footprint.</p>
<p><a href="https://openjdk.org/jeps/444" target="_blank" rel="noopener">Virtual threads</a>, added in Java 21, allow us to create many more threads than platform threads. If they each retain a copy of a thread-local variable, this will impact the memory usage. On the other hand, virtual threads may not live as long as platform threads, which minimizes the potential for memory leaks. </p>
<p>To use a <code>ScopedValue</code>, you need to first declare it. It makes sense to declare it as final. Next, you need to bind the <code>ScopedValue</code> to some data and pass a <code>Runnable</code> or <code>ScopedValue.CallableOp</code>, which may be realized as a lambda. This is done in the <code>ScopedValue.where()</code> method. The operation – and any code called from it – will be able to get the <code>ScopedValue</code>, but once it is done running, this data will be cleaned up. Scoped values have a clearly defined scope, which makes the code easier to reason about. If you try to use a <code>ScopedValue</code> that is not bound, a <code>NoSuchElementException</code> is thrown, as you can see in the following example.</p>
<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2025/09/Java25_ScopedValue-1.mp4"></video><figcaption class="wp-element-caption"><em>Using `ScopedValue`</em></figcaption></figure>
<p>While you cannot set a <code>ScopedValue</code>, you can rebind it. In the example below, the variable is bound to the value “24” inside the main method. The <code>update()</code> method is called from here, where the value is bound to “25” (24 + 1). When printed, it will print the current value, “25”.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public class RebindExample {
ScopedValue<Integer> JAVA_VERSION = ScopedValue.newInstance();
void main() {
ScopedValue.where(JAVA_VERSION, 24).run(this::update);
}
private void update() {
ScopedValue.where(JAVA_VERSION, JAVA_VERSION.get() + 1).run(() -> {
IO.println("Hello, Java " + JAVA_VERSION.get()); // prints 25
});
}
}</pre>
<p>Scoped values are even more useful with <a href="https://openjdk.org/jeps/505" target="_blank" rel="noopener">structured concurrency</a>, currently in its fifth preview.</p>
<p>Structured concurrency will make it possible for data to be automatically inherited by any threads that a thread forks. The child threads’ scope will be contained in the parent thread’s scope. With scoped values, it is no longer necessary to make copies of the data, meaning they scale very well with many (virtual) threads. This topic deserves its own blog post, where we can dive deeper into new use cases, migration paths, and performance comparisons between different approaches. </p>
<p>As we have seen, scoped values solve several problems associated with <code>ThreadLocal</code>.They reduce memory overhead, improve predictability, and make reasoning about concurrent code much easier. Does this mean you should immediately rewrite all your code to use <code>ScopedValue</code>? Not necessarily. Frameworks like Spring and others still rely heavily on <code>ThreadLocal</code>, and migrating all existing components to Java 25 isn’t something that will happen overnight. Also, the intention behind scoped values was never to deprecate or replace <code>ThreadLocal</code> outright, but to offer a cleaner, safer alternative. However, you might consider using scoped values for new code or modules, especially where you are already facing typical <code>ThreadLocal</code> issues: leaks, context propagation, and cleanup.</p>
<h2 class="wp-block-heading">Performance and profiler improvements</h2>
<p>Language features are just half of the story. Java 25 also brings significant runtime improvements. Let’s take a brief look at the changes:</p>
<ul>
<li><a href="https://openjdk.org/jeps/515" target="_blank" rel="noopener">Ahead-of-Time Method Profiling</a> (JEP 515) speeds up warm-up by using method execution profile data from a prior run. The JVM can use that data immediately at startup so that hot methods are already known, reducing the delay before reaching peak performance. </li>
<li><a href="https://openjdk.org/jeps/518" target="_blank" rel="noopener">JFR Cooperative Sampling</a> (JEP 518) and <a href="https://openjdk.org/jeps/520" target="_blank" rel="noopener">JFR Method Timing & Tracing</a> (JEP 520) improve observability: Cooperative sampling lets threads report profiling data at safe points to reduce overhead and increase accuracy, and method timing and tracing give more precise, detailed call durations and call stack information. </li>
<li><a href="https://openjdk.org/jeps/519" target="_blank" rel="noopener">Compact Object Headers</a> (JEP 519) shrink the object header on 64-bit JVMs from its larger experimental form to a compact 64-bit layout. This reduces memory overhead (especially with many small objects) and improves garbage collection (GC) and cache behavior. </li>
<li><a href="https://openjdk.org/jeps/521" target="_blank" rel="noopener">Generational Shenandoah</a> (JEP 521) adds generational GC support to the Shenandoah garbage collector so that young-generation objects can be collected more efficiently, reducing pause times and improving throughput for workloads with many short-lived objects.</li>
</ul>
<h1 class="wp-block-heading">Moving from Java 21 to Java 25</h1>
<p>If you are upgrading to Java 25 from Java 21, here is an overview of some of the stable features you might not be familiar with yet.</p>
<h2 class="wp-block-heading">Stream Gatherers (JEP 485)</h2>
<p><a href="https://openjdk.org/jeps/485" target="_blank" rel="noopener">Stream Gatherers</a> were added in <a href="https://openjdk.org/projects/jdk/24/" target="_blank" rel="noopener">Java 24</a>. They improve the Stream API, added in Java 8. Stream gatherers allow you to add your own custom intermediate operations to a stream.</p>
<p>For an explanation of this feature and how you can use it, watch the following livestream with José Paumard:</p>
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Gatherers: The API Your Stream Was Missing" width="500" height="281" src="https://www.youtube.com/embed/oVdWfU_IObY?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<p>If you’d like more background information on this feature, you might be interested in the following video we created when this feature was still in preview:</p>
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="JEP Explained. JEP 473: Stream Gatherers" width="500" height="281" src="https://www.youtube.com/embed/m7PW6fMCrmg?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<p>Finally, we highly recommend this video from JavaOne by Viktor Klang, the creator of the feature:</p>
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Stream Gatherers - Deep Dive with the Expert" width="500" height="281" src="https://www.youtube.com/embed/v_5SKpfkI2U?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<h2 class="wp-block-heading">Markdown Documentation Comments (JEP 467)</h2>
<p><a href="https://openjdk.org/jeps/467" target="_blank" rel="noopener">Markdown documentation comments</a> were added in <a href="https://openjdk.org/projects/jdk/23/" target="_blank" rel="noopener">Java 23</a>. As the name suggests, it is now possible to use Markdown in your JavaDoc. Back when Java was first created, HTML seemed like a logical choice for JavaDoc, but these days you might prefer Markdown. </p>
<p>IntelliJ IDEA supports the adoption of this feature by offering a quick-fix to convert JavaDoc to Markdown. If you have JavaDoc that you would like to convert, press <em>Alt+Enter</em> when the cursor is on your JavaDoc and select the <em>Convert to Markdown documentation comment </em>option.</p>
<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2025/09/Java_ConvertMarkdown-1.mp4"></video><figcaption class="wp-element-caption"><em>Converting a documentation comment to Markdown</em></figcaption></figure>
<p>Does this mean you should convert your existing JavaDoc to Markdown? Not necessarily. You might just consider writing your documentation in Markdown from now on. However, should you want to convert it, IntelliJ IDEA can help you.</p>
<p>For more information on this feature, have a look at <a href="https://blog.jetbrains.com/idea/2025/04/markdown-in-java-docs-shut-up-and-take-my-comments/">Markdown in Java Docs? Shut Up and Take My Comments!</a> by Mala Gupta.</p>
<p>If you’re interested in more background on this feature, check out the video that was created when it was still in preview:</p>
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="JEP Explained. JEP 467: Markdown Documentation Comments" width="500" height="281" src="https://www.youtube.com/embed/hEWU2OMtNnw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<h2 class="wp-block-heading">Unnamed Variables & Patterns (JEP 456)</h2>
<p><a href="https://openjdk.org/jeps/456" target="_blank" rel="noopener">Unnamed variables and patterns</a> make it possible to use unnamed variables and unnamed patterns when variable declarations or nested patterns are required but the actual variables or patterns are not used. Denoting unnamed variables and patterns with an <code>_</code> clearly conveys that they are not used elsewhere in the code. IntelliJ IDEA will detect when an unused local variable could be replaced with an underscore <code>_</code> and offer a quick-fix to do so. </p>
<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2025/09/Java_UnnamedVariable-1.mp4"></video><figcaption class="wp-element-caption"><em>Renaming a variable to ‘_’</em></figcaption></figure>
<p>For more details on this feature, see <a href="https://blog.jetbrains.com/idea/2024/03/drop-the-baggage-use-_-for-unnamed-local-variables-and-patterns-in-java-22/">Drop the Baggage: Use ‘_’ for Unnamed Local Variables and Patterns in Java 22</a> by Mala Gupta.</p>
<h2 class="wp-block-heading">Virtual Threads (JEP 444) and Synchronize Virtual Threads without Pinning (JEP 491)</h2>
<p>Added in <a href="https://openjdk.org/projects/jdk/21/" target="_blank" rel="noopener">Java 21</a>, <a href="https://openjdk.org/jeps/444" target="_blank" rel="noopener">virtual threads</a> are lightweight threads. Unlike platform threads, which are limited by the number of cores in your machine, you can create a potentially unlimited number of virtual threads. Virtual threads improve the scalability of your applications. They do need platform threads to perform their work, but can release them when they are waiting for blocking code. Tooling like <a href="https://docs.oracle.com/en/java/javase/24/docs/specs/man/jcmd.html" target="_blank" rel="noopener">jcmd</a> and IntelliJ IDEA can collect thread dumps with virtual threads included.</p>
<p><a href="https://openjdk.org/jeps/491" target="_blank" rel="noopener">Synchronizing virtual threads without pinning</a> (added in Java 24) improves the scalability of Java code that uses <code>synchronized</code> code. Virtual threads that block in <code>synchronized</code> blocks now release their underlying platform threads so they can be used by other virtual threads. This last improvement comes for free when you upgrade from Java 21 to Java 24 or higher. To see this in action, watch the demo we did in the What’s New in IntelliJ IDEA 2025.2 livestream.</p>
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="What’s New in IntelliJ IDEA 2025.2 | IntelliJ IDEA Talk" width="500" height="281" src="https://www.youtube.com/embed/_nt-z0FS3tM?start=871&feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<h2 class="wp-block-heading">Runtime and security improvements</h2>
<p>Java 24 introduced some changes related to post-quantum cryptography readiness. The Java platform is preparing for the future of secure computing: </p>
<ul>
<li><a href="https://openjdk.org/jeps/496" target="_blank" rel="noopener">Quantum-Resistant Module-Lattice-Based Key Encapsulation Mechanism</a> (JEP 496) and <a href="https://openjdk.org/jeps/497" target="_blank" rel="noopener">Quantum-Resistant Module-Lattice-Based Digital Signature Algorithm</a> (JEP 497), introduced in Java 24, are NIST-standardized post-quantum algorithms (lattice-based) aimed at replacing or augmenting classic public-key operations like RSA and ECDSA. Java also receives a performance boost. Garbage collection, memory footprint, and startup times all see measurable improvements:</li>
</ul>
<ul>
<li><a href="https://openjdk.org/jeps/423" target="_blank" rel="noopener">Region Pinning for G1</a> (JEP 423) allows the G1 garbage collector to continue collecting parts of the heap even when some regions are in JNI critical sections. Instead of stalling GC during such critical regions, only “pinned” regions are excluded, reducing latency in mixed JNI/native workloads. </li>
<li>The <a href="https://openjdk.org/jeps/454" target="_blank" rel="noopener">Foreign Function & Memory API</a> (JEP 454), added in <a href="https://openjdk.org/projects/jdk/22/" target="_blank" rel="noopener">Java 22</a>, offers better performance and safety over the old JNI for foreign memory and calling native code. Bulk operations are more efficient, with less overhead in cross-boundary calls. </li>
<li><a href="https://openjdk.org/jeps/474" target="_blank" rel="noopener">ZGC: Generational Mode by Default</a> (JEP 474). The Z Garbage Collector, which is typically low-pause, uses generational mode by default starting with Java 23. Separation between young and old objects improves GC efficiency for applications that create many short-lived objects.</li>
</ul>
<p>Additionally, there are further enhancements to core libraries, previews, and performance ergonomics – for example, improvements to default GC settings, memory management, etc. </p>
<h2 class="wp-block-heading">Upgrading from Java 21 to 25</h2>
<p>You can find a video series that covers the <a href="https://www.youtube.com/playlist?list=PLX8CzqL3ArzXJ2_0FIGleUisXuUm4AESE" target="_blank" rel="noopener">Road to Java 25</a> on the official <a href="https://www.youtube.com/@java" target="_blank" rel="noopener">Java YouTube channel</a>. We recommend watching <a href="https://www.youtube.com/watch?v=9azNjz7s1Ck" target="_blank" rel="noopener">How to Upgrade to Java 25</a> by <a href="https://nipafx.dev/" target="_blank" rel="noopener">Nikolai Parlog</a>. The Oracle DevRel team also has a <a href="https://dev.java/community/java-25-launch/" target="_blank" rel="noopener">Java 25 livestream</a> on September 16, 2025.</p>
<h1 class="wp-block-heading">Conclusion</h1>
<p>As you have seen, several additions to the language make Java easier to use, both for students and teachers, as well as experienced programmers. In fact, these features completely change the experience of using Java, by no longer requiring boilerplate code like the <code>public static void main(String[] args)</code> method, allowing statements before <code>super()</code>, offering the possibility to add custom intermediary operations in streams using gatherers, allowing underscores as variable names for unused variables, and and providing scoped values as a convenient, safe, and scalable alternative to <code>ThreadLocal</code>. With all of these changes, Java is moving forward fast. IntelliJ IDEA aims to move just as quickly by supporting these new features with relevant inspections and quick-fixes, as well as new live templates, and integrating them into existing features like the <a href="https://www.jetbrains.com/help/idea/debugging-code.html" target="_blank" rel="noopener">debugger</a>. Other than improvements in the language, there are also runtime improvements that you get for free when upgrading your JDK.</p>
<p>We think Java 25 is the best Java release (so far!) and we recommend you switch to it as soon as you can. Even if you’re not using the Java language features, you will still benefit from using the new JDK. Java 25 offers a new baseline for the language, and the runtime is the fastest it has ever been.</p>
<p>If you are on Java 21, we have provided an overview of what you might have missed in terms of language features. And if you’re on an even older version of Java, now would be the time to start the process to upgrade, not just because of the benefits to you but also because the ecosystem is moving forward. Java 17 is the current <a href="https://spring.io/blog/2022/03/28/an-update-on-java-17-adoption" target="_blank" rel="noopener">baseline for Spring and Spring Boot</a> as of Spring 6 or Spring Boot 3. The upcoming <a href="https://maven.apache.org/whatsnewinmaven4.html" target="_blank" rel="noopener">Maven 4 will require JDK 17</a> to run. But don’t worry, you can still compile projects with older Java versions! The upcoming <a href="https://github.com/junit-team/junit-framework/issues/4246" target="_blank" rel="noopener">JUnit 6 is also targeting JDK 17</a>. If you are still on Java 8 (or older), now is the time to start upgrading!</p>
<p>IntelliJ IDEA will continue to support the latest Java features with Java 26. If you would like to try them out, you can download the EA versions from inside IntelliJ IDEA as soon as they become available. And, as always, please let us know if you have any feedback.</p>
]]></content:encoded>
</item>
<item>
<title>Java Annotated Monthly – September 2025</title>
<link>https://blog.jetbrains.com/idea/2025/09/java-annotated-monthly-september-2025/</link>
<dc:creator><![CDATA[Irina Mariasova]]></dc:creator>
<pubDate>Fri, 05 Sep 2025 08:24:19 +0000</pubDate>
<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/09/IJ-social-BlogFeatured-1280x720-2x-2.png</featuredImage> <category><![CDATA[java]]></category>
<category><![CDATA[kotlin]]></category>
<category><![CDATA[news]]></category>
<category><![CDATA[ai]]></category>
<category><![CDATA[ai-agent]]></category>
<category><![CDATA[java-annotated]]></category>
<category><![CDATA[java-annotated-monthly]]></category>
<category><![CDATA[spring]]></category>
<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&p=596962</guid>
<description><![CDATA[This month’s Java Annotated Monthly comes with a fresh mix of Java, Kotlin, AI, and tech news, plus a look at some great events you won’t want to miss. We’ve also got a featured section by Marit van Dijk, covering the new Java 25 release, the latest IntelliJ IDEA updates, and a playful take on […]]]></description>
<content:encoded><![CDATA[
<p>This month’s Java Annotated Monthly comes with a fresh mix of Java, Kotlin, AI, and tech news, plus a look at some great events you won’t want to miss. We’ve also got a featured section by <a href="https://maritvandijk.com/" target="_blank" rel="noopener">Marit van Dijk</a>, covering the new Java 25 release, the latest IntelliJ IDEA updates, and a playful take on learning modern Java.</p>
<p>Let’s go! </p>
<h2 class="wp-block-heading">Featured Content</h2>
<div class="about-author ">
<div class="about-author__box">
<div class="row">
<div class="about-author__box-img">
<img decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2025/09/Screenshot-2025-09-05-at-12.32.30.png" alt="" loading="lazy">
</div>
<div class="about-author__box-text">
<h4>Marit van Dijk</h4>
<p><span style="font-weight: 400;">Marit van Dijk is a software developer, Java Champion and Developer Advocate at JetBrains. She has over 20 years of diverse experience across various roles and companies, and is passionate about building awesome software in collaboration with amazing people, and making developers’ lives better. She is a frequent speaker at international conferences, writes blog posts and tutorials, creates videos, and is a contributor to the book “</span><a href="https://www.oreilly.com/library/view/97-things-every/9781491952689/" target="_blank" rel="noopener"><span style="font-weight: 400;">97 Things Every Java Programmer Should Know</span></a><span style="font-weight: 400;">” (O’Reilly Media).</span></p>
</div>
</div>
</div>
</div>
<p>Welcome to Java Annotated Monthly for September. For the folks in Europe / the Northern hemisphere, I hope that you have had a great summer and were able to disconnect from work.</p>
<p>This month, I’m excited for the start of the conference season with <a href="https://vimeo.com/1115439883" target="_blank" rel="noopener">my first talk</a> at <a href="https://2025.javazone.no/en" target="_blank" rel="noopener">JavaZone</a> and, of course, the release of <a href="https://openjdk.org/projects/jdk/25/" target="_blank" rel="noopener">Java 25</a> on September 16, 2025. This release comes with some nice changes to the language: <a href="https://openjdk.org/jeps/512" target="_blank" rel="noopener">Compact Source Files and Instance Main Methods</a> and <a href="https://openjdk.org/jeps/511" target="_blank" rel="noopener">Module Import Declarations</a> make it easier to get started with Java, <a href="https://openjdk.org/jeps/513" target="_blank" rel="noopener">Flexible Constructor Bodies</a> allow statements in a constructor before calling super(), so you can validate your data before constructing objects, and <a href="https://openjdk.org/jeps/506" target="_blank" rel="noopener">Scoped Values</a> make managing thread-local data more convenient, safe, and scalable. This feature will be even more useful with <a href="https://openjdk.org/jeps/505" target="_blank" rel="noopener">Structured Concurrency</a> (still in preview). In addition, there are improvements in performance and performance insights, as well as several other changes. We will write a blog post with more details later this month.</p>
<p>Java 25 support was introduced in <a href="https://blog.jetbrains.com/idea/2025/08/intellij-idea-2025-2/">IntelliJ IDEA 2025.2</a>, with additional support added in <a href="https://blog.jetbrains.com/idea/2025/08/intellij-idea-2025-2-1/">2025.2.1</a>. IntelliJ IDEA already introduced support for Java 25 in <a href="https://blog.jetbrains.com/idea/2025/08/intellij-idea-2025-2/">2025.2</a>, and additional support was added in <a href="https://blog.jetbrains.com/idea/2025/08/intellij-idea-2025-2-1/">2025.2.1</a>. In case you missed it, check out the <a href="https://www.youtube.com/watch?v=_nt-z0FS3tM" target="_blank" rel="noopener">What’s New in IntelliJ IDEA 2025.2 stream</a>, where we show you Java 25 support, Virtual Threads Debugger, Spring Debugger and Spring Modulith support, support for Maven 4 (which may also be released soon), and a sneak peek of a new feature we are working on!</p>
<p>Java 25 will be an “LTS” version. <a href="https://www.youtube.com/watch?v=x6-kyQCYhNo" target="_blank" rel="noopener">Or is it?</a> If you are updating from Java 21, watch this great video by <a href="https://nipafx.dev/" target="_blank" rel="noopener">Nikolai Parlog</a> on <a href="https://www.youtube.com/watch?v=9azNjz7s1Ck" target="_blank" rel="noopener">How to Upgrade to Java 25</a>, showing you some of the problems you might encounter when upgrading and how to solve them, the overview of <a href="https://www.youtube.com/watch?v=X0-TGhktFnE" target="_blank" rel="noopener">All New Java Language Features Since Java 21</a> by <a href="https://x.com/JosePaumard" target="_blank">José Paumard</a>, and other videos in <a href="https://www.youtube.com/hashtag/roadto25" target="_blank" rel="noopener">the series</a>.</p>
<p>In <a href="https://www.youtube.com/watch?v=GXAEUVgVAEY" target="_blank" rel="noopener">Learning Modern Java the Playful Way</a>, fellow Java Champion <a href="https://softwaregarden.dev/en/" target="_blank" rel="noopener">Piotr Przybył</a> and I show you how to upgrade your code using live demos (and silly jokes). You can catch a slightly updated version of this talk at several conferences this Fall/Autumn. To find out where I’ll be, check <a href="https://maritvandijk.com/events/" target="_blank" rel="noopener">my website</a>. If you happen to be at any of these events, please come say hi!</p>
<h2 class="wp-block-heading">Java News</h2>
<p>Do not miss the latest Java news: </p>
<ul>
<li>Java News Roundup <a href="https://www.infoq.com/news/2025/08/java-news-roundup-jul28-2025/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">1</a>, <a href="https://www.infoq.com/news/2025/08/java-news-roundup-aug04-2025/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">2</a>, <a href="https://www.infoq.com/news/2025/08/java-news-roundup-aug11-2025/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">3</a>, <a href="https://www.infoq.com/news/2025/08/java-news-roundup-aug18-2025/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">4</a></li>
<li><a href="https://inside.java/2025/08/14/newscast-97/" target="_blank" rel="noopener">Java Architects Answer Your Questions – Inside Java Newscast #97</a></li>
</ul>
<h2 class="wp-block-heading">Java Tutorials and Tips</h2>
<p>Learn more about where Java is heading and how to make the most of its latest features:</p>
<ul>
<li><a href="https://foojay.io/today/why-java-is-still-worth-learning-in-2025-a-developers-25-year-journey/" target="_blank" rel="noopener">Why Java is Still Worth Learning in 2025: A Developer’s 25-Year Journey</a></li>
<li><a href="https://dzone.com/articles/how-to-build-an-mcp-server-with-java-sdk" target="_blank" rel="noopener">How to Build an MCP Server With Java SDK</a></li>
<li><a href="https://foojay.io/today/pattern-matching-across-different-languages/" target="_blank" rel="noopener">Pattern-Matching Across Different Languages</a></li>
<li><a href="https://hirt.se/blog/?p=1587" target="_blank" rel="noopener">“Best of Java” Feature Face-off 2025</a></li>
<li><a href="https://www.selikoff.net/2025/08/10/using-the-java-playground/" target="_blank" rel="noopener">Using the Java Playground</a></li>
<li><a href="https://inside.java/2025/08/12/jvmls-final-to-immutable/" target="_blank" rel="noopener">The Not-So-Final Word on Final #JVMLS</a></li>
<li><a href="https://foojay.io/today/domain-driven-design-in-java-a-practical-guide/" target="_blank" rel="noopener">Domain-Driven Design in Java: A Practical Guide</a></li>
<li><a href="https://inside.java/2025/08/21/jvmls-growing-java-language/" target="_blank" rel="noopener">Growing the Java Language #JVMLS</a></li>
<li><a href="https://inside.java/2025/08/24/roadto25-upgrade/" target="_blank" rel="noopener">How to Upgrade to Java 25 #RoadTo25</a></li>
<li><a href="https://inside.java/2025/08/28/roadto25-aot/" target="_blank" rel="noopener">Ahead-of-Time Computation #RoadTo25</a></li>
<li><a href="https://foojay.io/today/taking-java-arrays-to-another-dimension/" target="_blank" rel="noopener">Taking Java Arrays to Another Dimension</a></li>
<li><a href="https://inside.java/2025/08/31/roadto25-java-language/" target="_blank" rel="noopener">All New Java Language Features Since Java 21 #RoadTo25</a></li>
<li><a href="https://marcphilipp.de/blog/2025/08/16/stf-milestone-5-discovery-issues/" target="_blank" rel="noopener">STF Milestone 5: Discovery Issues</a></li>
<li><a href="https://www.youtube.com/watch?v=n-YK3B4_xPA" target="_blank" rel="noopener">Solving Java’s 1 Billion Row Challenge (Ep. 1) | With @caseymuratori</a></li>
</ul>
<h2 class="wp-block-heading">Kotlin Corner</h2>
<p>Check out this section for everything Kotlin, from fresh updates to handy tips and tricks: </p>
<ul>
<li><a href="https://blog.jetbrains.com/platform/2025/08/kotlin-notebook-meets-intellij-platform-advancing-ide-plugin-development/">Kotlin Notebook Meets IntelliJ Platform: Advancing IDE Plugin Development</a></li>
<li><a href="https://blog.jetbrains.com/kotlin/2025/08/how-kotlin-notebook-helps-teach-programming/">How Kotlin Notebook Helps You Teach Programming</a></li>
<li><a href="https://www.azul.com/webinar/how-to-boost-jvm-scalability-and-performance-with-kotlin-and-azul-runtime/" target="_blank" rel="noopener">How to Boost JVM Scalability and Performance With Kotlin and Azul Runtime</a></li>
<li><a href="https://blog.jetbrains.com/ai/2025/07/when-tool-calling-becomes-an-addiction-debugging-llm-patterns-in-koog/">When Tool-Calling Becomes an Addiction: Debugging LLM Patterns in Koog </a></li>
<li><a href="https://blog.jetbrains.com/ai/2025/07/building-better-agents-what-s-new-in-koog-0-3-0/">Building Better Agents: What’s New in Koog 0.3.0 </a></li>
<li><a href="https://www.youtube.com/watch?v=vysVNg4IuUo&t=4526s" target="_blank" rel="noopener">Kickstarting AI Agent Development With Koog </a></li>
<li><a href="https://www.youtube.com/watch?v=vDtnqQmiyck&t=1s" target="_blank" rel="noopener">Building Smarter AI Agents With Koog</a> </li>
<li><a href="https://www.youtube.com/watch?v=AGHONAx8gjQ&t=22s" target="_blank" rel="noopener">How to Build Scalable AI Agents With Kotlin, Ktor, & Koog </a></li>
<li><a href="https://www.youtube.com/watch?v=YIelyGgME5g" target="_blank" rel="noopener">GPT-5 Writes Kotlin! Trying the Newest OpenAI Model in Junie and AI Assistant </a></li>
<li><a href="https://blog.jetbrains.com/kotlin/2025/07/modular-ktor-building-backends-for-scale/">Modular Ktor: Building Backends for Scale </a></li>
<li><a href="https://www.youtube.com/watch?v=mB6cJAXxFGk" target="_blank" rel="noopener">Talking Kotlin #140: kotlinx.rpc</a> </li>
<li><a href="https://rakhman.info/blog/kotlin-emerging-patterns-with-context-parameters/" target="_blank" rel="noopener">Kotlin: Emerging Patterns With Context Parameters</a></li>
<li><a href="https://blog.jetbrains.com/kotlin/2025/08/exploring-data-science-with-kotlin-a-powerlifting-case-study/">Exploring Data Science With Kotlin: A Powerlifting Case Study</a></li>
</ul>
<h2 class="wp-block-heading">AI</h2>
<p>Stay in the loop with the latest AI news and insights you won’t want to miss: </p>
<ul>
<li><a href="https://medium.com/@springrod/you-can-build-better-ai-agents-in-java-than-python-868eaf008493" target="_blank" rel="noopener">You Can Build Better AI Agents in Java Than Python</a></li>
<li><a href="https://www.infoq.com/presentations/ai-trends/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">Presentation: The Form of AI</a></li>
<li><a href="https://blog.jetbrains.com/ai/2025/08/introducing-next-edit-suggestions-in-jetbrains-ai-assistant/">Introducing Next Edit Suggestions in JetBrains AI Assistant</a></li>
<li><a href="https://blog.jetbrains.com/ai/2025/08/a-simpler-more-transparent-model-for-ai-quotas/">A Simpler, More Transparent Model for AI Quotas</a></li>
<li><a href="https://glaforge.dev/posts/2025/08/06/vibe-coding-a-chrome-extension-with-gemini-cli-to-summarize-articles/" target="_blank" rel="noopener">Vibe-Coding a Chrome Extension With Gemini CLI to Summarize Articles</a></li>
<li><a href="https://www.infoq.com/presentations/microservices-ai-systems/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">Presentation: Key Lessons From Shipping AI Products Beyond the Hype</a></li>
<li><a href="https://www.infoq.com/news/2025/08/figma-ai/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">How Figma Uses AI to Support, Not Replace, the Designer</a></li>
<li><a href="https://foojay.io/today/do-we-understand-the-value-of-ai-knowledge/" target="_blank" rel="noopener">Do We Understand the Value of AI Knowledge?</a></li>
<li><a href="https://blog.jetbrains.com/kineto/2025/08/make-your-ideas-clickable-with-kineto-by-jetbrains/">Make Your Ideas Clickable With Kineto by JetBrains</a></li>
<li><a href="https://www.infoq.com/news/2025/08/language-models-personality/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">Anthropic Investigates How Large Language Models Develop a Character</a></li>
<li><a href="https://www.infoq.com/presentations/ai-coding-agents/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">From Autocomplete to Agents: AI Coding State of Play</a></li>
<li><a href="https://www.infoq.com/presentations/multi-agent-workflow/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">Presentation: 10 Reasons Your Multi-Agent Workflows Fail and What You Can Do About It</a></li>
<li><a href="https://foojay.io/today/ai-gives-time-not-confidence-developer-productivity-toolkit/" target="_blank" rel="noopener">AI Gives Time, Not Confidence: Developer Productivity Toolkit</a></li>
<li><a href="https://medium.com/@springrod/build-better-agents-in-java-than-python-embabel-vs-pydantic-ai-ab373c149108" target="_blank" rel="noopener">Build Better Agents in Java Than Python: Embabel vs Pydantic AI</a></li>
</ul>
<h2 class="wp-block-heading">Languages, Frameworks, Libraries, and Technologies</h2>
<p>Explore other technologies and frameworks that help boost productivity and make everyday development smoother:</p>
<ul>
<li>This Week in Spring <a href="https://spring.io/blog/2025/08/05/this-week-in-spring-august-5th-2025" target="_blank" rel="noopener">1</a>, <a href="https://spring.io/blog/2025/08/12/this-week-in-spring-august-12th-2025" target="_blank" rel="noopener">2</a>, <a href="https://spring.io/blog/2025/08/19/this-week-in-spring-august-19th-2025" target="_blank" rel="noopener">3</a>, <a href="https://spring.io/blog/2025/08/26/this-week-in-spring-august-26th-2025" target="_blank" rel="noopener">4</a></li>
<li><a href="https://blog.jetbrains.com/idea/2025/08/debugging-transactions-let-spring-debugger-do-the-heavy-lifting/">Debugging Transactions? Let Spring Debugger Do the Heavy Lifting</a></li>
<li><a href="https://www.youtube.com/watch?v=fGExm_Rlees" target="_blank" rel="noopener">IntelliJ IDEA 2025.2 and Spring Modulith</a></li>
<li><a href="https://www.youtube.com/watch?v=zl5U8KO28rM" target="_blank" rel="noopener">Breaking the Architecture Bottleneck • Andrew Harmel-Law & Marit van Dijk</a></li>
<li><a href="https://foojay.io/today/monolith-vs-microservices-2025/" target="_blank" rel="noopener">🧱 Monolith or 🧩 Microservices in 2025?</a></li>
<li><a href="https://foojay.io/today/semantic-caching-with-springboot-redis/" target="_blank" rel="noopener">Semantic Caching With SpringBoot & Redis</a></li>
<li><a href="https://foojay.io/today/new-features-in-jakarta-ee-11-with-examples/" target="_blank" rel="noopener">New Features in Jakarta EE 11, With Examples</a></li>
<li><a href="https://foojay.io/today/preparing-for-spring-framework-7-and-spring-boot-4/" target="_blank" rel="noopener">Preparing for Spring Framework 7 and Spring Boot 4</a></li>
<li><a href="https://www.infoq.com/presentations/rust-ergonomy-performance/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">Fearless Programming With Rust</a></li>
</ul>
<h2 class="wp-block-heading">Conferences and Events</h2>
<p>Visit the coolest events of the month, both offline and online:</p>
<ul>
<li><a href="https://www.youtube.com/playlist?list=PLPZy-hmwOdEWDuK3AXXhelJWGUqve1UVT" target="_blank" rel="noopener">The Marco Show</a> – Join a cool new podcast with <a href="https://www.marcobehler.com/" target="_blank" rel="noopener">Marco Behler</a> as a host and the best guests from the development world. </li>
<li><a href="https://2025.javazone.no/" target="_blank" rel="noopener">JavaZone</a> – Oslo, Norway, September 3–4, JetBrains will host a booth there. You are welcome to come and meet us. </li>
<li><a href="https://xn--jalapeo-9za.net/" target="_blank" rel="noopener">Jalapeño Unconference by JConfMexico</a> – Puerto Morelos, Mexico, September 13–14.</li>
<li><a href="https://javaforumnord.de/2025/" target="_blank" rel="noopener">Java Forum Nord</a> – Hannover, Germany, September 16.</li>
<li><a href="https://jcconf.tw/2025/" target="_blank" rel="noopener">JC Conference Taiwan</a> – Taipei, Taiwan, September 19. Do not miss our booth!</li>
<li><a href="https://2025.confitura.pl/" target="_blank" rel="noopener">Confitura 2025</a> – Warsaw, September 19–20 , <a href="https://x.com/MaritvanDijk77" target="_blank">Marit van Dijk</a> will give a talk here. </li>
<li><a href="https://amsterdam.ai4devs.io/" target="_blank" rel="noopener">AI4DEVS</a> – September 19, <a href="https://x.com/antonarhipov?lang=en" target="_blank">Anton Arhipov</a> will talk about building AI agents in Kotlin</li>
<li><a href="https://jugsaxony.org/day/" target="_blank" rel="noopener">JUG Saxony Day</a> – Dresden, Germany, September 25–26.</li>
<li><a href="https://crete.voxxeddays.com/" target="_blank" rel="noopener">Voxxed Days Crete</a> – Crete, Greece, September 26–27.</li>
<li><a href="https://www.dev2next.com/" target="_blank" rel="noopener">Dev2Next</a> – Colorado Springs, USA, September 29 – October 2.</li>
<li><a href="https://jaxlondon.com/" target="_blank" rel="noopener">JAX London</a> – London, United Kingdom, September 29 – October 3.</li>
<li><a href="https://gotocph.com/2025" target="_blank" rel="noopener">GOTO Copenhagen</a> – Copenhagen, Denmark, September 29 – October 3.</li>
<li><a href="https://www.youtube.com/playlist?list=PLPZy-hmwOdEV1aAV4qqXkqde7OpjsVLfb" target="_blank" rel="noopener">All talks from IntelliJ IDEA Conf 2025</a> – A lot of useful content and insights.</li>
<li><a href="https://thegeekgathering.org/" target="_blank" rel="noopener">The Geek Gathering</a> – Osijek, 2-3 Oct 2025. Marit van Dijk will share her thoughts on learning modern Java the playful way. </li>
</ul>
<h2 class="wp-block-heading">Culture and Community</h2>
<p>Find articles on developer life, career growth, and the lighter side of working in tech:</p>
<ul>
<li><a href="https://queen-of-questions.kit.com/posts/how-do-you-ask-questions" target="_blank" rel="noopener">How Do You Ask Questions?</a></li>
<li><a href="https://www.infoq.com/news/2025/08/empathy-driven-platform-teams/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">How Empathy-Driven Platform Teams Can Support Software Development</a></li>
<li><a href="https://www.infoq.com/podcasts/lean-software-delivery-without-jira/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">Continuous Deployment and Pair Programming for Lean Software Delivery Even Without Jira</a></li>
<li><a href="https://www.infoq.com/news/2025/08/european-cloud-sovereignty/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">The European Cloud Dilemma: Innovation Versus Digital Sovereignty</a></li>
<li><a href="https://mkedemo.wordpress.com/2025/08/18/testability-is-about-people-not-just-code/" target="_blank" rel="noopener">Testability Is About People, Not Just Code</a></li>
<li><a href="https://dukescorner.libsyn.com/trisha-gee-its-all-about-relationships-and-people" target="_blank" rel="noopener">Trisha Gee: It’s All About Relationships and People</a></li>
</ul>
<h2 class="wp-block-heading">And Finally…</h2>
<p>Check out IntelliJ IDEA’s latest content picks for tips, updates, and inspiration:</p>
<ul>
<li><a href="https://blog.jetbrains.com/idea/2025/08/intellij-idea-2025-2/">IntelliJ IDEA 2025.2 Is Here!</a></li>
<li><a href="https://blog.jetbrains.com/idea/2025/08/whats-fixed-intellij-idea-2025-2/">What’s Fixed in IntelliJ IDEA 2025.2</a></li>
<li><a href="https://www.youtube.com/watch?v=_nt-z0FS3tM" target="_blank" rel="noopener">What’s New in IntelliJ IDEA 2025.2 | IntelliJ IDEA Talk</a></li>
</ul>
<p>That’s it for today! We’re always collecting ideas for the next Java Annotated Monthly – send us your suggestions via <a href="https://mail.google.com/mail/u/0/?fs=1&tf=cm&source=mailto&to=JAM@jetbrains.com" target="_blank" rel="noopener">email</a> or <a href="https://x.com/intellijidea?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor" target="_blank">X</a> by September 20. Don’t forget to check out our archive of <a href="https://www.jetbrains.com/lp/jam/" target="_blank" rel="noopener">past JAM issues</a> for any articles you might have missed!</p>
]]></content:encoded>
</item>
<item>
<title>Improved Annotation Handling in Kotlin 2.2: Less Boilerplate, Fewer Surprises </title>
<link>https://blog.jetbrains.com/idea/2025/09/improved-annotation-handling-in-kotlin-2-2-less-boilerplate-fewer-surprises/</link>
<dc:creator><![CDATA[Teodor Irkhin]]></dc:creator>
<pubDate>Thu, 04 Sep 2025 11:56:15 +0000</pubDate>
<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/08/IJ-social-BlogFeatured-1280x720-2x-4.png</featuredImage> <category><![CDATA[kotlin]]></category>
<category><![CDATA[annotations]]></category>
<category><![CDATA[boilerplate]]></category>
<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&p=595295</guid>
<description><![CDATA[Many developers have run into subtle issues with annotations when working with Kotlin and frameworks like Spring or JPA-based persistence frameworks. For instance, an annotation applied to a constructor parameter might not always end up in the property or backing field where the framework expects it. This often means annotations don’t land where they’re needed. […]]]></description>
<content:encoded><![CDATA[
<p>Many developers have run into subtle issues with annotations when working with Kotlin and frameworks like Spring or JPA-based persistence frameworks. For instance, an annotation applied to a constructor parameter might not always end up in the property or backing field where the framework expects it.</p>
<p>This often means annotations don’t land where they’re needed. For example, bean validation checks might only happen when the object was first created, but not when its properties were later updated. The result? Confusing bugs, surprising runtime behavior, and sometimes even the need to dig into bytecode to see what’s really going on. For example, validation might not be enforced when entities are loaded or updated from the database.</p>
<p>With Kotlin 2.2, we’re addressing this problem. A new default rule makes annotations land where developers expect them to, reducing boilerplate and aligning better with popular frameworks.</p>
<p>Consider this simple JPA entity:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@Entity
class Order(
@Id
@GeneratedValue
val id: Long,
@NotBlank
var name: String,
@Email
var email: String
)</pre>
<p>At first glance this looks correct. But in Kotlin versions before 2.2, the default rule applied these annotations only to the constructor parameter (<code>@param</code>).</p>
<p>If we look at the decompiled code, it actually becomes:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public class Order {
@Id
@GeneratedValue
private final long id;
@NotNull
private String name;
@NotNull
private String email;
public Order(long id, @NotBlank @NotNull String name, @Email @NotNull String email) {
Intrinsics.checkNotNullParameter(name, "name");
Intrinsics.checkNotNullParameter(email, "email");
super();
this.id = id;
this.name = name;
this.email = email;
}
…
}</pre>
<p>Validation annotations like <code>@NotBlank</code> and <code>@Email</code> weren’t placed on the field/property – they only validated object construction, not property updates.</p>
<p>This mismatch has been a common source of confusion.</p>
<p><strong>Previous workaround: Explicit use-site targets</strong></p>
<p>The fix was to explicitly mark the targets, for example with <code>@field</code>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@Entity
class Order(
@field:Id
@GeneratedValue
val id: Long,
@field:NotNull
var name: String,
@field:Email
var email: String
)</pre>
<p>so that becomes:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public class Order {
@Id
@GeneratedValue
private final long id;
@NotBlank
@NotNull
private String name;
@Email
@NotNull
private String email;
…
}</pre>
<p>This approach works, but clutters the code with extra syntax. It also requires developers to know about Kotlin’s use-site targets and remember which one each framework expects.</p>
<p><strong>Kotlin 2.2: A new default that just works</strong></p>
<p>Starting with Kotlin 2.2, annotations without an explicit use-site target are applied to the constructor parameter and the property or field, aligning behavior with what most frameworks expect.</p>
<p>That means our original code now works as expected, without requiring any additional annotations:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@Entity
class Order(
@Id
@GeneratedValue
val id: Long,
@NotBlank
var name: String,
@Email
var email: String
)</pre>
<p><strong>With the new rule:</strong></p>
<ul>
<li>Bean validation annotations are present on the property, so validation applies on updates as well as on constructions.</li>
<li>The code looks like clean and idiomatic Kotlin, without repetitive <code>@field</code>: syntax or surprising behavior.</li>
</ul>
<p><strong>How to enable the new behavior</strong></p>
<p>🔗 Kotlin 2.2 is required.</p>
<p>By default, the compiler issues warnings if your code’s behavior may change under the new rule.</p>
<p>In IntelliJ IDEA, you can also use the quick-fix on a warning to enable the new default project-wide.</p>
<figure class="wp-block-image"><img decoding="async" loading="lazy" width="1600" height="248" src="https://blog.jetbrains.com/wp-content/uploads/2025/09/image-3.png" alt="" class="wp-image-596599"/></figure>
<p>To switch fully to the new behavior in your project, enable it in IntelliJ IDEA via Gradle’s settings.</p>
<p>Add the following to your <code>build.gradle.kts</code>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">kotlin {
compilerOptions {
freeCompilerArgs.add("-Xannotation-default-target=param-property")
}
}
If you prefer to keep the old behavior, you can use:
kotlin {
compilerOptions {
freeCompilerArgs.add("-Xannotation-defaulting=first-only")
}
}</pre>
<p>Or stay in a transitional mode with warnings:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">kotlin {
compilerOptions {
freeCompilerArgs.add("-Xannotation-defaulting=first-only-warn")
}
}</pre>
<p><strong>Why this matters</strong></p>
<p>This change makes annotation behavior more predictable, reduces boilerplate, and eliminates a class of subtle bugs that Spring and JPA developers have faced for years. It’s also a step toward making Kotlin’s integration with major frameworks smoother.</p>
<p>More details can be found in<a href="https://youtrack.jetbrains.com/issue/KT-73255" target="_blank" rel="noopener"> KT-73255</a> and <a href="https://github.com/Kotlin/KEEP/blob/main/proposals/KEEP-0402-annotation-target-in-properties.md" target="_blank" rel="noopener">KEEP-402</a>.</p>
<p>This update is part of our broader initiative to improve the Kotlin + Spring experience. Stay tuned for more inspections, tooling improvements, and language updates that make working with these frameworks even better.</p>
<p>Happy coding!</p>
]]></content:encoded>
</item>
<item>
<title>Enhanced Vulnerable API Detection in JetBrains IDEs and Qodana</title>
<link>https://blog.jetbrains.com/idea/2025/09/enhanced-vulnerable-api-detection-in-jetbrains-ides-and-qodana/</link>
<dc:creator><![CDATA[Dmitry Protsenko]]></dc:creator>
<pubDate>Wed, 03 Sep 2025 08:20:35 +0000</pubDate>
<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/09/IJ-social-BlogFeatured-1280x720-2x.png</featuredImage> <category><![CDATA[news]]></category>
<category><![CDATA[plugins]]></category>
<category><![CDATA[package-checker]]></category>
<category><![CDATA[security-checks]]></category>
<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&p=596245</guid>
<description><![CDATA[At the start of the year, we announced a partnership with Mend.io to maximize code security in JetBrains tools. The partnership provided us with quality data about vulnerable and malicious packages, allowing our IDEs and Qodana to spot them for you in your projects. Over the last few months, we have been working on integrating […]]]></description>
<content:encoded><![CDATA[
<p>At the start of the year, we <a href="https://blog.jetbrains.com/idea/2025/01/maximize-code-security-in-jetbrains-ides-and-qodana-with-mend-io/" target="_blank" rel="noreferrer noopener">announced</a> a partnership with <a href="http://mend.io" target="_blank" rel="noreferrer noopener">Mend.io</a> to maximize code security in JetBrains tools. The partnership provided us with quality data about vulnerable and malicious packages, allowing our IDEs and <a href="https://www.jetbrains.com/qodana/?source=google&medium=cpc&campaign=EMEA_en_DE_Qodana_Branded&term=qodana&content=700237781266&adgroup=&gad_source=1&gad_campaignid=21312253082&gbraid=0AAAAADloJzigxa4UK63wopjFE-UY98RoR&gclid=Cj0KCQjwzt_FBhCEARIsAJGFWVm_tPhEHwHIEn7xr_zST5jNgh0EZAzyHU1ctk88fmYyTFS0yBxiPQ8aAjV9EALw_wcB" target="_blank" rel="noopener">Qodana</a> to spot them for you in your projects.</p>
<p>Over the last few months, we have been working on integrating additional data about vulnerable APIs in open-source libraries, provided by the software composition analysis (SCA) data provider. That data has now been delivered to our <a href="https://plugins.jetbrains.com/plugin/18337-package-checker" target="_blank" rel="noreferrer noopener">Package Checker</a> plugin, making it an even more effective tool for maintaining code security.</p>
<h2 class="wp-block-heading">The <em>Vulnerable API</em> feature</h2>
<p>The <a href="https://plugins.jetbrains.com/plugin/18337-package-checker" target="_blank" rel="noreferrer noopener">Package Checker</a> plugin is powered by data from <a href="http://mend.io" target="_blank" rel="noreferrer noopener">Mend.io</a> about vulnerable APIs and provides code security analysis to detect the usage of vulnerable methods from open-source libraries. </p>
<p>Our team has recently been working on enriching <a href="http://mend.io" target="_blank" rel="noreferrer noopener">Mend.io</a> data to cover more public methods from open-source libraries by analyzing call graphs. This means that the plugin has more data at its disposal than ever before, covering more cases.</p>
<p>The plugin’s <em>Vulnerable API</em> feature works for various languages, including Java, Kotlin, C# (in Rider and ReSharper), JavaScript, TypeScript, and Python. Here’s how to make sure all the necessary inspections are enabled in the active inspection profile:</p>
<ul>
<li>First, open the IDE settings (⌘, on macOS or <em>Ctrl+Alt+S</em> on Windows/Linux) and go to <em>Editor </em>|<strong> </strong><em>Inspections</em>.<strong> </strong></li>
<li>In the search bar, type “Vulnerable API” and you’ll see the list of related inspections (the final list depends on the plugins you have installed). </li>
<li>Simply select the ones you need from the list.</li>
</ul>
<figure class="wp-block-image size-full"><img decoding="async" loading="lazy" width="1964" height="1446" src="https://blog.jetbrains.com/wp-content/uploads/2025/09/CleanShot-2025-09-02-at-12.49.00-2x.png" alt="The Settings window" class="wp-image-596177"/></figure>
<p><em>The Settings window</em></p>
<h2 class="wp-block-heading">How to use it</h2>
<p>The inspections provided by the <em>Vulnerable API</em> feature will highlight vulnerable methods from open-source libraries in your code. When you hover over the highlighted code, you’ll see a list of vulnerabilities found in a given API call. To address the problem, pull up the context actions (⌥⏎ on macOS or <em>Alt+Enter</em> on Windows/Linux) and select <em>Go to file with declared dependency</em> from the menu. </p>
<figure class="wp-block-image size-full"><img decoding="async" loading="lazy" width="3008" height="1668" src="https://blog.jetbrains.com/wp-content/uploads/2025/09/Vulnerable-API-highlighting.png" alt="Vulnerable API highlighting" class="wp-image-596130"/></figure>
<p><em>Vulnerable API highlighting </em></p>
<p>This will take you to the place in the build file where the dependency is declared. There, you can again use ⌥⏎ (on macOS) or <em>Alt+Enter</em> (on Windows/Linux) and select <em>Update to unaffected version</em>. The vulnerability list contains links to additional information in the <a href="http://mend.io" target="_blank" rel="noreferrer noopener">Mend.io</a> vulnerability database.</p>
<figure class="wp-block-image size-full"><img decoding="async" loading="lazy" width="3817" height="2110" src="https://blog.jetbrains.com/wp-content/uploads/2025/09/Vulnerable-dependencies-highlighting.png" alt="Vulnerable dependency highlighting" class="wp-image-596141"/></figure>
<p><em>Vulnerable dependency highlighting</em></p>
<p>The Package Checker plugin also provides a way to see the list of vulnerabilities in a dedicated window inside the IDE without opening a browser. You can simply use the <em>Show all…</em> link. This will take you to the <em>Vulnerable Dependencies </em>window, which shows the overall state of the project and provides information about every detected vulnerable dependency.</p>
<figure class="wp-block-image size-full"><img decoding="async" loading="lazy" width="3819" height="2109" src="https://blog.jetbrains.com/wp-content/uploads/2025/09/Vulnerable-dependencies-window.png" alt="The Vulnerable Dependencies window" class="wp-image-596152"/></figure>
<p><em>The Vulnerable Dependencies window</em></p>
<p>The <em>Vulnerable API</em> and <em>Vulnerable Dependencies</em> features are available in Qodana and can be used in CI/CD or security assessment processes.</p>
<figure class="wp-block-image size-full"><img decoding="async" loading="lazy" width="2387" height="2421" src="https://blog.jetbrains.com/wp-content/uploads/2025/09/Vulnerable-dependencies-in-Qodana.png" alt="Vulnerable API feature in Qodana" class="wp-image-596163"/></figure>
<p><em>Vulnerable API feature in Qodana</em></p>
<h2 class="wp-block-heading">Looking ahead</h2>
<p>These improvements strengthen the existing code security features in JetBrains IDEs and Qodana by providing enhanced vulnerability detection capabilities. Update your IDE to the latest version and enable the <em>Vulnerable API</em> inspections to identify security risks in your codebase.</p>
<p>You can learn more about the Package Checker plugin from <a href="https://plugins.jetbrains.com/plugin/18337-package-checker" target="_blank" rel="noreferrer noopener">its page</a> on JetBrains Marketplace, and you can find more information about how to use it in <a href="https://www.jetbrains.com/help/idea/package-analysis.html#find-vulnerable-api" target="_blank" rel="noreferrer noopener">the documentation</a>. For more details about our collaboration with <a href="http://mend.io" target="_blank" rel="noreferrer noopener">Mend.io</a>, check out this <a href="https://blog.jetbrains.com/idea/2025/01/maximize-code-security-in-jetbrains-ides-and-qodana-with-mend-io/" target="_blank" rel="noreferrer noopener">blog post</a>.</p>
]]></content:encoded>
</item>
<item>
<title>IntelliJ IDEA 2025.2.1 Is Out!</title>
<link>https://blog.jetbrains.com/idea/2025/08/intellij-idea-2025-2-1/</link>
<dc:creator><![CDATA[Julia Shashkova]]></dc:creator>
<pubDate>Fri, 29 Aug 2025 09:34:49 +0000</pubDate>
<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/08/IJ-social-BlogFeatured-202521.png</featuredImage> <category><![CDATA[releases]]></category>
<category><![CDATA[bug-fix-update]]></category>
<category><![CDATA[intellij-idea-2025-2]]></category>
<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&p=594278</guid>
<description><![CDATA[We’ve just released the first minor update for IntelliJ IDEA 2025.2 – v2025.2.1. You can update to this version from inside the IDE, via the Toolbox App, or by using snaps for Ubuntu. You can also download it from our website. This release includes the following improvements: To find out more about the resolved issues, […]]]></description>
<content:encoded><![CDATA[
<p>We’ve just released the first minor update for IntelliJ IDEA 2025.2 – v2025.2.1.</p>
<p>You can update to this version from inside the IDE, via the <a href="https://www.jetbrains.com/toolbox-app/" target="_blank" rel="noopener">Toolbox App</a>, or by using snaps for Ubuntu. You can also download it from our <a href="https://www.jetbrains.com/idea/download/" target="_blank" rel="noopener">website</a>.</p>
<p>This release includes the following improvements:</p>
<ul>
<li>The IDE correctly interprets and manages EAR artifact configurations as expected. [<a href="https://youtrack.jetbrains.com/issue/IDEA-373295" target="_blank" rel="noopener">IDEA-373295</a>]</li>
<li>The <em>Create Branch</em> action is now accessible from all parts of the UI again. [<a href="https://youtrack.jetbrains.com/issue/IJPL-199191" target="_blank" rel="noopener">IJPL-199191</a>]</li>
<li>Exporting diagrams as SVG now works as intended. [<a href="https://youtrack.jetbrains.com/issue/IJPL-174653" target="_blank" rel="noopener">IJPL-174653</a>]</li>
<li>Maven Runner now properly recognizes and handles JVM options starting with the -X prefix in the <em>VM Options</em> field as expected. [<a href="https://youtrack.jetbrains.com/issue/IDEA-376845" target="_blank" rel="noopener">IDEA-376845</a>]</li>
<li>Terminal processes again terminate correctly on Windows. [<a href="https://youtrack.jetbrains.com/issue/IJPL-159752" target="_blank" rel="noopener">IJPL-159752</a>]</li>
<li>The IDE again correctly recognizes valid WebLogic server home paths and runs the WebLogic server. [<a href="https://youtrack.jetbrains.com/issue/IDEA-376172" target="_blank" rel="noopener">IDEA-376172</a>, <a href="https://youtrack.jetbrains.com/issue/IDEA-377454" target="_blank" rel="noopener">IDEA-377454</a>]</li>
<li>The IDE now correctly runs the main() functions in Kotlin projects built with Gradle 9.0. [<a href="https://youtrack.jetbrains.com/issue/IDEA-376030" target="_blank" rel="noopener">IDEA-376030</a>]</li>
<li>Maven run configurations again properly recognize and execute custom POM files specified with the -f option. [<a href="https://youtrack.jetbrains.com/issue/IDEA-376875" target="_blank" rel="noopener">IDEA-376875</a>] </li>
</ul>
<p>To find out more about the resolved issues, please refer to the <a href="https://youtrack.jetbrains.com/articles/IDEA-A-2100662491/IntelliJ-IDEA-2025.2.1-252.25557.131-build-Release-Notes" data-type="link" data-id="https://youtrack.jetbrains.com/articles/IDEA-A-2100662491/IntelliJ-IDEA-2025.2.1-252.25557.131-build-Release-Notes" target="_blank" rel="noopener">release notes</a>.</p>
<p>If you encounter any issues or would like to make a suggestion or a feature request, please submit them to our <a href="https://youtrack.jetbrains.com/issues/IDEA" target="_blank" rel="noopener">issue tracker</a>.</p>
<p>Happy developing!</p>
]]></content:encoded>
</item>
<item>
<title>IntelliJ IDEA 2025.1.5 Is Out!</title>
<link>https://blog.jetbrains.com/idea/2025/08/intellij-idea-2025-1-5/</link>
<dc:creator><![CDATA[Julia Shashkova]]></dc:creator>
<pubDate>Thu, 28 Aug 2025 16:20:57 +0000</pubDate>
<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/08/IJ-social-BlogFeatured-202515.png</featuredImage> <category><![CDATA[releases]]></category>
<category><![CDATA[bug-fix-update]]></category>
<category><![CDATA[intellij-idea-2025-1]]></category>
<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&p=594646</guid>
<description><![CDATA[We’ve released another update for IntelliJ IDEA 2025.1 – v2025.1.5. You can update to this version from inside the IDE, via the Toolbox App, or by using snaps for Ubuntu. You can also download it from our website. This release includes the following updates: To find out more about the resolved issues, please refer to […]]]></description>
<content:encoded><![CDATA[
<p>We’ve released another update for IntelliJ IDEA 2025.1 – v2025.1.5.</p>
<p>You can update to this version from inside the IDE, via the <a href="https://www.jetbrains.com/toolbox-app/" target="_blank" rel="noopener">Toolbox App</a>, or by using snaps for Ubuntu. You can also download it from our <a href="https://www.jetbrains.com/idea/download/" target="_blank" rel="noopener">website</a>.</p>
<p>This release includes the following updates:</p>
<ul>
<li>The IDE interface now performs seamlessly during Google Meet screen sharing on macOS when a second monitor is connected. [<a href="https://youtrack.jetbrains.com/issue/JBR-7582" target="_blank" rel="noopener">JBR-7582</a>]</li>
<li><code>UrlClassLoader.getFiles</code> now returns the expected instances of <code>java.nio.file.Path</code> without conflicting with other paths. [<a href="https://youtrack.jetbrains.com/issue/IJPL-187780" target="_blank" rel="noopener">IJPL-187780</a>] </li>
</ul>
<p>To find out more about the resolved issues, please refer to the <a href="https://youtrack.jetbrains.com/articles/IDEA-A-2100662490/IntelliJ-IDEA-2025.1.5-251.28293.22-build-Release-Notes" target="_blank" rel="noopener">release notes</a>.</p>
<p>If you encounter any issues or would like to make a suggestion or a feature request, please submit them to our <a href="https://youtrack.jetbrains.com/issues/IDEA" target="_blank" rel="noopener">issue tracker</a>.</p>
<p>Happy developing!</p>
]]></content:encoded>
</item>
<item>
<title>Debugging Transactions? Let Spring Debugger Do the Heavy Lifting</title>
<link>https://blog.jetbrains.com/idea/2025/08/debugging-transactions-let-spring-debugger-do-the-heavy-lifting/</link>
<dc:creator><![CDATA[Siva Katamreddy]]></dc:creator>
<pubDate>Wed, 13 Aug 2025 10:08:24 +0000</pubDate>
<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/08/IJ-social-BlogFeatured-1280x720-2x-2.png</featuredImage> <category><![CDATA[idea]]></category>
<category><![CDATA[java]]></category>
<category><![CDATA[spring-boot-2]]></category>
<category><![CDATA[spring-data-jpa-2]]></category>
<category><![CDATA[spring-debugger-2]]></category>
<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&p=590817</guid>
<description><![CDATA[Spring Framework’s declarative transaction management is incredibly powerful, allowing developers to simply add the @Transactional annotation to a method and let Spring handle the transaction details. However, misconfigurations or misunderstandings of how transactions work can lead to frustrating database transaction handling issues. Debugging these problems often means sifting through a lot of AOP proxy code, […]]]></description>
<content:encoded><![CDATA[
<p>Spring Framework’s <strong><a href="https://docs.spring.io/spring-framework/reference/data-access/transaction/declarative.html" data-type="link" data-id="https://docs.spring.io/spring-framework/reference/data-access/transaction/declarative.html" target="_blank" rel="noopener">declarative transaction management</a></strong> is incredibly powerful, allowing developers to simply add the <code>@Transactional</code> annotation to a method and let Spring handle the transaction details. However, misconfigurations or misunderstandings of how transactions work can lead to frustrating database transaction handling issues. Debugging these problems often means sifting through a lot of AOP proxy code, which is “not really a pleasant experience”.</p>
<p>This is where the <a href="https://plugins.jetbrains.com/plugin/25302-spring-debugger" target="_blank" rel="noopener"><strong>Spring Debugger plugin</strong></a> comes to the rescue! It’s designed specifically to help you identify and fix these complex transaction management and JPA-related issues, making your debugging much smoother.</p>
<p><strong>You can also watch the demonstration of Spring Debugger plugin’s database transaction debugging feature in this video.</strong></p>
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Debugging Transactions? Let Spring Debugger Do the Heavy Lifting" width="500" height="281" src="https://www.youtube.com/embed/smUSH6-Qvn0?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<h2 class="wp-block-heading">Unmasking Transactional Mysteries with Spring Debugger</h2>
<p>Let’s say we are building a <a href="https://github.com/sivaprasadreddy/spring-debugger-demo" data-type="link" data-id="https://github.com/sivaprasadreddy/spring-debugger-demo" target="_blank" rel="noopener">bookmarks management application</a> and consider a use case creating a new bookmark, which might also involve creating a new bookmark category if it doesn’t already exist. The goal is that if category creation succeeds but bookmark saving fails, <strong>only the bookmark changes should roll back, while the category creation should persist</strong>.</p>
<p>A developer might implement this feature as follows:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@Service
public class BookmarkService {
//....
@Transactional
public Bookmark createBookmark(CreateBookmarkCmd cmd) {
var bookmark = new Bookmark(cmd.title(), cmd.url());
if(cmd.categoryName() != null) {
Category category = categoryService.findByName(cmd.categoryName()).orElse(null);
if (category == null) {
category = this.createCategory(new Category(cmd.categoryName()));
}
bookmark.setCategory(category);
}
bookmarkRepository.save(bookmark);
log.info("Created bookmark with id: {}", bookmark.getId());
return bookmark;
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Category createCategory(Category category) {
category.setId(null);
return categoryRepository.save(category);
}
}</pre>
<p>The current implementation assumes that the <code>createBookmark()</code> method annotated with <code>@Transactional</code> will start a transaction. Inside, if a category needs to be created, call <code>createCategory()</code> method which is annotated with <code>@Transactional(propagation = REQUIRES_NEW)</code>, hoping it will start a new, independent transaction. The expectation is that if <code>createBookmark()</code> fails (e.g., due to a <code>NULL</code> URL), the category should still be saved.</p>
<p>Let’s validate this logic through the following test.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import com.sivalabs.bookmarks.TestcontainersConfig;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
import org.springframework.transaction.TransactionSystemException;
import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@SpringBootTest
@Import(TestcontainersConfig.class)
class BookmarkServiceTest {
@Autowired
BookmarkService bookmarkService;
@Autowired
private CategoryRepository categoryRepository;
@Test
void shouldCreateCategoryEvenWhenBookmarkCreationFails() {
String categoryName = "java25";
Optional<Category> categoryOptional =
categoryRepository.findByNameEqualsIgnoreCase(categoryName);
assertThat(categoryOptional).isEmpty();
var cmd = new CreateBookmarkCmd(
"My New Article",
null,
categoryName);
assertThatThrownBy(()-> bookmarkService.createBookmark(cmd))
.isInstanceOf(TransactionSystemException.class);
categoryOptional = categoryRepository.findByNameEqualsIgnoreCase(categoryName);
assertThat(categoryOptional).isNotEmpty();
}
}</pre>
<p>The test will fail and the category was <em>not</em> saved, indicating that the intended separate transaction didn’t actually occur. Why?</p>
<p>Without Spring Debugger, figuring this out would involve painfully sifting through AOP proxy code. But with the plugin, it’s remarkably simple:</p>
<ol>
<li><strong>Set breakpoints</strong> in your <code>createBookmark()</code> and <code>createCategory()</code> methods.</li>
<li><strong>Run your test in debug mode</strong>.</li>
</ol>
<figure class="wp-block-image size-full"><img decoding="async" loading="lazy" width="1159" height="574" src="https://blog.jetbrains.com/wp-content/uploads/2025/08/spring-debug-txn-1.png" alt="" class="wp-image-590818"/></figure>
<p>As you step through the code, the <strong>“Transaction” node in the debug tool window</strong> provides more insights.</p>
<ul>
<li><strong>Initial Observation</strong>: When in the <code>createBookmark()</code> method, the debugger shows that the database transaction started there. Crucially, even after stepping into the <code>createCategory()</code> method, the debugger <strong>still indicates that the code is running in the <em>same transaction</em> that started in </strong><code>createBookmark()</code>.</li>
<li><strong>The Revelation</strong>: This immediately highlights the problem! Even with <code>@Transactional(propagation = REQUIRES_NEW)</code> on <code>createCategory()</code>, it’s not starting a new transaction. The debugger helps us understand <em>why</em>: <strong>calling a method within the same class (a “local method call”) doesn’t go through the AOP proxy</strong>, meaning the <code>@Transactional</code> annotation on that internal method is <strong>not taken into consideration</strong>. This is why both bookmark and category creation were rolling back together when <code>createBookmark()</code> failed.</li>
</ul>
<h2 class="wp-block-heading">The Fix and Visual Validation</h2>
<p>The solution is to <strong>move the <code>createCategory()</code> method into a separate service</strong> (e.g., <code>CategoryService</code>). When the <code>createBookmark()</code> method then calls <code>categoryService.createCategory()</code>, Spring’s AOP proxy can intercept this call.</p>
<p>Running the test in debug mode again with the Spring Debugger, you’ll see a profound difference.</p>
<figure class="wp-block-image size-full"><img decoding="async" loading="lazy" width="1090" height="719" src="https://blog.jetbrains.com/wp-content/uploads/2025/08/spring-debug-txn-2.png" alt="" class="wp-image-590829"/></figure>
<ul>
<li>When in <code>createBookmark()</code>, the debugger shows the parent transaction starting there.</li>
<li>When you step into <code>CategoryService.createCategory()</code>, the debugger now clearly indicates that <strong>the <em>current method</em> is running in a <em>new transaction</em> that started in </strong><code><strong>CategoryService.createCategory</strong>()</code>.</li>
<li>Even better, the debug window shows the <strong>hierarchy of transactions</strong>, detailing the parent transaction (<code>BookmarkService.createBookmark()</code>) and the newly started child transaction (<code>CategoryService.createCategory()</code>).</li>
<li>You also get comprehensive information about each transaction, including its <strong>isolation level, propagation behavior, and read-only status</strong>.</li>
<li>You can also see the entities in the Hibernate’s <strong>L1 cache</strong>.</li>
</ul>
<p><br>With this change, the code behaves as expected: if bookmark creation fails, only those changes are rolled back, and the category is successfully persisted in the database.</p>
<h2 class="wp-block-heading">Beyond Transactions: Visualizing JPA Entity States</h2>
<p>Spring Debugger isn’t just for transactions. It also provides crucial visibility into <strong>JPA entity states</strong>, which can be incredibly helpful for debugging persistence-related issues.</p>
<p>As you step through your code, the debugger can show you an entity’s current state:</p>
<ul>
<li><strong>TRANSIENT</strong>: A newly created object that has not yet been persisted to the database.</li>
<li><strong>DETACHED</strong>: An entity that was once managed by the persistence context but is no longer associated with it (e.g., after returning from a service method).</li>
<li><strong>MANAGED</strong>: An entity that is currently being tracked by the persistence context.</li>
</ul>
<p>For example, our <code>bookmark</code> entity starts in a <strong>TRANSIENT</strong> state. The <code>category</code> entity, after being created and then returning from <code>CategoryService</code> to <code>BookmarkService</code>, is shown as <strong>DETACHED</strong>.</p>
<figure class="wp-block-image size-full"><img decoding="async" loading="lazy" width="1064" height="395" src="https://blog.jetbrains.com/wp-content/uploads/2025/08/spring-debug-txn-3.png" alt="" class="wp-image-590840"/></figure>
<p>After calling <code>bookmarkRepository.save(bookmark)</code>, the debugger shows <code>bookmark</code> entity state changing to <strong>MANAGED</strong>.</p>
<figure class="wp-block-image size-full"><img decoding="async" loading="lazy" width="1045" height="373" src="https://blog.jetbrains.com/wp-content/uploads/2025/08/spring-debug-txn-4.png" alt="" class="wp-image-590851"/></figure>
<p>This <strong>visualization of entity state changes</strong> is really helpful for debugging these JPA related issues.</p>
<h2 class="wp-block-heading">Conclusion</h2>
<p>The Spring Debugger plugin is an indispensable tool for any Spring developer. It takes the guesswork out of debugging complex database transaction management issues by <strong>visualizing transaction flow, parent-child transaction hierarchies, and detailed transaction information</strong>. Moreover, its ability to show <strong>JPA entity state changes</strong> provides deep insights into how your data is being managed.</p>
<p>If you’ve ever struggled with Spring transaction or JPA-related bugs, go ahead, <strong>install the </strong><a href="https://plugins.jetbrains.com/plugin/25302-spring-debugger" target="_blank" rel="noopener"><strong>Spring Debugger plugin</strong></a> today! You can find more <a href="https://www.jetbrains.com/help/idea/spring-debugger.html" target="_blank" rel="noopener">documentation</a> on it within IntelliJ IDEA documentation as well. Happy debugging!</p>
]]></content:encoded>
</item>
<item>
<title>Java Annotated Monthly – August 2025</title>
<link>https://blog.jetbrains.com/idea/2025/08/java-annotated-monthly-august-2025/</link>
<dc:creator><![CDATA[Irina Mariasova]]></dc:creator>
<pubDate>Wed, 06 Aug 2025 11:17:24 +0000</pubDate>
<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/08/IJ-social-BlogFeatured-1280x720-2x.png</featuredImage> <category><![CDATA[news]]></category>
<category><![CDATA[ai]]></category>
<category><![CDATA[java]]></category>
<category><![CDATA[java-annotated]]></category>
<category><![CDATA[java-annotated-monthly]]></category>
<category><![CDATA[kotlin]]></category>
<category><![CDATA[spring]]></category>
<category><![CDATA[spring-debugger]]></category>
<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&p=589949</guid>
<description><![CDATA[Welcome to this month’s Java Annotated Monthly – your pit stop for all things related to Java, Kotlin, frameworks, and the ever-shifting tech scene. From helpful reads to red-hot takes, we’ve lined up a range of articles for curious devs and ambitious teams. But wait, there’s more! As always, our AI corner is here, and […]]]></description>
<content:encoded><![CDATA[
<p>Welcome to this month’s Java Annotated Monthly – your pit stop for all things related to Java, Kotlin, frameworks, and the ever-shifting tech scene. From helpful reads to red-hot takes, we’ve lined up a range of articles for curious devs and ambitious teams.</p>
<p>But wait, there’s more! As always, our AI corner is here, and we’ve sprinkled in some thought-provoking, non-tech gems on building better teams and smarter products.<br>Oh, and don’t miss the special feature by <a href="https://bazlur.ca/" target="_blank" rel="noopener">A N M Bazlur Rahman</a>! He’s bringing you his top picks, personal reflections, and sharp takes on where the dev world’s heading. Trust us, it’s a ride worth taking.</p>
<p>Let’s go! </p>
<h2 class="wp-block-heading">Featured Content</h2>
<div class="about-author ">
<div class="about-author__box">
<div class="row">
<div class="about-author__box-img">
<img decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2025/08/bazlur_rahman.jpg" alt="" loading="lazy">
</div>
<div class="about-author__box-text">
<h4>A N M Bazlur Rahman</h4>
<p><!-- wp:paragraph --></p>
<p>A N M Bazlur Rahman is a Java Champion, Jakarta EE Ambassador, and Software Engineer with over 12 years of specialized experience in Java and related technologies. He is the founder and moderator of the Java User Group in Bangladesh, and has been organizing educational meetups and conferences since 2013. Bazlur is a veteran editor at <a href="https://www.infoq.com/profile/A-N-M-Bazlur-Rahman/#allActivity" target="_blank" rel="noopener">InfoQ</a> and a contributing editor at <a href="https://foojay.io/today/author/bazlur-rahman/" target="_blank" rel="noopener">Foojay.io</a>. He has authored six books on Java programming, including <a href="https://learning.oreilly.com/library/view/modern-concurrency-in/9781098165406/" target="_blank" rel="noopener"><em>Modern Concurrency in Java</em></a> with O’Reilly, scheduled for release in September. He is also working on his seventh book, <em>Build Smart Java</em> <em>Applications</em> <em>with Large Language Models,</em> with his friend Shaaf Syed and Manning Publications. When not coding or writing, you can find him speaking at conferences and Java User Groups, sharing his passion for Java, Jakarta EE, and the integration of AI technologies into enterprise applications.</p>
<p><!-- /wp:paragraph --> <!-- wp:heading {"level":3} --></p>
<h3 class="wp-block-heading"></h3>
<p><!-- /wp:heading --></p>
</div>
</div>
</div>
</div>
<p><strong>Java and AI integration takes center stage</strong></p>
<p>As a Java developer with a recent interest in the AI integration space, I’m excited to share what I consider the most transformative period in Java’s 30-year history. The ecosystem has reached a tipping point where AI integration is no longer experimental. It’s production-ready, and Java developers are embracing it at an unprecedented pace. From my recent talk at <a href="https://bazlur.ca/2025/05/25/speaking-at-geecon-2025-krakow-experience/" target="_blank" rel="noopener">GeeCON 2025 in Kraków</a> to my hands-on experiments building AI-powered applications, I’ve witnessed firsthand how Java is becoming the go-to platform for enterprise AI development.</p>
<p>The foundation of this revolution lies in the language itself. <a href="https://openjdk.org/projects/jdk/25/" target="_blank" rel="noopener">JDK 25 is shaping up to be a landmark release</a>, with features that directly benefit AI workloads. The game changer is <a href="https://www.infoq.com/news/2025/06/java-25-compact-object-headers/" target="_blank" rel="noopener">JEP 519: Compact Object Headers</a>, with <a href="https://github.com/rkennke/talks/blob/master/Lilliput-FOSDEM-2025.pdf" target="_blank" rel="noopener">Amazon reporting 22% less heap usage and 8% faster execution</a> in production. However, what really excites me is <a href="https://www.infoq.com/news/2025/05/jep-505-concurrency-preview-5/" target="_blank" rel="noopener">JEP 505: Structured Concurrency (Fifth Preview)</a>, which I explored in depth in my article, <a href="https://bazlur.ca/2025/05/25/javas-structured-concurrency-finally-finding-its-footing/" target="_blank" rel="noopener"><em>Java’s Structured Concurrency: Finally Finding Its Footing</em></a>. This feature simplifies concurrent programming by treating related tasks as single units, making them ideal for orchestrating multiple AI model calls. Combined with <a href="https://www.infoq.com/news/2025/05/jdk25-instance-main-methods/" target="_blank" rel="noopener">instance main methods becoming final in JDK 25</a>, which provides a pleasing experience for beginners, <a href="https://openjdk.org/projects/leyden/" target="_blank" rel="noopener">Project Leyden</a> and the evolving Vector API are positioning Java as a serious contender for AI workloads.</p>
<p>The framework landscape has me particularly excited. The <a href="https://www.infoq.com/news/2025/05/spring-ai-1-0-streamlines-apps/" target="_blank" rel="noopener">general availability of Spring AI 1.0</a> streamlines AI app development with support for 20+ models and built-in RAG capabilities. <a href="https://github.com/langchain4j/langchain4j/releases" target="_blank" rel="noopener">LangChain4j’s 1.1.0 release</a> introduces comprehensive guardrail support – something I’ve written about extensively in <a href="https://bazlur.ca/2025/06/21/building-robust-ai-applications-with-langchain4j-guardrails-and-spring-boot/" target="_blank" rel="noopener"><em>Building Robust AI Applications with LangChain4j Guardrails and Spring Boot</em></a>, complete with plenty of code examples. Microsoft’s <a href="https://devblogs.microsoft.com/java/microsoft-and-langchain4j-a-partnership-for-secure-enterprise-grade-java-ai-applications/" target="_blank" rel="noopener">strategic partnership with LangChain4j</a> has resulted in extensive security audits, making it truly enterprise-ready. However, the real showstopper is Rod Johnson’s <a href="https://www.infoq.com/news/2025/06/introducing-embabel-ai-agent/" target="_blank" rel="noopener">Embabel agent framework</a>, which he describes as “the most significant project since Spring Framework itself.” It brings goal-oriented action planning from gaming to create deterministic, explainable AI agents with strong typing. What’s equally exciting is seeing<a href="https://github.com/langchain4j/langchain4j-cdi" target="_blank" rel="noopener"> the integration of LangChain4j with MicroProfile and Jakarta specifications</a> take shape, bringing AI capabilities to enterprise Java standards. </p>
<p>To help developers navigate this landscape, my friend <a href="https://www.linkedin.com/in/shaaf/" target="_blank" rel="noopener">Shaaf Syed</a> and I created the <a href="https://github.com/learnj-ai/llm-jakarta" target="_blank" rel="noopener">llm-jakarta GitHub project</a>, which provides a progressive learning path through Jakarta EE and LLM integration, comprising 10 practical steps. We plan to add more examples combining Spring Boot and Quarkus soon. <br>For those interested in GPU acceleration, I recommend checking out <a href="https://www.infoq.com/news/2025/06/gpullama3-java-gpu-llm/" target="_blank" rel="noopener"><em>GPULlama3.java Brings GPU-Accelerated LLM Inference to Pure Java</em></a>, which showcases how Java can leverage hardware acceleration for AI workloads.</p>
<p>Cloud providers are fully committed to Java’s AI future. Oracle launched <a href="https://docs.oracle.com/en-us/iaas/releasenotes/generative-ai/langchain4j.htm" target="_blank" rel="noopener">generative AI with LangChain4j integration</a>, and Google released their <a href="https://google.github.io/adk-docs/#java" target="_blank" rel="noopener">Agent Development Kit for Java</a>, both of which are crucial for adopting modern AI features. Microsoft’s comprehensive <a href="https://devblogs.microsoft.com/java/the-state-of-coding-the-future-with-java-and-ai/" target="_blank" rel="noopener">Java and AI strategy</a> includes native integration with Azure. </p>
<p>I’ve been experimenting with these features extensively, documenting my findings in my newsletter, <a href="https://bazlur.substack.com/" target="_blank" rel="noopener"><em>The Coding Café</em></a>, where I share practical experiments, such <a href="https://bazlur.substack.com/p/building-formpilot-my-journey-creating" target="_blank" rel="noopener">as building FormPilot</a> and creating an <a href="https://bazlur.substack.com/p/building-an-ai-powered-flight-tracker" target="_blank" rel="noopener">AI-powered flight tracker</a>. Join me as we explore this exciting frontier where Java’s enterprise strengths meet cutting-edge AI capabilities!</p>
<h2 class="wp-block-heading">Java News</h2>
<p>Check out the recent Java news: </p>
<ul>
<li>Java News Roundup <a href="https://www.infoq.com/news/2025/07/java-news-roundup-jun30-2025/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">1</a>, <a href="https://www.infoq.com/news/2025/07/java-news-roundup-jul07-2025/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">2</a>, <a href="https://www.infoq.com/news/2025/07/java-news-roundup-jul14-2025/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">3</a>, <a href="https://www.infoq.com/news/2025/07/java-news-roundup-jul21-2025/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">4</a></li>
<li><a href="https://inside.java/2025/07/03/newscast-94/" target="_blank" rel="noopener">Java 25 is ALSO no LTS Version – Inside Java Newscast #94</a></li>
<li><a href="https://inside.java/2025/07/14/javaone-hat/" target="_blank" rel="noopener">Java GPGPU Enablement: Are We There Yet?</a></li>
<li><a href="https://inside.java/2025/07/17/newscast-95/" target="_blank" rel="noopener">Java Gets a JSON API – Inside Java Newscast #95</a></li>
</ul>
<p></p>
<p>Here are the JEPs targeted to JDK 25: </p>
<ul>
<li><a href="https://inside.java/2025/07/18/jep515-target-jdk25/" target="_blank" rel="noopener">JEP 515: Ahead-of-Time Method Profiling</a></li>
<li><a href="https://inside.java/2025/07/21/jep518-target-jdk25/" target="_blank" rel="noopener">JEP 518: JFR Cooperative Sampling</a></li>
<li><a href="https://inside.java/2025/07/25/jep520-target-jdk25/" target="_blank" rel="noopener">JEP 520: JFR Method Timing & Tracing</a></li>
</ul>
<h2 class="wp-block-heading">Java Tutorials and Tips</h2>
<p>Learn new things from our selection of Java tutorials and tips: </p>
<ul>
<li><a href="https://spring.io/blog/2025/07/03/a-bootiful-podcast-dr-heinz-kabutz" target="_blank" rel="noopener">A Bootiful Podcast: Dr. Heinz Kabutz, a legendary Java Champion, teacher, and author of the Java Specialists newsletter!</a></li>
<li><a href="https://blog.rweisleder.de/posts/java-regex-dynamic-replacement/" target="_blank" rel="noopener">Java Regex: Dynamic Replacements with Lambda Expressions</a></li>
<li><a href="https://foojay.io/today/java-virtual-threads-in-action-optimizing-mongodb-operation/" target="_blank" rel="noopener">Java Virtual Threads in Action: Optimizing MongoDB Operation</a></li>
<li><a href="https://blog.jetbrains.com/idea/2025/07/module-import-declarations-no-more-import-hell/">Module Import Declarations: No More Import Hell </a></li>
<li><a href="https://inside.java/2025/07/02/feature-faceoff-2025/" target="_blank" rel="noopener">Best of Java Feature Face-Off – Celebrating 30 Years of Java: The Programming Language That Changed the World</a></li>
<li><a href="https://inside.java/2025/07/08/javaone-marshalling/" target="_blank" rel="noopener">Marshalling: Data-Oriented Serialization</a></li>
<li><a href="https://www.infoq.com/podcasts/java-ecosystem-continuously-adapting-developers/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">The Java Ecosystem Remains Ever-Green By Continuously Adapting to Developers’ Needs</a></li>
<li><a href="https://inside.java/2025/07/22/javaone-stablevalues/" target="_blank" rel="noopener">A Sneak Peek at the Stable Values API</a></li>
<li><a href="https://inside.java/2025/07/29/just-be-lazy/" target="_blank" rel="noopener">Just Be Lazy</a></li>
<li><a href="https://foojay.io/today/java-22-to-24-level-up-your-java-code-by-embracing-new-features-in-a-safe-way/" target="_blank" rel="noopener">Java 22 to 24: Level up your Java Code by embracing new features in a safe way</a> </li>
<li><a href="https://lucumr.pocoo.org/2025/7/26/virtual-threads/" target="_blank" rel="noopener">From Async/Await to Virtual Threads</a><strong> </strong></li>
<li><a href="https://inside.java/2025/07/28/podcast-039/" target="_blank" rel="noopener">Episode 39 “Deprecations & Removals” with Stuart Marks</a><strong> </strong></li>
<li><a href="https://spring.io/blog/2025/07/24/a-bootiful-podcast-jose-paumard" target="_blank" rel="noopener">A Bootiful Podcast: José Paumard, Java developer advocate and professor</a><strong> </strong></li>
<li><a href="https://blog.eisele.net/2025/07/six-months-of-enterprise-java-and.html" target="_blank" rel="noopener">Six Months of Enterprise Java and Quarkus and What Comes Next</a><strong> </strong></li>
<li><a href="https://inside.java/2025/07/22/javaone-stablevalues/" target="_blank" rel="noopener">A Sneak Peek at the Stable Values API</a><strong> </strong></li>
<li><a href="https://inside.java/2025/07/20/javaone-security/" target="_blank" rel="noopener">Java Security Evolution – Out with the Old, In with the New</a><strong> </strong></li>
</ul>
<h2 class="wp-block-heading">Kotlin Corner</h2>
<p>Don’t miss these Kotlin updates: </p>
<ul>
<li><a href="https://jdriven.com/blog/2025/04/Trying-to-typeclass-in-Kotlin" target="_blank" rel="noopener">Trying to typeclass in Kotlin</a></li>
<li><a href="https://foojay.io/today/ing-kotlin-adoption-five-years/" target="_blank" rel="noopener">Kotlin adoption inside ING, five years later</a></li>
<li><a href="https://blog.jetbrains.com/kotlin/2025/07/case-study-why-kakao-pay-chose-kotlin-for-backend-development/">Case Study: Why Kakao Pay Chose Kotlin for Backend Development</a></li>
<li><a href="https://blog.jetbrains.com/kotlin/2025/07/kodees-kotlin-roundup-june-edition/">Kodee’s Kotlin Roundup: A Carefully Curated June Edition</a></li>
<li><a href="https://blog.jetbrains.com/kotlin/2025/07/modular-ktor-building-backends-for-scale/">Modular Ktor: Building Backends for Scale</a></li>
<li><a href="https://blog.jetbrains.com/ai/2025/07/when-tool-calling-becomes-an-addiction-debugging-llm-patterns-in-koog/">When Tool-Calling Becomes an Addiction: Debugging LLM Patterns in Koog</a></li>
<li><a href="https://blog.jetbrains.com/kotlin/2025/07/kmp-shipaton/">Ship, Share, and Win: The Kotlin Multiplatform Award at Shipaton 2025</a></li>
<li><a href="https://blog.jetbrains.com/ai/2025/07/koog-building-and-scaling-ai-agents-join-our-livestream-series/">Koog: Building and Scaling AI Agents – Join Our Livestream Series</a></li>
</ul>
<h2 class="wp-block-heading">AI</h2>
<p>Stay up to date with AI news and insights: </p>
<ul>
<li><a href="https://blog.jetbrains.com/kineto/2025/08/make-your-ideas-clickable-with-kineto-by-jetbrains/">Make Your Ideas Clickable With Kineto by JetBrains</a></li>
<li><a href="https://www.infoq.com/news/2025/07/google-gemini-cli/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">Google Launches Gemini CLI: Open-Source Terminal AI Agent for Developers</a></li>
<li><a href="https://www.infoq.com/articles/effective-practices-ai-chat-based-coding/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">Effective Practices for Coding with a Chat-Based AI</a></li>
<li><a href="https://www.infoq.com/presentations/llm-ai-agents/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">AI Agents & LLMs: Scaling the Next Wave of Automation</a></li>
<li><a href="https://www.infoq.com/news/2025/07/hugging-face-reachy/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">Hugging Face Launches Reachy Mini Robots for Human-Robot Interaction</a></li>
<li><a href="https://foojay.io/today/the-great-data-reimagination-from-static-to-agile-in-the-ai-era/" target="_blank" rel="noopener">The Great Data Reimagination: From Static to Agile in the AI Era</a></li>
<li><a href="https://glaforge.dev/talks/2025/07/16/ai-agents-the-new-frontier-for-llms/" target="_blank" rel="noopener">AI Agents, the New Frontier for LLMs</a></li>
<li><a href="https://www.infoq.com/podcasts/building-product-first-engineering-culture/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">Building a Product-First Engineering Culture in the Age of AI</a></li>
<li><a href="https://glaforge.dev/posts/2025/07/24/mastering-agentic-workflows-with-adk-sequential-agent/" target="_blank" rel="noopener">Mastering agentic workflows with ADK for Java: Sequential agents</a></li>
<li><a href="https://foojay.io/today/building-robust-ai-applications-with-langchain4j-guardrails-and-spring-boot/" target="_blank" rel="noopener">Robust AI Applications with LangChain4j Guardrails and Spring Boot</a> </li>
<li><a href="https://martinfowler.com/articles/20250721-links.html" target="_blank" rel="noopener">Generative AI in software and essaying</a></li>
<li><a href="https://blog.jetbrains.com/education/2025/07/31/ai-agents-free-course/">Why AI Agents as Your Team Should Be Your Next Learning Move</a></li>
<li><a href="https://blog.jetbrains.com/ai/2025/07/small-models-big-impact-why-jetbrains-is-betting-on-focal-llms/">Small Models, Big Impact: Why JetBrains is Betting on Focal LLMs</a></li>
<li><a href="https://blog.jetbrains.com/ai/2025/07/the-future-of-ai-in-software-development/">The Future of AI in Software Development</a></li>
<li><a href="https://blog.jetbrains.com/ai/2025/07/what-the-google-x-jetbrains-hackathon-tells-us-about-the-future-of-ai-at-jetbrains/">What the Google x JetBrains Hackathon Tells Us About the Future of AI at JetBrains</a></li>
</ul>
<h2 class="wp-block-heading">Languages, Frameworks, Libraries, and Technologies</h2>
<p>Read about the most influential technologies and frameworks in the industry: </p>
<ul>
<li>This Week in Spring <a href="https://spring.io/blog/2025/07/01/this-week-in-spring-july-01-2025" target="_blank" rel="noopener">1</a>, <a href="https://spring.io/blog/2025/07/08/this-week-in-spring-july-8th-2025" target="_blank" rel="noopener">2</a>, <a href="https://spring.io/blog/2025/07/15/this-week-in-spring-july-15-2025" target="_blank" rel="noopener">3</a>, <a href="https://www.infoq.com/news/2025/07/spring-news-roundup-jul21-2025/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">4</a></li>
<li><a href="https://4comprehension.com/accidental-time-travel-with-wiremock/" target="_blank" rel="noopener">Accidental Time Travel with Wiremock, SimpleDateFormat and Fractional Seconds</a></li>
<li><a href="https://www.youtube.com/watch?v=t34TEVx5YuM" target="_blank" rel="noopener">Spring Debugger 🚀 Instantly Fix Spring Boot Errors & Debug Everything On the Fly!</a></li>
<li><a href="https://www.youtube.com/watch?v=K2tYAHG2XJ8" target="_blank" rel="noopener">Spring Debugger: A New Way To Demystify Spring Boot’s Magic by Marco Behler @ Spring I/O 2025</a></li>
<li><a href="https://mydeveloperplanet.com/2025/05/14/testing-java-applications-with-wiremock-and-spring-boot/" target="_blank" rel="noopener">Testing Java Applications with WireMock and Spring Boot</a></li>
<li><a href="https://foojay.io/today/data-modeling-for-java-developers-structuring-with-postgresql-and-mongodb/" target="_blank" rel="noopener">Data Modeling for Java Developers: Structuring With PostgreSQL and MongoDB</a></li>
<li><a href="https://glaforge.dev/posts/2025/07/06/advanced-rag-hypothetical-question-embedding/" target="_blank" rel="noopener">Advanced RAG — Hypothetical Question Embedding</a></li>
<li><a href="https://foojay.io/today/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/" target="_blank" rel="noopener">Building a Spring Boot CRUD Application Using MongoDB’s Relational Migrator</a></li>
<li><a href="https://www.infoq.com/news/2025/07/meta-rust-dx/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">From C to Rust: Inside Meta’s Developer-Led Messaging Migration</a></li>
<li><a href="https://www.infoq.com/news/2025/07/pair-programming-speed-flow/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">How Pair Programming Enhanced Development Speed, Focus, and Flow</a></li>
<li><a href="https://spring.io/blog/2025/07/10/a-bootiful-podcast-arjen-poutsma" target="_blank" rel="noopener">A Bootiful Podcast: API oracle Arjen Poutsma</a></li>
<li><a href="https://foojay.io/today/getting-started-with-scala/" target="_blank" rel="noopener">Getting Started With Scala</a></li>
<li><a href="https://foojay.io/today/how-to-make-a-rag-application-with-langchain4j/" target="_blank" rel="noopener">How to Make a RAG Application With LangChain4j</a></li>
<li><a href="https://blog.frankel.ch/git-default-options/" target="_blank" rel="noopener">Git default options</a> </li>
<li><a href="https://foojay.io/today/spring-cloud-stream-event-driven-architecture-part-1/" target="_blank" rel="noopener">Spring Cloud Stream: Event-Driven Architecture – Part 1</a></li>
<li><a href="https://blog.vanillajava.blog/2025/07/improving-prompt-to-ai-to-get-better.html" target="_blank" rel="noopener">Improving the prompt to the AI to get better code</a></li>
</ul>
<h2 class="wp-block-heading">Conferences and Events</h2>
<p>Visit these Java events in August and watch some helpful recordings: </p>
<ul>
<li><a href="https://openjdk.org/projects/mlvm/jvmlangsummit/" target="_blank" rel="noopener">JVM Language Summit</a> – Santa Clara, CA, USA, August 4–6</li>
<li><a href="https://www.jcrete.org/" target="_blank" rel="noopener">JCrete</a> – Crete, Greece, August 4–8</li>
<li><a href="https://www.vmware.com/explore/us/springone" target="_blank" rel="noopener">SpringOne</a> – Las Vegas, NV, USA, August 25–28</li>
<li><a href="https://www.youtube.com/watch?v=iPZZm2PLLWc&list=PLPZy-hmwOdEV1aAV4qqXkqde7OpjsVLfb" target="_blank" rel="noopener">IntelliJ IDEA Conf 2025</a> – Check out the full playlist with the talks</li>
</ul>
<h2 class="wp-block-heading">Culture and Community</h2>
<p>Be a great leader and a perfect team player: </p>
<ul>
<li><a href="https://www.infoq.com/articles/guide-curating-technical-conference-track/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">A First-Timer’s Guide to Curating a Technical Conference Track</a></li>
<li><a href="https://www.infoq.com/podcasts/trust-leadership-building-great-teams/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">Trust-first Leadership and Building Great Teams</a></li>
<li><a href="https://www.infoq.com/presentations/junior-principal-lessons/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global" target="_blank" rel="noopener">From Junior to Staff and beyond: Lessons Learned</a></li>
<li><a href="https://foojay.io/today/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/" target="_blank" rel="noopener">Why Mirroring Production in Dev Helps You Avoid Costly Mistakes</a></li>
<li><a href="https://lucumr.pocoo.org/2025/7/20/the-next-generation/" target="_blank" rel="noopener">Welcoming The Next Generation of Programmers</a> </li>
<li><a href="https://blog.thepete.net/blog/2025/06/26/leading-your-engineers-towards-an-ai-assisted-future/" target="_blank" rel="noopener">Leading your engineers towards an AI-assisted future</a></li>
</ul>
<h2 class="wp-block-heading">And Finally…</h2>
<p>Don’t miss the most important updates from the IntellIJ IDEA team: </p>
<ul>
<li><a href="https://blog.jetbrains.com/idea/2025/07/spring-debugger-working-with-dynamic-database-connections-just-got-simpler/">Spring Debugger: Working With Dynamic Database Connections Just Got Simpler</a></li>
<li><a href="https://blog.jetbrains.com/idea/2025/07/intellij-idea-unified-distribution-plan/">IntelliJ IDEA Moves to the Unified Distribution</a></li>
<li><a href="https://blog.jetbrains.com/idea/2025/07/intellij-idea-2025-2-beta/">IntelliJ IDEA 2025.2 Beta: EAP Closure and Our New Approach to Release Updates</a></li>
</ul>
<p>That’s it for today! We’re always collecting ideas for the next Java Annotated Monthly – send us your suggestions via <a href="https://mail.google.com/mail/u/0/?fs=1&tf=cm&source=mailto&to=JAM@jetbrains.com" target="_blank" rel="noopener">email</a> or <a href="https://x.com/intellijidea?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor" target="_blank">X</a> by August 20. Don’t forget to check out our archive of <a href="https://www.jetbrains.com/lp/jam/" target="_blank" rel="noopener">past JAM issues</a> for any articles you might have missed!</p>
]]></content:encoded>
</item>
<item>
<title>What’s Fixed in IntelliJ IDEA 2025.2</title>
<link>https://blog.jetbrains.com/idea/2025/08/whats-fixed-intellij-idea-2025-2/</link>
<dc:creator><![CDATA[Dmitriy Smirnov]]></dc:creator>
<pubDate>Wed, 06 Aug 2025 10:39:05 +0000</pubDate>
<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/08/IJ-social-BlogFeatured-whatsfixed-1280x720-2x-min.png</featuredImage> <category><![CDATA[news]]></category>
<category><![CDATA[releases]]></category>
<category><![CDATA[2025-2]]></category>
<category><![CDATA[intellij-idea]]></category>
<category><![CDATA[intellij-idea-2025-2]]></category>
<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=idea&p=590172</guid>
<description><![CDATA[Welcome to the first-ever standalone What’s Fixed overview of an IntelliJ IDEA release! We are always working hard to make the IDE even more stable, reliable, and enjoyable to use. In previous releases, information about this work was blended into the What’s New content, making it very long and sometimes hard to grasp. To address […]]]></description>
<content:encoded><![CDATA[
<p>Welcome to the first-ever standalone What’s Fixed overview of an IntelliJ IDEA release!</p>
<p>We are always working hard to make the IDE even more stable, reliable, and enjoyable to use. In previous releases, information about this work was blended into the What’s New content, making it very long and sometimes hard to grasp. To address this issue, we’ve decided to focus the <a href="https://www.jetbrains.com/idea/whatsnew/" target="_blank" rel="noopener">What’s New</a> only on the most impactful and noticeable changes and to introduce a dedicated What’s Fixed article that focuses on the stability and quality improvements.</p>
<p>The key areas we have been working on in this release are:</p>
<ul>
<li>Spring support
<ul>
<li>Kotlin support in Spring projects</li>
<li>Spring Security and Spring Web</li>
</ul>
</li>
<li>Remote development</li>
<li>Support for WSL</li>
<li>Kotlin <em>K2 </em>mode</li>
<li>Kotlin Notebook</li>
<li>Maven execution</li>
<li>Cloud tooling</li>
<li>Performance</li>
</ul>
<p>But that’s not everything. For the full list of fixes and improvements, please refer to the <a href="https://youtrack.jetbrains.com/articles/IDEA-A-2100662472/IntelliJ-IDEA-2025.2-Beta-252.23892.248-build-Release-Notes?_gl=1*wa7bst*_gcl_aw*R0NMLjE3NTM0NjkyMTMuQ2p3S0NBancxb3pFQmhBZEVpd0FuOXFielR3YlpyN0YyeDR3cWtMaVpsZFZMVTBoaFpXZXBPZ2dRZTlyNmVPelc2dk1hUjZKQ0xkc0lSb0NBeDBRQXZEX0J3RQ..*_gcl_au*Njc0ODE5NDU2LjE3NDY3ODQxMzQ.*FPAU*MzI4MjMyMzQ1LjE3NDk4MDQwOTI.*_ga*MTcyMDkyNDk2OS4xNzQ2Nzg0MTM0*_ga_9J976DJZ68*czE3NTM2NDU1OTQkbzI1JGcxJHQxNzUzNjQ2NDc5JGo0NSRsMCRoMA.." target="_blank" rel="noopener">release notes</a>. </p>
<h2 class="wp-block-heading">Improved Kotlin support for Spring projects</h2>
<p>With Kotlin proving itself as a good fit for the Spring Framework, more and more people are using it in Spring projects. To deliver the best developer experience, we formed a <a href="https://blog.jetbrains.com/kotlin/2025/05/strategic-partnership-with-spring/">partnership between Kotlin and Spring</a>, and we are actively improving IntelliJ IDEA’s Kotlin-Spring support. Version 2025.2 brings:</p>
<ul>
<li>Live templates and context menu actions for creating Spring beans quickly, along with improvements to the <em>Logical</em> structure view to make understanding the relations between application components easier.</li>
<li>Smarter bean support: No more false injection points for constructor parameters for <code>@SpringBootTest</code> or for parameters with defaults, and improved handling of <code>@ConditionalOnProperty</code> beans.</li>
<li>Configuration made clear: The ability to go from <code>@ConfigurationProperties</code> to YAML or properties with a click, default values in code completion, and full support for nested properties.</li>
<li>Spring MVC improvements: An easier experience with path variables in request handlers, thanks to clear feedback when something doesn’t match.</li>
<li>Spring Data fixes: Better repository method completion for <code>is</code> properties, as well as cleaner support for varargs, projections, and named queries.</li>
</ul>
<h2 class="wp-block-heading">Spring Framework support</h2>
<p>Spring Framework support is a key focus area for IntelliJ IDEA. In addition to new functionality such as Spring Debugger, we continue to enhance existing features.</p>
<p>In this release, we’ve resolved a couple of minor but frustrating issues related to rule parsing in Spring Security:</p>
<ul>
<li>Custom login and logout URLs are now processed correctly. </li>
<li>Complex security configurations involving multiple role assignments for a single endpoint are now properly parsed.</li>
</ul>
<p>We’ve also enhanced support for the widely used Spring Web library. URL references – especially in MockMvc tests – are now properly recognized and autocompleted.</p>
<h2 class="wp-block-heading">Remote development</h2>
<p>Remote development – connecting to a powerful remote host where the IDE runs from a thin frontend client – is becoming the norm, with many enterprises relying on it.</p>
<p>We are fully committed to making the remote development experience in IntelliJ IDEA equal to the local one. While it has proven to be a hard endeavor for such a complex product as IntelliJ IDEA, and achieving this goal is taking time, version 2025.2 marks a huge step in this direction:</p>
<ul>
<li>The editor is now as responsive when working remotely as it is in a local setup.</li>
<li>This is also true for the <em>Search Everywhere</em>, <em>Find in Files</em>, and <em>Git Branches</em> popups.</li>
<li>The debugger has been reworked so that its backend is isolated from its frontend, making debugging work natively.</li>
<li>Plugins and settings are properly synchronized between the client and host.</li>
</ul>
<p>Last but not least – remote development connections are now available directly in the Toolbox app, with support for all OS and OpenSSH connections. And you know what? They are at least 1.5x faster!</p>
<p>For more details, refer to this <a href="https://blog.jetbrains.com/platform/2025/07/bringing-remote-closer-to-local-2025-2-highlights/">blog post</a>.</p>
<h2 class="wp-block-heading">Support for WSL</h2>
<p>The majority of our users are on Windows, which is known to have some performance limitations and specific toolchains. That is where WSL comes in handy, and roughly one out of every five Windows users works with WSL eventually.</p>
<p>IntelliJ IDEA has offered WSL support for some time. However, the way we chose to provide the integration proved unscalable and did not work well for large projects – with issues ranging from performance problems to the inability to run or even open projects.</p>
<p>To ensure you can stay productive regardless of where your project is, we started a rework of the WSL integration from the ground up. The IntelliJ Platform team created a new API that dramatically reduces communication overhead between the IDE and WSL and allows you to work with WSL projects natively as though they were in the same system as the host IntelliJ IDEA – without needing to spin up a full backend inside WSL.</p>
<p>While this is still a work in progress, we have migrated significant parts of the integration to this new API. As a result, in 2025.2:</p>
<ul>
<li>Maven and Gradle projects can be reliably built and tested, with proper JDK detection and better overall performance.</li>
<li>You now have a consistent experience with application servers, whether you’re running Tomcat or WildFly servers locally or on WSL.</li>
</ul>
<h2 class="wp-block-heading">Further improvements to Kotlin <em>K2 </em>mode</h2>
<p><em>K2 </em>mode, the new <a href="https://blog.jetbrains.com/idea/2025/04/k2-mode-in-intellij-idea-2025-1-current-state-and-faq/">default implementation</a> of Kotlin support that improves Kotlin code analysis stability and overall performance, continues to evolve. In this release, we’ve:</p>
<ul>
<li>Provided support for Kotlin 2.2 features.</li>
<li>Improved the performance of code completion.</li>
<li>Added type-smart completion support. </li>
<li>Added new inspections with corresponding coroutine-specific quick-fixes and refactorings, like <em>Convert Enum to Sealed Class</em>, <em>Extract Interface</em>, <em>Rearrange Code, </em>and <em>Create Test </em>and <em>Navigate</em> for files and functions.</li>
<li>Resolved several false-positive errors in inspections.</li>
<li>Improved the reliability of Kotlin script execution. </li>
</ul>
<p>Learn more about the state of <em>K2</em> mode in our recent <a href="https://blog.jetbrains.com/idea/2025/06/k2-mode-takes-off-high-adoption-fewer-bugs-and-major-improvements-in-2025-1/">blog post</a>.</p>
<h2 class="wp-block-heading">Quality upgrades for Kotlin Notebook</h2>
<p><a href="https://blog.jetbrains.com/idea/2025/04/how-to-use-kotlin-notebooks-for-productive-development/">Kotlin Notebook</a> is a go-to tool for performing ad hoc and prototyping tasks, presenting, writing documentation, and visualizing data, all while enjoying access to your project context and easy dependency management. Since its recent release, interest in it has been growing, and we’ve received a lot of feedback that we are now addressing, focusing on stability and the editing experience.</p>
<ul>
<li>AI Assistant cells now allow you to choose a model, view the prompt history, and get automatic suggestions.</li>
<li>Incorrect syntax highlighting has been fixed.</li>
<li>Dependency management has been improved.</li>
<li>Kotlin intentions and inspections have been added to make the editing experience close to what you get in a regular <code>.kt</code> file. </li>
</ul>
<h2 class="wp-block-heading">Maven execution</h2>
<p>Maven integration is used by half of our users. Historically, IntelliJ IDEA has additional configuration layers on top of Maven, and while they bring speed and control, some differences between execution from the IDE and from the CLI could occur. </p>
<p>One of the common reasons for such problems was that the specific environment configuration – the <code>.m2/settings</code> file, <code>.mavenrc</code>, or environment variables – was not properly inherited. Starting from 2025.2, IntelliJ IDEA starts Maven goals in such a way that the environment is fully respected.</p>
<p>Thanks to this change, it is now possible to use the Maven Daemon for goal execution. If you have one installed, specify it as a Maven home path in <em>File </em>| <em>Settings </em>| <em>Build, Execution, Deployment </em>| <em>Build Tools</em> | <em>Maven</em>, and all goals will be run using it, speeding things up a bit and reducing resource usage.</p>
<p>Project sync and goal execution now also support plugins that supply custom M2E lifecycles, for example, Byte Buddy. When such plugins are present, the required pre-build and post-build steps will be configured and executed as necessary.</p>
<h2 class="wp-block-heading">Cloud tooling</h2>
<p>Interaction with cloud services is now a major part of software development workflows. This includes the building, deployment, and sometimes managing remote environments. Terraform and Kubernetes are key tools in these scenarios, which is why they are our focus areas.</p>
<p>For <strong>Terraform, </strong>the 2025.2 update brings: </p>
<ul>
<li>Better support for provider-defined functions:
<ul>
<li>Correct syntax highlighting.</li>
<li>Quick navigation to provider definitions. </li>
<li>On-hover documentation.</li>
<li>Default code formatter.</li>
<li>Auto-completion for object variables. </li>
<li>Specific support for the Keycloak provider.</li>
<li>Support for resources in Google Cloud Beta.</li>
</ul>
</li>
<li>Ability to use <code>for_each</code> in import blocks.</li>
<li>Accurate binary detection on Windows.</li>
<li>Terraform file recognition.</li>
</ul>
<p>For <strong>Kubernetes, </strong>there are: </p>
<ul>
<li>Improved port-forwarding with automatic suggestions for ports and real-time checks for availability.</li>
<li>Better performance when working with large log files.</li>
<li>More information about pods.</li>
<li>Auto-marking of the active cluster.</li>
</ul>
<p>On top of that, this update improves the <strong>GitLab CI</strong> integration with: </p>
<ul>
<li>Smarter support for CI language variable expressions.</li>
<li>Rich code completion. </li>
<li>On-hover documentation. </li>
<li>Support for injecting shell code directly into your pipelines.</li>
</ul>
<h2 class="wp-block-heading">Debugger</h2>
<p>Debugging and profiling are essential tools for developing high-quality software, and we strive to make sure that IntelliJ IDEA’s debugger remains best in class. On top of the huge rework to provide a native debugging experience when working remotely, we’ve also fixed issues and provided additional capabilities for existing use cases.</p>
<ul>
<li>You can now evaluate code on any application pause during execution, not just at breakpoints.</li>
<li>The <em>Analyze Stack Trace or Thread Dump</em> action can now analyze outputs from the <code>jstack</code> and <code>jcmd</code> tools, including in the new JSON format.</li>
<li>The <em>Collect Thread Dump</em> action now works with the Eclipse OpenJ9 JVM.</li>
</ul>
<h2 class="wp-block-heading">GraalVM debugger</h2>
<p>Compiling JVM applications to native code significantly reduces CPU and memory usage, but debugging native images remains challenging. In this release, we’ve improved the native image debugger:</p>
<ul>
<li>Variable rendering provides richer information, for example, full object content and details about proxy objects.</li>
<li>Expression evaluation has been enhanced, making reflection calls such as <code>clazz.getMethod(“myMethod”).invoke(instance)</code> work correctly. </li>
</ul>
<h2 class="wp-block-heading">Profiler </h2>
<p>The profiling experience depends on the Java version, and there used to be cases when it didn’t work with Java 24 and the upcoming Java 25. We fixed the failures and implemented support for new language features. You can now reliably profile your application on any Java version and also easily integrate Async-Profiler 4 into your workflow.</p>
<h2 class="wp-block-heading">Performance</h2>
<h3 class="wp-block-heading">Terminal</h3>
<p>In 2025.2, we’ve enabled the <a href="https://blog.jetbrains.com/idea/2025/04/jetbrains-terminal-a-new-architecture/">reworked terminal </a>for all users. This change brings significant improvements in rendering and overall terminal performance. For bash and zsh, it also brings some minor <a href="https://blog.jetbrains.com/platform/2025/07/the-reworked-terminal-becomes-the-default-in-2025-2/">visual changes</a>, but without compromising the shells’ behavior. </p>
<h3 class="wp-block-heading">Working with data sources</h3>
<p>When working with large databases, the IDE used to load the entire schema, which produced overhead and was rather slow. Now, PostgreSQL and Microsoft SQL Server are introspected by levels, so only specific parts of the schema are loaded, reducing this overhead.</p>
<p>PostgreSQL users also benefit from smart refresh, which updates only the objects affected by DDL changes.</p>
<h2 class="wp-block-heading">Developer experience</h2>
<p>We have also invested effort into small UX improvements, especially in areas related to reading code. For example, we’ve reworked the <em>Parameter Info</em> popup to make it cleaner, more readable, and easier to use across all supported languages.</p>
<h2 class="wp-block-heading">That’s it for now </h2>
<p>Let us know what you think about the fixes and priorities in this release. Your feedback helps us steer the product so it works best for you.</p>
<p>Update to IntelliJ IDEA 2025.2 now and see how it has improved. Don’t forget to join us on X, Bluesky, or LinkedIn and share your favorite updates. </p>
<p>Thank you for using IntelliJ IDEA!</p>
]]></content:encoded>
</item>
<item>
<title>Kotlin Notebook Meets IntelliJ Platform: Advancing IDE Plugin Development</title>
<link>https://blog.jetbrains.com/platform/2025/08/kotlin-notebook-meets-intellij-platform-advancing-ide-plugin-development/</link>
<dc:creator><![CDATA[Jakub Chrzanowski]]></dc:creator>
<pubDate>Wed, 06 Aug 2025 10:32:10 +0000</pubDate>
<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2025/08/blogcover.jpg</featuredImage> <product ><![CDATA[idea]]></product>
<category><![CDATA[idea]]></category>
<category><![CDATA[intellij-platform]]></category>
<category><![CDATA[news]]></category>
<category><![CDATA[intellij-idea]]></category>
<category><![CDATA[kotlin-notebook]]></category>
<category><![CDATA[plugin-development]]></category>
<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=platform&p=589720</guid>
<description><![CDATA[The value of extensibility The ability to extend and customize software, from game mods to browser extensions, gives users a sense of freedom and the chance to bring their ideas to life. JetBrains IDEs already provide this sense of freedom through their support for plugins. For some time now, creating plugins for JetBrains IDEs has […]]]></description>
<content:encoded><![CDATA[
<h2 class="wp-block-heading">The value of extensibility</h2>
<p>The ability to extend and customize software, from game mods to browser extensions, gives users a sense of freedom and the chance to bring their ideas to life. JetBrains IDEs already provide this sense of freedom through their support for plugins.</p>
<p>For some time now, creating plugins for JetBrains IDEs has been possible, but getting started with these sorts of projects can be intimidating. Navigating documentation, project templates, IntelliJ Platform dependencies, and Gradle configurations can be overwhelming for those wanting to experiment and test their ideas in real-world scenarios. Luckily, there’s now a more efficient option!</p>
<h2 class="wp-block-heading">Introducing Kotlin Notebook</h2>
<p><a href="https://kotlinlang.org/docs/kotlin-notebook-overview.html" target="_blank" rel="noopener">Kotlin Notebook</a> is an interactive platform for data analysis, visualization, and prototyping with Kotlin. Like <a href="https://www.jetbrains.com/help/idea/jupyter-notebook-support.html" target="_blank" rel="noopener">Jupyter Notebook</a>, it provides a robust environment for data scientists, engineers, and researchers to explore and showcase their work within a dynamic, executable document. It combines Kotlin’s capabilities with the interactiveness of notebooks, allowing you to write and run code while seeing the results and visualizations in the same environment. This encourages an iterative workflow, boosting productivity and collaboration on data projects.</p>
<p>Building on the Kotlin Notebook plugin, we have started exploring how to connect it with the IntelliJ Platform. This enables the direct execution of IntelliJ Platform code from a notebook file within the active IDE runtime. The iterative workflow of Kotlin notebooks allows you to brainstorm, build, and test plugin features faster. The integration with the IntelliJ Platform makes moving the finished code into your plugin easy.</p>
<p>This initial idea has developed into a strong integration, and as of the 2025.2 release, the functionality is now available for use.</p>
<h2 class="wp-block-heading">Getting started: A practical guide</h2>
<p>To get started, create a new Kotlin notebook either as a new file in your project or as a scratch file, using <em>⌘⇧N</em> on macOS or <em>Ctrl+Shift+N</em> on Windows/Linux.</p>
<p>Notebooks are based on the concept of cells. To start using this integration, switch to <em>Run in IDE Process</em> mode, create a new code cell, and declare:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%use intellij-platform</pre>
<p><em>Due to the technical issues on Windows, it’s recommended to explicitly request the latest available version until the IntelliJ IDEA 2025.2.1 is released using:</em></p>
<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">%useLatestDescriptors
%use intellij-platform</pre>
<p>Once you do this, the necessary IntelliJ Platform libraries will be loaded into the notebook’s classpaths, making them available for import in the subsequent cells.</p>
<p><img decoding="async" loading="lazy" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXftIhQnfhhds-Hw1Dh9V4XAdeHHNQiwPSH9Yzxr7o2cERn8JSPcUK4t0d0d3XVIgyhCn3Ill0M5_cT-Ak6lXhk15qp5CF5AmnWNE9h7cVxUIU4sapETvXE_o5zFub21z-4Zj1msGg?key=tNYDRWqidask_XIm7YvuZw" width="2048" height="873"></p>
<h2 class="wp-block-heading">Core features</h2>
<h3 class="wp-block-heading">UI rendering made simple</h3>
<p>The ability to run code within the same IDE environment removes the need to build a full plugin project to test UI components. The <code>runInEdt {}</code> The helper ensures that the code runs on the <a href="https://plugins.jetbrains.com/docs/intellij/threading-model.html" target="_blank" rel="noopener">Event Dispatch Thread (EDT)</a>, catching any exceptions and showing them below your cell.</p>
<p><img decoding="async" loading="lazy" width="1920" height="1080" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXchES9lcHtUgH4LfBac59DMF24YQbVOzdQ77CFqWOGbKX6cQ9yMe39N0QhKiQkyxUtp05R3s7JQX3mN_uKIXHXRv10yCNSPqUuy7gqh9me8625RI8kN2xGjxg9Lu1xpnyI9M7kl?key=tNYDRWqidask_XIm7YvuZw"></p>
<p>Returning UI elements as a response when working with the <a href="https://plugins.jetbrains.com/docs/intellij/kotlin-ui-dsl-version-2.html" target="_blank" rel="noopener">Kotlin UI DSL</a> or standard Swing components renders them immediately. All rendered components stay fully interactive.</p>
<p><img decoding="async" loading="lazy" width="1920" height="1080" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdZUvpJK-5APzmB8-0EPRrxF_w1ekGzIFww1e__Vvkv9k_Pa34YSzKddnNbhBGmmlqiMR0hfdsg3lDx5umL7bxPc6wYUGPn3CZVgI38hRgTO1Z86aXhtfRtwyfYYOlald1Fq-6I?key=tNYDRWqidask_XIm7YvuZw"></p>
<h3 class="wp-block-heading">Resource management with the Disposer</h3>
<p>The integration uses the <a href="https://plugins.jetbrains.com/docs/intellij/disposers.html" target="_blank" rel="noopener">Disposer</a> mechanism available in the IntelliJ Platform. A dedicated global <code>notebookDisposable</code> variable allows for registering and later disposing of specific notebook elements, such as extensions, listeners, actions, or UI components. This ensures the IDE manages the lifetime of your objects when you close the project or restart the notebook.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// Register something that needs cleanup
Disposer.register(notebookDisposable, myDisposable)
Disposer.register(notebookDisposable) {
// Cleanup components directly
}
</pre>
<p><img decoding="async" loading="lazy" width="1920" height="1080" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeHvKzUozs-RK76UtnCZfxOgXJ888K1fraAThJdrzhCW7iZ2DjJg97kfU1VDmN24KDb5e1TOpnzgUAg_lQwlNG8V3L-lnSvOL0zFUCaXMzOA_mKBqKrUNyYZlhZMgfzu9JWyVgDsA?key=tNYDRWqidask_XIm7YvuZw"></p>
<h3 class="wp-block-heading">Loading plugins</h3>
<p>When you integrate your notebook with the IntelliJ Platform, only the core platform is initially loaded into the classpath, similarly to when you’re working on a standalone plugin. However, you may need to depend on and use other plugins, whether bundled or installed from JetBrains Marketplace. To load plugins installed in your IDE, you must explicitly call the <code>loadPlugins(vararg pluginIds: String)</code> helper.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// Load specific plugins
loadPlugins("Git4Idea", "com.intellij.java")</pre>
<p><img decoding="async" loading="lazy" width="2048" height="1391" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXezhZtOwQNIqIRxluoB58U5tR0g-EVBpqgizMzlZfU079eovZViVOx0U8DgVofnBcyFhLVXoeOid5cn4GZAZ_eEUVOs7jW0mwEg20JPAm3j81ew394KhJNfm1LbgZXXiF8PvJvppg?key=tNYDRWqidask_XIm7YvuZw"></p>
<h3 class="wp-block-heading">Extension registration</h3>
<p>In traditional plugin development, <a href="https://plugins.jetbrains.com/docs/intellij/plugin-extensions.html" target="_blank" rel="noopener">extensions</a> are defined in the <code>plugin.xml</code> file. With Kotlin notebooks, you can dynamically register extensions using <code>registerExtension()</code>, avoiding the need for a structured plugin project.</p>
<p>For example, to register a custom <code>ChatMessageHandler</code> and <code>ChatAgent</code> for the AI Assistant plugin, you can simply run the following:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">loadPlugins("com.intellij.ml.llm")</pre>
<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class MyChatMessageHandler : ChatMessageHandler {
override fun isApplicable(project: Project, kind: ChatKind, userMessage: UserMessage) = true
override fun createAnswerMessage(
project: Project,
chat: ChatSession,
userMessage: UserMessage,
kind: ChatKind,
) = SimpleCompletableMessage(chat)
override suspend fun serveAnswerMessage(
project: Project,
chat: ChatSession,
answerMessage: ChatMessage,
smartChatEndpoints: List<SmartChatEndpoint>,
) {
ChatAgent.EP_NAME.extensionList
.find { it.id == "groot" }
?.serveAnswerMessage(project, chat, answerMessage)
}
}
registerExtension(ChatMessageHandler.EP, MyChatMessageHandler())</pre>
<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class MyChatAgent : ChatAgent {
override val id = "groot"
override val name = "I am Groot"
override fun createAnswerMessage(
project: Project,
chat: ChatSession,
userMessage: UserMessage,
kind: ChatKind,
) = SimpleCompletableMessage(chat)
override suspend fun serveAnswerMessage(
project: Project,
chat: ChatSession,
answerMessage: ChatMessage,
) {
answerMessage as SimpleCompletableMessage
answerMessage.appendText("*I am Groot*".privacyConst)
}
}
registerExtension(ChatAgent.EP_NAME, MyChatAgent())</pre>
<p>Similarly, you can register a custom UI theme as follows:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import com.intellij.ide.ui.UIThemeProvider
val theme = UIThemeProvider().apply {
id = "My Theme"
path = "Theme.json"
}
registerExtension(UIThemeProvider.EP_NAME, theme)</pre>
<p>This approach allows you to experiment and test extensions instantly within the IDE runtime, streamlining development and saving time.</p>
<h3 class="wp-block-heading">Exploring your IDE environment</h3>
<p>The integration provides several ways to access the internal details of the currently running IDE, such as its build details and location in the file system. Exposed mechanisms such as the Plugin Manager and Plugin Repository allow for interacting with plugins available in JetBrains Marketplace, or even ones installed locally. All available variables and helper methods are documented in the relevant section in the <a href="https://plugins.jetbrains.com/docs/intellij/tools-kotlin-notebook.html" target="_blank" rel="noopener">IntelliJ Platform SDK documentation</a>.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// Access IDE information
productInfo.name // "IntelliJ IDEA"
productInfo.version // "2025.3"
productInfo.buildNumber // "253.xxxx"
idePath // “/Users/hsz/Applications/IntelliJ IDEA Ultimate 2025.3 Nightly.app/Contents”
ide // com.jetbrains.plugin.structure.ide.Ide instance
// Work with the plugin manager
pluginManager.findEnabledPlugin(PluginId.getId("com.intellij.java"))
// Request JetBrains Marketplace
pluginRepository.pluginManager.searchCompatibleUpdates(
build = "${productInfo.productCode}-${productInfo.buildNumber}",
xmlIds = listOf(“org.jetbrains.junie”),
channel = “default”,
)</pre>
<h2 class="wp-block-heading">Opportunities and improvements</h2>
<p>Integrating Kotlin Notebook with the IntelliJ Platform represents a significant step forward for custom plugin development. With traditional barriers associated with project setup, compilation, and deployment removed, developers can now concentrate more effectively on implementing their ideas.</p>
<p>We already have great ideas for ways to improve this experience further:</p>
<ul>
<li><strong>Rapid prototyping of IDE features and plugins</strong>: This functionality allows for the development of features, with the potential for AI assistance in the refinement process. Once you’ve completed a scratch implementation of your plugin in your notebook file and it is ready to be adapted for use in a <a href="https://jb.gg/plugin-template" target="_blank" rel="noopener">Plugin Template</a>-based project, you can use Junie to convert it and give it a formal plugin structure.</li>
<li><strong>Expeditious testing of platform APIs and behaviors</strong>: The JetBrains QA teams are already using Kotlin notebooks to debug the IntelliJ Platform more quickly, achieving particular success when using them with a UI testing framework. Improving scripting and adding reusable helpers can make notebooks more adaptable and suited to this use case.</li>
<li><strong>Interactive documentation and tutorials for IntelliJ Platform development:</strong> The storytelling style of notebooks, combining runnable code snippets with explanatory comments, can create a more engaging learning experience.</li>
<li><strong>Compose/Jewel support:</strong> As development advances in this area, the ability to render <a href="https://github.com/JetBrains/intellij-community/tree/master/platform/jewel" target="_blank" rel="noopener">Compose/Jewel components</a> is a natural next step, mirroring the current functionality supplied by Java Swing or the <a href="https://plugins.jetbrains.com/docs/intellij/kotlin-ui-dsl-version-2.html" target="_blank" rel="noopener">Kotlin UI DSL</a>. This can be especially useful for prototyping IDE-specific UI/UX elements, whether you’re developing plugins or working on an entire IDE based on the IntelliJ Platform.</li>
</ul>
<h2 class="wp-block-heading">Take it for a spin and let us know what you think!</h2>
<p>Follow these simple steps to get started:</p>
<ol>
<li>Create a new Kotlin Notebook.</li>
<li>Switch to Run in IDE Process mode.</li>
<li>Unleash your creativity with <code>%use intellij-platform</code>.</li>
</ol>
<p>If you’d like to share feedback, please visit the <a href="https://platform.jetbrains.com/c/intellij-platform/kotlin-notebook/25" target="_blank" rel="noopener">JetBrains Platform forum</a>, where we can discuss any challenges and ideas for improving this integration. You can also join the <a href="https://kotlinlang.slack.com/archives/C05333T208Y" target="_blank" rel="noopener">#notebooks</a> public Slack channel for discussions and questions.</p>
<p>The IntelliJ Platform integration and the examples featured in this article are now <a href="https://github.com/Kotlin/kotlin-notebook-intellij-platform" target="_blank" rel="noopener">publicly accessible on GitHub</a>, along with a dedicated section in the <a href="https://plugins.jetbrains.com/docs/intellij/tools-kotlin-notebook.html" target="_blank" rel="noopener">IntelliJ Platform SDK documentation</a>. We welcome pull requests with ideas to improve the user experience.</p>
<p>Happy hacking!<br>Jakub</p>
]]></content:encoded>
</item>
</channel>
</rss>