<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">

    <channel>
        <title>Quarkus</title>
        <link>https://quarkus.io</link>
        <description>Quarkus: Supersonic Subatomic Java</description>
        <lastBuildDate>Wed, 13 May 2026 09:53:35 +0000</lastBuildDate>
        
        
        <item>
            <title>Introducing Quarkus Agent MCP: teaching AI agents to speak Quarkus</title>
            <link>
                https://quarkus.io/blog/introducing-agent-mcp/
            </link>
            <description>
                &lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;AI coding agents like Claude Code, GitHub Copilot, Cursor, Windsurf, and JetBrains AI are already capable of generating code, fixing bugs, and refactoring entire modules.
But they become much more effective when they have context about the framework you are using: that Quarkus dev mode hot-reloads on the next request rather than on file save, that Panache entities need &lt;code&gt;@Transactional&lt;/code&gt; for writes, that REST clients should be injected via CDI rather than instantiated manually.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus-agent-mcp&quot;&gt;Quarkus Agent MCP&lt;/a&gt; gives agents exactly that context.
It is a standalone &lt;a href=&quot;https://modelcontextprotocol.io&quot;&gt;MCP (Model Context Protocol)&lt;/a&gt; server that lets any compatible AI agent create, manage, and work effectively with Quarkus applications by providing Quarkus-specific tools, documentation, and extension-level coding patterns.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-mcp&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-mcp&quot;&gt;&lt;/a&gt;What is MCP?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://modelcontextprotocol.io&quot;&gt;Model Context Protocol&lt;/a&gt; is an open standard that lets AI agents discover and use tools exposed by external servers.
Instead of hard-coding integrations for every framework, an agent connects to MCP servers that provide domain-specific capabilities.
The agent discovers available tools at runtime and calls them as needed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It&amp;#8217;s a plugin system for AI agents: connect to a server and the agent gains new capabilities.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-a-standalone-server&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-a-standalone-server&quot;&gt;&lt;/a&gt;Why a standalone server?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus already has a built-in Dev MCP server that exposes tools from inside a running application: endpoints, configuration, dev services, testing, and more.
So why add another server?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The answer is &lt;strong&gt;lifecycle&lt;/strong&gt;.
The built-in Dev MCP server lives inside the Quarkus process.
When the app crashes (a compilation error, a missing bean, a bad migration), that MCP server dies with it.
The agent loses its connection and cannot inspect what went wrong.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus Agent MCP runs as a separate process.
It wraps &lt;code&gt;quarkus dev&lt;/code&gt; as a child process and stays alive when the application crashes.
The agent can read the logs, get structured exception details, fix the code, and watch the app recover on its own.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/agent-mcp/architecture-diagram.png&quot; alt=&quot;Quarkus Agent MCP Architecture&quot; width=&quot;100%&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;getting-started&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#getting-started&quot;&gt;&lt;/a&gt;はじめに&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Install via &lt;a href=&quot;https://www.jbang.dev&quot;&gt;JBang&lt;/a&gt; with a single command.
For Claude Code:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;claude mcp add quarkus-agent -- jbang quarkus-agent-mcp@quarkusio&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Or as a Claude Code plugin:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;claude plugin marketplace add quarkusio/quarkus-agent-mcp
claude plugin install quarkus-agent@quarkus-tools&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The README covers configuration for VS Code, Cursor, Windsurf, JetBrains, and other MCP-compatible tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once installed, you can verify it works by asking your agent:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Search the Quarkus docs for how to create a REST endpoint&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The agent will use the &lt;code&gt;quarkus_searchDocs&lt;/code&gt; tool and return documentation results.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-the-agent-can-do&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-the-agent-can-do&quot;&gt;&lt;/a&gt;What the agent can do&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus Agent MCP exposes tools organized into five areas.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;create-applications&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#create-applications&quot;&gt;&lt;/a&gt;Create applications&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;quarkus_create&lt;/code&gt; tool scaffolds a new Quarkus project from natural language.
Ask your agent to &lt;em&gt;&quot;create a Quarkus REST API with PostgreSQL and Panache&quot;&lt;/em&gt; and it will pick the right extensions, create the project, start it in dev mode, and generate a &lt;code&gt;AGENTS.md&lt;/code&gt; — a convention file that AI agents read for project-specific instructions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;learn-before-coding-extension-skills&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#learn-before-coding-extension-skills&quot;&gt;&lt;/a&gt;Learn before coding: extension skills&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before writing a single line of code, the agent calls &lt;code&gt;quarkus_skills&lt;/code&gt; to load coding patterns for the application&amp;#8217;s extensions.
These skills contain the kind of knowledge that usually lives in a senior developer&amp;#8217;s head: which annotations to use, how to write tests, what the common pitfalls are, and troubleshooting guidance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example, the Hibernate Validator skill teaches the agent that constraint violations on REST endpoint parameters automatically return HTTP 400, that &lt;code&gt;@Valid&lt;/code&gt; is required for cascading validation on nested objects, and that method validation only works on CDI-managed beans.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Without skills, the agent might still produce working code, especially with larger models, but the results become less predictable.
Skills level the playing field: even smaller, cheaper models produce correct idiomatic Quarkus code when they have the right patterns to follow.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More on how skills work, and how you can write your own, later in this post.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;search-documentation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#search-documentation&quot;&gt;&lt;/a&gt;Search documentation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;quarkus_searchDocs&lt;/code&gt; tool performs semantic search over the full Quarkus documentation.
On first use, a Docker/Podman container with pre-indexed documentation starts automatically.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
The search implementation (currently using BGE embeddings and pgvector) is still being iterated on and may change in future versions.
The documentation version matches the project&amp;#8217;s Quarkus version, so the agent never gives advice based on a different release.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;manage-the-application-lifecycle&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#manage-the-application-lifecycle&quot;&gt;&lt;/a&gt;Manage the application lifecycle&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The agent can start, stop, and restart the application.
It can check the application status, read logs, and list all managed instances.
When the app crashes, the agent uses the Dev MCP proxy to call &lt;code&gt;devui-exceptions_getLastException&lt;/code&gt;, which returns the exception class, message, stack trace, and exact source location.
It then fixes the code and lets hot reload do the rest.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;proxy-to-dev-mcp-tools&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#proxy-to-dev-mcp-tools&quot;&gt;&lt;/a&gt;Proxy to Dev MCP tools&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once the application is running, the agent can discover and call any tool exposed by the built-in Dev MCP server.
This includes running tests, listing endpoints, inspecting dev services, changing configuration, and managing extensions, all through a single proxy layer.
The tool list is dynamic: when you add or remove extensions, the agent re-discovers the available tools automatically.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-development-workflow&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-development-workflow&quot;&gt;&lt;/a&gt;The development workflow&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is what an agent-driven development session looks like in practice:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;For a new project:&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;quarkus_create&lt;/code&gt;: scaffold the project, auto-start dev mode&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;quarkus_skills&lt;/code&gt;: learn extension patterns before writing code&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;quarkus_searchDocs&lt;/code&gt;: look up APIs and configuration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write code and tests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run tests via &lt;code&gt;quarkus_callTool&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the app crashes, read the exception, fix, and iterate&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;For an existing project:&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;quarkus_update&lt;/code&gt;: check if the Quarkus version is current&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;quarkus_start&lt;/code&gt;: start dev mode&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;quarkus_skills&lt;/code&gt;: learn extension patterns&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Develop, test, iterate&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The key insight is &lt;strong&gt;skills before code&lt;/strong&gt;.
The agent does not guess at patterns.
It reads the skills, then writes code that follows them.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;for-extension-authors-shipping-skills-with-your-extension&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#for-extension-authors-shipping-skills-with-your-extension&quot;&gt;&lt;/a&gt;For extension authors: shipping skills with your extension&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you maintain a Quarkus extension, whether in core, Quarkiverse, or your own organization, you can ship a skill file that teaches every AI agent how to use your extension correctly.
The agent picks up the skill automatically when a developer adds your extension to their project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-goes-into-an-extension-skill&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-goes-into-an-extension-skill&quot;&gt;&lt;/a&gt;What goes into an extension skill?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A skill file is a Markdown document at &lt;code&gt;META-INF/quarkus-skill.md&lt;/code&gt; in your extension&amp;#8217;s &lt;strong&gt;deployment&lt;/strong&gt; JAR.
It should contain the practical knowledge an agent needs to write correct code with your extension:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Coding patterns&lt;/strong&gt;: the right way to use your APIs, with brief examples&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Testing guidelines&lt;/strong&gt;: how to write tests that work with your extension&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Common pitfalls&lt;/strong&gt;: mistakes the agent should avoid&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configuration&lt;/strong&gt;: key properties and their effect&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is an abbreviated example from the Hibernate Validator extension:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-markdown hljs&quot; data-lang=&quot;markdown&quot;&gt;### Bean Validation Annotations

- Use constraints from `jakarta.validation.constraints` packages,
  e.g. `@NotNull`, `@NotBlank`, `@Size`, `@Min`, `@Max`, `@Email`, `@Pattern`
  on class fields and getters or on method parameters of CDI beans.
- Use `@Valid` for cascading validation on nested types.

### REST Integration

- Constraint violations on REST endpoint **parameters** automatically return
  HTTP 400 with validation details.
- Return value validation results in HTTP 500, not 400. Handle
  `ConstraintViolationException` explicitly if you need custom error responses.

### Common Pitfalls

- Do NOT forget `@Valid` on nested object parameters. Without it, constraints
  on nested object fields are silently ignored.
- Method validation only works on CDI-managed beans. Calls on plain `new`
  objects are not validated.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;where-to-put-it&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#where-to-put-it&quot;&gt;&lt;/a&gt;Where to put it&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Place the file at:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-none hljs&quot;&gt;your-extension/
  deployment/
    src/main/resources/
      META-INF/
        quarkus-skill.md&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That is it.
When the extension is published and a developer adds it to their project, &lt;code&gt;quarkus_skills&lt;/code&gt; will discover the skill from the deployment JAR in the local Maven repository, compose it with metadata from &lt;code&gt;quarkus-extension.yaml&lt;/code&gt;, and include any Dev MCP tools your extension exposes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
Per-extension skill discovery from deployment JARs requires Quarkus 3.35.0+. For older versions, the agent will rely on &lt;code&gt;quarkus_searchDocs&lt;/code&gt; for guidance instead.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;writing-effective-skills&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#writing-effective-skills&quot;&gt;&lt;/a&gt;Writing effective skills&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Keep these principles in mind:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Be prescriptive, not descriptive.&lt;/strong&gt;
The agent does not need a tour of your API surface; it can read Javadoc for that.
It needs to know the &lt;em&gt;right&lt;/em&gt; pattern to use and the mistakes to avoid.
Instead of &quot;the &lt;code&gt;@Transactional&lt;/code&gt; annotation can be used on methods,&quot; write &quot;always annotate write operations with &lt;code&gt;@Transactional&lt;/code&gt;.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Focus on what surprises people.&lt;/strong&gt;
If every new developer hits the same three issues with your extension, those belong in the skill.
If something works exactly as expected, you probably do not need to mention it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Keep it concise.&lt;/strong&gt;
A skill that is 50 lines of actionable guidance beats 500 lines of documentation rehash.
The agent will search the full documentation via &lt;code&gt;quarkus_searchDocs&lt;/code&gt; when it needs details.
The skill is for the patterns and pitfalls that documentation alone does not prevent.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Include testing patterns.&lt;/strong&gt;
How should tests be written for your extension?
What test infrastructure does it provide?
This is one of the areas where agents struggle most without guidance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Test with a cheap model.&lt;/strong&gt;
A large frontier model might produce correct code even without your skill.
The real test is whether a smaller, cheaper model (like Haiku or GPT-4o mini) gets it right when following your skill.
If it does, your skill is doing its job.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-three-layer-composition-system&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-three-layer-composition-system&quot;&gt;&lt;/a&gt;The three-layer composition system&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Different teams have different conventions, and sometimes the built-in skill does not cover a specific use case.
To handle this, skills use a three-layer composition system:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Extension skill&lt;/strong&gt;: ships with the extension itself (&lt;code&gt;META-INF/quarkus-skill.md&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;User-level skill&lt;/strong&gt;: stored at &lt;code&gt;~/.quarkus/skills/&amp;lt;extension-name&amp;gt;/SKILL.md&lt;/code&gt;, applies to all projects for that developer&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Project-level skill&lt;/strong&gt;: stored at &lt;code&gt;.agent/skills/&amp;lt;extension-name&amp;gt;/SKILL.md&lt;/code&gt;, applies to one project only&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Layers 1 and 2 support &lt;strong&gt;enhance&lt;/strong&gt; (append additional guidance) and &lt;strong&gt;override&lt;/strong&gt; (fully replace) composition, controlled by the &lt;code&gt;mode&lt;/code&gt; field in the SKILL.md frontmatter:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-markdown hljs&quot; data-lang=&quot;markdown&quot;&gt;---
mode: enhance
---

### Our team conventions

- Always use constructor injection, never field injection.
- Name REST resource classes with the `Resource` suffix, not `Controller`.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Project-level skills (layer 3) are standalone files read as-is, with no composition against the base layers.
This means any agent can read them directly from the filesystem without needing to understand the composition chain.
Use the &lt;code&gt;quarkus_saveSkill&lt;/code&gt; tool to materialize a fully composed skill into &lt;code&gt;.agent/skills/&lt;/code&gt;, then edit the file directly to customize it for your project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For global customizations that apply across all projects, the agent can use &lt;code&gt;quarkus_updateSkill&lt;/code&gt; to write to &lt;code&gt;~/.quarkus/skills/&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;privacy&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#privacy&quot;&gt;&lt;/a&gt;Privacy&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus Agent MCP runs entirely on your machine.
It does not collect telemetry or send data to any third party.
Outbound network requests are limited to downloading extension JARs from Maven Central, pulling pre-indexed documentation containers, and checking for Quarkus version updates. Everything is cached locally after the first use.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-next&quot;&gt;&lt;/a&gt;What is next&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus Agent MCP is part of the &lt;a href=&quot;https://github.com/quarkusio/quarkus/discussions/53093&quot;&gt;DevStar working group&lt;/a&gt; and we are actively developing new capabilities.
If you are an extension author interested in shipping skills, or a developer with feedback on the workflow, we want to hear from you.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Try it out:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;claude mcp add quarkus-agent -- jbang quarkus-agent-mcp@quarkusio&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
This example uses Claude Code, but any coding agent that supports the MCP protocol (Cursor, Windsurf, GitHub Copilot, JetBrains AI, and others) can connect to Quarkus Agent MCP. See the &lt;a href=&quot;https://github.com/quarkusio/quarkus-agent-mcp&quot;&gt;README&lt;/a&gt; for configuration instructions for each agent.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then ask your agent to build something.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus-agent-mcp&quot;&gt;GitHub repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus-agent-mcp/issues&quot;&gt;Report issues&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/discussions/53093&quot;&gt;DevStar working group discussion&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/introducing-agent-mcp/
            </guid>
            
            
            
            <author>Phillip Kruger (https://twitter.com/phillipkruger)</author>
            
        </item>
        
        <item>
            <title>Faster Startup on IBM Semeru with OpenJ9 Shared Classes Cache</title>
            <link>
                https://quarkus.io/blog/semeru-scc/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Slow startup times have long been a challenge for Java applications. Project Leyden addressed this for JVMs like Temurin 25+, which are based on HotSpot, but what about users of JVMs based on IBM OpenJ9 like Semeru?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In our &lt;a href=&quot;https://quarkus.io/blog/leyden-2/&quot;&gt;previous post&lt;/a&gt;, we described how we integrated Project Leyden into Quarkus, bringing JVM startup way down.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But not everyone runs HotSpot-based JVMs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many teams, especially in enterprise environments, run &lt;a href=&quot;https://www.ibm.com/semeru-runtimes&quot;&gt;IBM Semeru Runtimes&lt;/a&gt;, IBM&amp;#8217;s production Java runtime built on the &lt;a href=&quot;https://eclipse.dev/openj9/&quot;&gt;Eclipse OpenJ9&lt;/a&gt; JVM.
These teams deserve the similar startup improvements, with the same ease of use.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That&amp;#8217;s what we built. Starting with Quarkus 3.35, the same &lt;code&gt;quarkus.package.jar.aot.enabled=true&lt;/code&gt; flag that activates Leyden on OpenJDK now automatically generates an OpenJ9 Shared Classes Cache on IBM Semeru.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;No code changes. No additional configuration. Quarkus detects the JVM and does the right thing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-the-openj9-shared-classes-cache&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-the-openj9-shared-classes-cache&quot;&gt;&lt;/a&gt;What is the OpenJ9 Shared Classes Cache?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Eclipse OpenJ9 JVM has long offered a feature called &lt;a href=&quot;https://eclipse.dev/openj9/docs/shrc/&quot;&gt;Shared Classes Cache (SCC)&lt;/a&gt;.
The concept is similar to what Project Leyden does for HotSpot, but it predates Leyden by many years and goes further in some respects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At its core, the SCC is a region of shared memory — either a memory-mapped file (persistent) or shared memory segment (non-persistent) — that stores data the JVM would otherwise have to recompute on every startup.
When a class is loaded for the first time, OpenJ9 automatically stores it in the cache.
On subsequent startups, the JVM finds it there and skips parsing, verification, and loading from disk entirely.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But class data is only the beginning. The SCC stores three categories of data:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;クラスメタデータ&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Parsed and verified class structures, ready to use without re-reading JAR files.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;AOT-compiled native code&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;The OpenJ9 AOT compiler dynamically compiles Java methods into native code at runtime and stores them in the cache. On subsequent runs, these pre-compiled methods execute immediately instead of being interpreted. The VM &lt;a href=&quot;https://eclipse.dev/openj9/docs/aot/&quot;&gt;automatically selects&lt;/a&gt; which methods to AOT-compile using heuristics that identify the startup phase of large applications — no manual configuration needed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;JIT profiling data and compilation hints&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;The JIT compiler stores profiling information and optimization hints in the cache, allowing subsequent JVM instances to make better compilation decisions from the start. When a cached AOT method runs, the JIT compiler can further optimize it based on actual runtime behavior, giving you the best of both worlds.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The result: significantly faster startup, lower memory overhead during class loading, and a warmer JIT from the very first request.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unlike other class data sharing implementations, the OpenJ9 SCC is fully dynamic: it is populated transparently as your application runs, without requiring a separate offline step to enumerate classes.
The cache is also designed for multi-JVM environments — multiple JVM instances can share the same cache simultaneously, reducing the aggregate memory footprint when running several Java applications on the same host.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are familiar with how Leyden works, much of this will sound familiar. The key difference is that SCC is specific to the OpenJ9 JVM and has been production-hardened over many years, while Leyden is a newer effort within OpenJDK targeting HotSpot.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;using-it&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#using-it&quot;&gt;&lt;/a&gt;Using it&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you already have &lt;code&gt;quarkus.package.jar.aot.enabled=true&lt;/code&gt; in your build, you don&amp;#8217;t need to change anything. Just build with a Semeru JDK:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock primary asciidoc-tabs-sync-maven&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Maven&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;./mvnw verify -Dquarkus.package.jar.aot.enabled=true -DskipITs=false&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock secondary asciidoc-tabs-sync-gradle&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Gradle&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;./gradlew build quarkusIntTest -Dquarkus.package.jar.aot.enabled=true&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That&amp;#8217;s it. The build:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Packages your application with the &lt;code&gt;aot-jar&lt;/code&gt; format.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Starts the application with &lt;code&gt;-Xshareclasses:name=quarkus-app,cacheDir=app-scc&lt;/code&gt;, which tells OpenJ9 to populate the cache as the application runs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your &lt;code&gt;@QuarkusIntegrationTest&lt;/code&gt; tests run against it, exercising your endpoints and features. During this time, OpenJ9 is continuously populating the cache with class data, AOT-compiled methods, and JIT profiling hints.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When the tests finish and the application shuts down, the &lt;code&gt;app-scc/&lt;/code&gt; directory contains a fully populated Shared Classes Cache.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once that is done, verify that your logs contain &lt;code&gt;Detected IBM Semeru Runtime - using Shared Classes Cache&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To run the application with the cache:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;cd target/quarkus-app
java -Xshareclasses:name=quarkus-app,cacheDir=app-scc,readonly -jar quarkus-run.jar&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;readonly&lt;/code&gt; flag prevents the cache from being modified at runtime.
This is the recommended setting for production: the cache is an artifact of the build, not something that should drift in production.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The generated &lt;code&gt;app-scc/&lt;/code&gt; directory must be deployed alongside your JAR:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-none hljs&quot;&gt;target/quarkus-app/
├── app-scc/              &lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
├── quarkus-run.jar
├── lib/
└── quarkus/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The Shared Classes Cache directory. Its contents are opaque to the user — OpenJ9 manages the internal structure.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;customizing-the-training-run&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#customizing-the-training-run&quot;&gt;&lt;/a&gt;Customizing the training run&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you need to pass additional JVM flags during the training run (for example, to increase heap size or enable specific JVM features), you can use:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-properties hljs&quot; data-lang=&quot;properties&quot;&gt;quarkus.package.jar.aot.additional-recording-args=-Xmx512m&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;troubleshooting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#troubleshooting&quot;&gt;&lt;/a&gt;トラブルシューティング&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If the cache doesn&amp;#8217;t seem to improve startup, first verify it is actually being used.
Enable verbose output by replacing &lt;code&gt;readonly&lt;/code&gt; with &lt;code&gt;readonly,verboseIO&lt;/code&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;java -Xshareclasses:name=quarkus-app,cacheDir=app-scc,readonly,verboseIO -jar quarkus-run.jar&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This prints detailed information about each class loaded from the cache versus the filesystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also make sure you are using the exact same Semeru JVM version to run the application as was used to build the cache.
OpenJ9 uses internal generation numbers to detect incompatible caches; a version mismatch will cause the cache to be ignored.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-auto-detection-works&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-auto-detection-works&quot;&gt;&lt;/a&gt;How auto-detection works&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When &lt;code&gt;quarkus.package.jar.aot.enabled=true&lt;/code&gt; is set and no explicit type is configured, Quarkus picks the best strategy for the JVM it detects at build time:&lt;/p&gt;
&lt;/div&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 33.3334%;&quot;&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Build JVM&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Strategy&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;IBM Semeru&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Shared Classes Cache (&lt;code&gt;-Xshareclasses&lt;/code&gt;)&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;app-scc/&lt;/code&gt; directory&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;HotSpot (25+)&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Leyden AOT (&lt;code&gt;-XX:AOTCache&lt;/code&gt;)&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;app.aot&lt;/code&gt; file&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Older HotSpot&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;AppCDS (&lt;code&gt;-XX:SharedArchiveFile&lt;/code&gt;)&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;app-cds.jsa&lt;/code&gt; file&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The detection checks &lt;code&gt;java.runtime.name&lt;/code&gt; for the string &lt;code&gt;semeru&lt;/code&gt;. If it matches, the SCC path is chosen. Otherwise, Quarkus checks the Java version: 25 or higher selects Leyden, anything older falls back to AppCDS.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you need to override the auto-detection (for example, to force AppCDS on Semeru for comparison), you can set the type explicitly:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-properties hljs&quot; data-lang=&quot;properties&quot;&gt;quarkus.package.jar.aot.type=SCC&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Valid values are &lt;code&gt;AUTO&lt;/code&gt; (the default), &lt;code&gt;AOT&lt;/code&gt;, &lt;code&gt;AppCDS&lt;/code&gt;, and &lt;code&gt;SCC&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;one-flag-every-jvm&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#one-flag-every-jvm&quot;&gt;&lt;/a&gt;One flag, every JVM&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is the design decision we are most proud of in this work. Your build configuration, CI pipeline, and Dockerfile don&amp;#8217;t need to know which JVM will run the application. Set &lt;code&gt;quarkus.package.jar.aot.enabled=true&lt;/code&gt;, and the build adapts.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This matters in practice. Teams that standardize on Semeru for some services and HotSpot for others can use the same Quarkus build configuration everywhere. Switching JVMs doesn&amp;#8217;t require touching &lt;code&gt;application.properties&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It also means that the Quarkus documentation, guides, and examples work the same way regardless of the JVM.
When we write &quot;enable AOT for faster startup,&quot; that statement is true whether you run HotSpot, Semeru, or an older JDK.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;differences-from-project-leyden&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#differences-from-project-leyden&quot;&gt;&lt;/a&gt;Differences from Project Leyden&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While the user experience is intentionally identical, there are a few technical differences worth noting:&lt;/p&gt;
&lt;/div&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 33.3334%;&quot;&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Project Leyden (HotSpot)&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Shared Classes Cache (OpenJ9)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Cache format&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Single &lt;code&gt;app.aot&lt;/code&gt; file&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;app-scc/&lt;/code&gt; directory&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;What is cached&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Loaded/linked classes, method profiles (future: JIT code)&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Class data, AOT-compiled native code, JIT profiling data and hints&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;AOT compilation&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Not yet included (planned for future JDK releases)&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Included: startup methods are AOT-compiled and stored in the cache&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Training&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Two-step: record configuration, then create cache in a separate JVM invocation&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Single step: cache is populated during the training run itself&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;JVM requirement&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Version &amp;gt;=25&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Any IBM Semeru version&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Maturity&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;New (JDK 25, actively evolving)&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Mature (production-hardened over many years in OpenJ9)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One notable difference is that the SCC already includes AOT-compiled native code for startup methods, whereas Leyden currently caches class loading and linking data plus method profiling information, with compiled code storage planned for future JDK versions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;some-numbers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#some-numbers&quot;&gt;&lt;/a&gt;いくつかの数値&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To give you a sense of what the SCC brings in practice, we measured startup time and memory usage for the Quarkus REST JSON quickstart application on IBM Semeru 25, with and without the Shared Classes Cache.&lt;/p&gt;
&lt;/div&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;col style=&quot;width: 12.5%;&quot;&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;col style=&quot;width: 12.5%;&quot;&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;起動時間&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;差分&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;RSS&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;差分&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Default (no SCC)&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;433 ms&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;参考&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;107 MB&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;参考&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;With Shared Classes Cache&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;206 ms&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;-52%&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;87 MB&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;-19%&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The SCC file is &lt;code&gt;25 MB&lt;/code&gt; in size — a reasonable cost for a 52% startup improvement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These numbers were measured on a developer laptop, not in an isolated lab environment.
Your results will vary depending on your application&amp;#8217;s size and complexity.
The more classes and methods your application loads during startup, the more the SCC helps.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;We were able to start a Quarkus REST application on IBM Semeru in just &lt;code&gt;206 ms&lt;/code&gt;&lt;/strong&gt; — and this is on the JVM, with full JIT compilation, full debugging support, and no native image involved.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;container-images-and-future-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#container-images-and-future-work&quot;&gt;&lt;/a&gt;Container images and future work&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;manual-deployment-today&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#manual-deployment-today&quot;&gt;&lt;/a&gt;Manual deployment today&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today, you can deploy a Quarkus application with a pre-built SCC by copying the &lt;code&gt;app-scc/&lt;/code&gt; directory into your container image:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-dockerfile hljs&quot; data-lang=&quot;dockerfile&quot;&gt;FROM icr.io/appcafe/ibm-semeru-runtimes:open-21-jre-ubi-minimal
COPY target/quarkus-app /deployments
WORKDIR /deployments
CMD [&quot;java&quot;, \
     &quot;-Xshareclasses:name=quarkus-app,cacheDir=app-scc,readonly&quot;, \
     &quot;-jar&quot;, &quot;quarkus-run.jar&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This works, but it has a limitation: the SCC must be generated on the same JVM version that will run in the container.
If your build JVM differs from the container&amp;#8217;s JVM, the cache will be ignored.
To ensure a match, generate the cache using the same Semeru image in your CI pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;automated-container-image-integration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#automated-container-image-integration&quot;&gt;&lt;/a&gt;Automated container image integration&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The container image integration we described in the &lt;a href=&quot;https://quarkus.io/blog/leyden-2/&quot;&gt;Leyden post&lt;/a&gt; — where Quarkus produces an AOT-optimized container image in a single command — is currently specific to the Leyden AOT path.
Extending it to support SCC-based container images is on our roadmap.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;cache-layering-for-docker&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cache-layering-for-docker&quot;&gt;&lt;/a&gt;Cache layering for Docker&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is where things get particularly interesting. OpenJ9&amp;#8217;s SCC supports &lt;a href=&quot;https://blog.openj9.org/2019/11/05/the-multi-layer-shared-class-cache-for-docker/&quot;&gt;multi-layer caches&lt;/a&gt;, a feature specifically designed for container environments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The problem with a single monolithic cache in a container image is Docker&amp;#8217;s copy-on-write mechanism.
If a base image contains a populated SCC and a higher layer writes to it (to add application-specific data), Docker duplicates the entire cache into the new layer.
This defeats the purpose of layer sharing and inflates the image size.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;OpenJ9 solves this with the &lt;code&gt;-Xshareclasses:createLayer&lt;/code&gt; option. Instead of a single cache, you build a stack of cache layers that align with your container image layers:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Layer 0 (JDK base image): cache populated with JDK and framework classes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Layer 1 (application image): a separate, smaller cache layer containing only the application-specific class data, AOT code, and JIT hints.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each cache layer is sized individually for its content, and the JVM reads from all layers at startup.
Because lower layers are never modified by higher ones, Docker&amp;#8217;s layer sharing works correctly — teams using the same base image share the JDK cache layer across all their application images.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is the part we are most excited about for future work. We plan to integrate this layered approach into Quarkus&amp;#8217;s container image extensions (&lt;code&gt;quarkus-container-image-docker&lt;/code&gt;, &lt;code&gt;quarkus-container-image-podman&lt;/code&gt;, and &lt;code&gt;quarkus-container-image-jib&lt;/code&gt;).
The goal is the same one-command experience we built for Leyden:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;./mvnw verify -Dquarkus.package.jar.aot.enabled=true -Dquarkus.container-image.build=true -DskipITs=false&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This would produce a container image with a properly layered SCC — the framework cache in a shared base layer, the application-specific cache in the top layer — optimized for both startup time and image size.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In microservices architectures where multiple Quarkus services share the same base image and dependency set, this layering could significantly reduce the total storage and transfer cost across all service images.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;acknowledgements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgements&quot;&gt;&lt;/a&gt;謝辞&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We would like to thank the OpenJDK team at IBM for their collaboration. The discussions around Leyden and Semeru&amp;#8217;s shared classes technology were instrumental in shaping this integration.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot;&gt;&lt;/a&gt;まとめ&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The beauty of this integration is its simplicity: one flag, multiple JVMs, optimal performance everywhere. Whether you&amp;#8217;re running HotSpot or Semeru, Quarkus has you covered, as Quarkus has always been about meeting developers where they are.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will continue tracking developments in both Project Leyden and OpenJ9 to bring you the best performance on whatever platform you choose.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/semeru-scc/
            </guid>
            
            
            
            <author>Georgios Andrianakis (https://twitter.com/geoand86)</author>
            
        </item>
        
        <item>
            <title>Emergency releases to fix  CVE-2026-39852 in all supported streams</title>
            <link>
                https://quarkus.io/blog/CVE-2026-39852/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today, we published releases to fix a severe security vulnerability: &lt;a href=&quot;https://github.com/quarkusio/quarkus/security/advisories/GHSA-rc95-pcm8-65v9&quot;&gt;CVE-2026-39852&lt;/a&gt; in all supported streams. The patched versions are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;3.20.6.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.27.3.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.33.1.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.34.7&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.35.2&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please make sure you update to one of these releases immediately.
To update, we recommend updating to the latest version of the Quarkus CLI and run:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/CVE-2026-39852/
            </guid>
            
            
            
            <author>Jan Martiška (https://twitter.com/janmartiska)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.35 - JAR tree-shaking, PGO for native, Semeru AOT, @Transactional for Hibernate Reactive, and more</title>
            <link>
                https://quarkus.io/blog/quarkus-3-35-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We&amp;#8217;re pleased to announce the release of Quarkus 3.35.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This release brings several notable features:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/53295&quot;&gt;#53295&lt;/a&gt; - JAR tree-shaking to eliminate unused classes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/53278&quot;&gt;#53278&lt;/a&gt; - Profile-Guided Optimization (PGO) support for native builds&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/53339&quot;&gt;#53339&lt;/a&gt; - Semeru AOT support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51063&quot;&gt;#51063&lt;/a&gt; - Support &lt;code&gt;@Transactional&lt;/code&gt; for Hibernate Reactive&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/53432&quot;&gt;#53432&lt;/a&gt; - CORS support for the management interface&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/52919&quot;&gt;#52919&lt;/a&gt; - Remove the use of System Properties to propagate configuration in tests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New snapshot distribution infrastructure&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To update to Quarkus 3.35, we recommend updating to the latest version of the Quarkus CLI and run:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note that &lt;code&gt;quarkus update&lt;/code&gt; can update your applications from any version of Quarkus (including 2.x) to Quarkus 3.35.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information about the adjustments you need to make to your applications, please refer to the &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.35&quot;&gt;Quarkus 3.35 migration guide&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;whats-new&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-new&quot;&gt;&lt;/a&gt;変更点&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jar-tree-shaking&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jar-tree-shaking&quot;&gt;&lt;/a&gt;JAR tree-shaking&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A new experimental &lt;code&gt;quarkus.package.jar.tree-shake.mode&lt;/code&gt; option enables build-time dependency tree-shaking.
When set to &lt;code&gt;classes&lt;/code&gt;, Quarkus performs bytecode reachability analysis to identify and exclude unused classes from runtime dependencies, reducing application JAR size.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The analysis traces references through supertypes, annotations, &lt;code&gt;ServiceLoader&lt;/code&gt; entries, reflective class loading, and more.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As an example, running tree-shaking on the Quarkus CLI removes over 6,000 unreachable classes, saving around 18 MB (39.5%).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This feature supports &lt;code&gt;fast-jar&lt;/code&gt;, &lt;code&gt;uber-jar&lt;/code&gt;, &lt;code&gt;legacy-jar&lt;/code&gt;, and &lt;code&gt;aot-jar&lt;/code&gt; packaging types.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As mentioned, this new feature is experimental, and feedback is highly welcome!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;profile-guided-optimization-for-native-builds&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#profile-guided-optimization-for-native-builds&quot;&gt;&lt;/a&gt;Profile-guided optimization for native builds&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can now opt in to Profile-Guided Optimization (PGO) for native builds by setting &lt;code&gt;quarkus.native.pgo.enabled=true&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note that PGO is a feature of Oracle GraalVM and is not available in GraalVM Community Edition.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When enabled, Quarkus uses your integration tests as the workload to profile the application.
The resulting PGO data is then fed into the native compilation for better runtime performance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The implementation follows a similar pattern to the Project Leyden AOT support introduced in Quarkus 3.32.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;semeru-aot-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#semeru-aot-support&quot;&gt;&lt;/a&gt;Semeru AOT support&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Building on the Project Leyden AOT integration from Quarkus 3.32, Quarkus now also supports IBM Semeru&amp;#8217;s AOT features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In initial testing on the &lt;code&gt;rest-json&lt;/code&gt; quickstart with IBM Semeru Runtime Open Edition 25, startup time was cut roughly in half (from ~380 ms down to ~190 ms).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For now, this is limited to building JARs with Semeru AOT, automatic container image building (as available with Leyden) is not yet supported.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;transactional-for-hibernate-reactive&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#transactional-for-hibernate-reactive&quot;&gt;&lt;/a&gt;&lt;code&gt;@Transactional&lt;/code&gt; for Hibernate Reactive&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus now supports the &lt;code&gt;@Transactional&lt;/code&gt; annotation for Hibernate Reactive, thanks to a new &lt;code&gt;quarkus-reactive-transactions&lt;/code&gt; extension.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This means you can use the familiar &lt;code&gt;@Transactional&lt;/code&gt; annotation on methods that return &lt;code&gt;Uni&lt;/code&gt;, and the transaction lifecycle (begin, commit, rollback) will be managed within the reactive pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few things to keep in mind:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Only &lt;code&gt;TxType.REQUIRED&lt;/code&gt; is currently supported.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mixing &lt;code&gt;@Transactional&lt;/code&gt; with &lt;code&gt;@WithTransaction&lt;/code&gt; or &lt;code&gt;@WithSessionOnDemand&lt;/code&gt; is not allowed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Methods annotated with &lt;code&gt;@Transactional&lt;/code&gt; are no longer automatically considered &lt;code&gt;@Blocking&lt;/code&gt;. If your method is blocking but returns &lt;code&gt;Uni&lt;/code&gt;, you now need an explicit &lt;code&gt;@Blocking&lt;/code&gt; annotation. See the &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.35&quot;&gt;migration guide&lt;/a&gt; for details.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;cors-support-for-the-management-interface&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cors-support-for-the-management-interface&quot;&gt;&lt;/a&gt;CORS support for the management interface&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The management interface now has its own dedicated CORS configuration, allowing you to set CORS policies independently from the main HTTP interface.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;testing-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#testing-improvements&quot;&gt;&lt;/a&gt;Testing improvements&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The test infrastructure no longer uses System Properties to propagate configuration from Dev Services, Test Resources, and Test Profiles.
This change opens the door for better parallel test execution (which we hope to achieve at some point in the future) and makes the Config system truly immutable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tests using &lt;code&gt;QuarkusDevModeTest&lt;/code&gt;, &lt;code&gt;QuarkusIntegrationTest&lt;/code&gt;, or &lt;code&gt;QuarkusMainIntegrationTest&lt;/code&gt; can now declare a &lt;code&gt;Config&lt;/code&gt; field or method parameter to access the updated configuration.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;new-snapshot-distribution&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-snapshot-distribution&quot;&gt;&lt;/a&gt;New snapshot distribution&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus snapshots are no longer published to Sonatype, which had reliability issues with the volume of artifacts involved.
Snapshots are now published daily as GitHub Releases in the &lt;a href=&quot;https://github.com/quarkusio/quarkus-ecosystem-ci/releases&quot;&gt;quarkusio/quarkus-ecosystem-ci&lt;/a&gt; repository, with version &lt;code&gt;999-SNAPSHOT&lt;/code&gt;.
Each release contains a &lt;code&gt;maven-repo.tar.gz&lt;/code&gt; asset with pre-built Maven artifacts that you can extract into your local Maven repository.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For CI setups, a dedicated &lt;a href=&quot;https://github.com/quarkusio/install-quarkus-snapshots-action/&quot;&gt;GitHub Action&lt;/a&gt; is also available.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More details can be found in the &lt;a href=&quot;https://github.com/quarkusio/quarkus/blob/main/CONTRIBUTING.md#using-snapshots&quot;&gt;Using snapshots&lt;/a&gt; section of the contributing guide.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jackson-reflection-free-serializers-for-quarkus-rest&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jackson-reflection-free-serializers-for-quarkus-rest&quot;&gt;&lt;/a&gt;Jackson reflection-free serializers for Quarkus REST&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We initially planned to make Jackson reflection-free serializers the default for Quarkus REST in 3.35.
However, thanks to several community members who tested this feature and reported issues, we identified a number of edge cases that still need to be addressed.
We decided to postpone making it the default to 3.36, so that we can fix these issues first.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are very grateful to everyone who took the time to report problems, your feedback is what makes Quarkus better.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the meantime, we very much welcome more testing from our community.
You can enable reflection-free serializers by adding the following property to your configuration:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-properties hljs&quot; data-lang=&quot;properties&quot;&gt;quarkus.rest.jackson.optimization.enable-reflection-free-serializers=true&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please report any issues you encounter on &lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;platform-updates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#platform-updates&quot;&gt;&lt;/a&gt;プラットフォームの更新&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;様々なプラットフォームコンポーネントがアップグレードされました。以下が含まれます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Camel Quarkus to 3.35.0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quarkus CXF to 3.35.1 - see release notes for &lt;a href=&quot;https://docs.quarkiverse.io/quarkus-cxf/dev/release-notes/3.35.0.html&quot;&gt;3.35.0&lt;/a&gt; and &lt;a href=&quot;https://docs.quarkiverse.io/quarkus-cxf/dev/release-notes/3.35.1.html&quot;&gt;3.35.1&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quarkus Amazon Services to 3.18.0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quarkus MCP Server to 1.12.0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quarkus Flow to 0.9.0&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更ログ&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can get the full changelog of &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.35.0.CR1&quot;&gt;3.35.0.CR1&lt;/a&gt;, &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.35.0&quot;&gt;3.35.0&lt;/a&gt;, and &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.35.1&quot;&gt;3.35.1&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot;&gt;&lt;/a&gt;コントリビューター&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Quarkus community is growing and has now &lt;a href=&quot;https://github.com/quarkusio/quarkus/graphs/contributors&quot;&gt;1188 contributors&lt;/a&gt;.
Many many thanks to each and everyone of them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In particular for the 3.35 release, thanks to Ales Justin, Alexey Loubyansky, andreatp, Andy Damevin, anuragg-saxenaa, Arseni Buinitski, Aurea Munoz, Aurélien Pupier, Bruno Baptista, brunobat, Carles Arnal, Cesar M. Romero-Pedraza, Chris Laprun, Chris Ruffalo, Clement Escoffier, Cristiano Nicolai, DerFrZocker, Dmitri Bourlatchkov, Faisal Dilawar, Foivos Zakkak, George Gastaldi, Georgios Andrianakis, Guillaume Smet, Holly Cummins, Inaki Villar, Jakub Jedlicka, Jamal Dabari, Jan Martiska, Jens Teglhus Møller, Julien Ponge, Karm Michal Babacek, Katia Aresti, keshavprashatdeshpande, Ladislav Thon, lberrymage, Luca Molteni, marco sappe griot, mariofusco, marko-bekhta, Martin Kouba, Matej Novotny, Matej Vašek, Max Rydahl Andersen, Maximilian Zellhofer, Melloware, Michael Edgar, Michal Maléř, Michal Vavřík, Mihajlo Veljković, Nick Robison, Nico Hinrichs, Ozan Gunalp, Paramvir Jindal, Phillip Kruger, Phillip Krüger, PreetiYadav, Robert Toyonaga, Roberto Cortez, Rolfe Dlugy-Hegwer, Rostislav Svoboda, Sergey Beryozkin, Simon Scatton, Simon Scholz, Stéphane Épardaud, Teymur Babayev, Thomas Segismont, tiwari91, Tiziano Basile, tom, xstefank, Yoann Rodière, and Yoshikazu Nojima.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-35-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>A2A Java SDK 1.0.0.Beta1 Released</title>
            <link>
                https://quarkus.io/blog/a2a-java-sdk-1-0-0-beta1-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are pleased to announce the release of A2A Java SDK 1.0.0.Beta1, our first release fully aligned with the &lt;a href=&quot;https://a2a-protocol.org/v1.0.0/specification/&quot;&gt;final A2A Specification 1.0.0&lt;/a&gt;. The A2A Protocol has reached stability as an open standard, and this release marks the Java SDK tracking that maturity: protocol conformance is the central focus, and the SDK coordinates now reflect the project&amp;#8217;s identity under the &lt;a href=&quot;https://github.com/a2aproject&quot;&gt;A2A Project organization&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a sign of this maturity, two structural breaking changes accompany this release:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Java packages have been renamed from &lt;code&gt;io.a2a.&lt;strong&gt;&lt;/code&gt; to &lt;code&gt;org.a2aproject.sdk.&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Maven &lt;code&gt;groupId&lt;/code&gt; has changed from &lt;code&gt;io.github.a2asdk&lt;/code&gt; to &lt;code&gt;org.a2aproject.sdk&lt;/code&gt; (first introduced in 1.0.0.Alpha4)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;whats-a2a&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-a2a&quot;&gt;&lt;/a&gt;A2A とは？&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Agent2Agent (A2A) プロトコルは、基盤となるフレームワーク、言語、ベンダーに関係なく、AI エージェント同士が通信し、連携できるようにするためのオープンスタンダードです。A2A Java SDK を使用すると、Quarkus ベースのリファレンス実装を使用して、A2A 準拠のエージェントを Java で簡単に構築できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;breaking-changes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#breaking-changes&quot;&gt;&lt;/a&gt;破壊的変更&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;new-maven-coordinates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-maven-coordinates&quot;&gt;&lt;/a&gt;New Maven Coordinates&lt;/h3&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Maven &lt;code&gt;groupId&lt;/code&gt; has changed from &lt;code&gt;io.github.a2asdk&lt;/code&gt; to &lt;code&gt;org.a2aproject.sdk&lt;/code&gt;. If you are upgrading from any previous release, you must update your build files accordingly.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The root artifact coordinates were renamed to reflect the project&amp;#8217;s new home under the &lt;a href=&quot;https://github.com/a2aproject&quot;&gt;A2A Project organization&lt;/a&gt; and its availability on Maven Central.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Update your &lt;code&gt;pom.xml&lt;/code&gt; dependencies accordingly:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-xml hljs&quot; data-lang=&quot;xml&quot;&gt;&amp;lt;dependencyManagement&amp;gt;
    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.a2aproject.sdk&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;a2a-java-sdk-bom&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;1.0.0.Beta1&amp;lt;/version&amp;gt;
            &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;
            &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;
&amp;lt;/dependencyManagement&amp;gt;

&amp;lt;!-- Client --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.a2aproject.sdk&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;a2a-java-sdk-client&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;

&amp;lt;!-- For JSON-RPC transport --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.a2aproject.sdk&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;a2a-java-sdk-reference-jsonrpc&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;

&amp;lt;!-- For gRPC transport --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.a2aproject.sdk&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;a2a-java-sdk-reference-grpc&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;

&amp;lt;!-- For HTTP+JSON/REST transport --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.a2aproject.sdk&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;a2a-java-sdk-reference-rest&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;new-java-package-names&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-java-package-names&quot;&gt;&lt;/a&gt;New Java Package Names&lt;/h3&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All Java packages have been renamed from &lt;code&gt;io.a2a.&lt;strong&gt;&lt;/code&gt; to &lt;code&gt;org.a2aproject.sdk.&lt;/strong&gt;&lt;/code&gt;. You must update all import statements in your source code when upgrading from any previous release.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;例えば、以下のようになります:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;// Before
import io.a2a.client.A2AClient;
import io.a2a.model.Task;

// After
import org.a2aproject.sdk.client.A2AClient;
import org.a2aproject.sdk.model.Task;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Most IDEs can automate this migration via a project-wide find-and-replace of &lt;code&gt;io.a2a&lt;/code&gt; → &lt;code&gt;org.a2aproject.sdk&lt;/code&gt; in import statements, or by using the &quot;Optimize Imports&quot; / &quot;Migrate&quot; refactoring tools.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;key-highlights-in-1-0-0-beta1&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-highlights-in-1-0-0-beta1&quot;&gt;&lt;/a&gt;Key Highlights in 1.0.0.Beta1&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;equal-transport-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#equal-transport-support&quot;&gt;&lt;/a&gt;Equal Transport Support&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All three transports — JSON-RPC, gRPC, and HTTP+JSON/REST — are now fully supported and considered equal. Simply add the dependency for the transport you need (&lt;code&gt;a2a-java-sdk-reference-jsonrpc&lt;/code&gt;, &lt;code&gt;a2a-java-sdk-reference-grpc&lt;/code&gt;, or &lt;code&gt;a2a-java-sdk-reference-rest&lt;/code&gt;) and the SDK will work seamlessly regardless of your choice.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;structured-error-codes-and-details&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#structured-error-codes-and-details&quot;&gt;&lt;/a&gt;Structured Error Codes and Details&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A2A error types now carry structured error codes and details, making error handling more precise and easier to integrate with observability tooling. Error responses also now use the correct &lt;code&gt;data&lt;/code&gt; field name (previously &lt;code&gt;details&lt;/code&gt;) in JSON/HTTP responses, in alignment with the specification.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;http-caching-headers-for-agent-card&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#http-caching-headers-for-agent-card&quot;&gt;&lt;/a&gt;HTTP Caching Headers for Agent Card&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Agent Card endpoint now returns proper HTTP caching headers, allowing clients and proxies to cache agent metadata efficiently and reduce unnecessary round trips.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;datapart-fromjson-factory-method&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#datapart-fromjson-factory-method&quot;&gt;&lt;/a&gt;&lt;code&gt;DataPart.fromJson()&lt;/code&gt; Factory Method&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A new &lt;code&gt;DataPart.fromJson()&lt;/code&gt; factory method makes it straightforward to construct a &lt;code&gt;DataPart&lt;/code&gt; from a raw JSON string, without requiring prior deserialization.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;flexible-http-client-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#flexible-http-client-support&quot;&gt;&lt;/a&gt;Flexible HTTP Client Support&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The SDK defaults to a &lt;code&gt;JdkA2AHttpClient&lt;/code&gt; backed by the standard JDK &lt;code&gt;HttpClient&lt;/code&gt;, suitable for any Java environment. The &lt;code&gt;HttpClient&lt;/code&gt; builder also supports constructing a &lt;code&gt;JdkA2AHttpClient&lt;/code&gt; from a prebuilt &lt;code&gt;HttpClient&lt;/code&gt; instance, enabling advanced configuration scenarios such as custom SSL contexts or connection pool tuning.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When running on Quarkus, you can instead use the &lt;code&gt;VertxA2AHttpClient&lt;/code&gt;, which is backed by the Vert.x HTTP client for better integration with Quarkus&amp;#8217;s reactive engine, connection management, and observability features.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;bug-fixes-and-stability&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bug-fixes-and-stability&quot;&gt;&lt;/a&gt;Bug Fixes and Stability&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Terminal-state tasks now correctly reject further operations with &lt;code&gt;UnsupportedOperationError&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Race conditions in &lt;code&gt;EventConsumer&lt;/code&gt; and the SSE transport have been resolved&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;PushNotificationNotSupportedError&lt;/code&gt; now returns HTTP 501 as required by the specification&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;POST requests without a &lt;code&gt;Content-Type&lt;/code&gt; header are now accepted when the body is empty&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tenant and &lt;code&gt;protocolVersion&lt;/code&gt; are now correctly preserved in the &lt;code&gt;ClientBuilder&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;whats-next-road-to-1-0-0-ga&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next-road-to-1-0-0-ga&quot;&gt;&lt;/a&gt;What&amp;#8217;s Next: Road to 1.0.0.GA&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before the 1.0.0.GA release, we plan to introduce the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cross-version protocol support&lt;/strong&gt;: the SDK will be able to handle both version 1.0.0 and 0.3.0 of the A2A Protocol simultaneously, making it easier to interoperate with agents built against earlier versions of the specification.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Specification micro-update tracking&lt;/strong&gt;: as the A2A Specification evolves with patch-level updates, the SDK will follow those changes promptly to remain fully conformant.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot;&gt;&lt;/a&gt;コントリビューター&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This release was made possible by the work of seven contributors. A special thank you to our four first-time contributors:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/brucearctor&quot;&gt;@brucearctor&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/maff&quot;&gt;@maff&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Lirons01&quot;&gt;@Lirons01&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/yyy9942&quot;&gt;@yyy9942&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And to the returning contributors:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jmesnil&quot;&gt;@jmesnil&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kabir&quot;&gt;@kabir&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ehsavoie&quot;&gt;@ehsavoie&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you all for your code, reviews, and feedback!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources&quot;&gt;&lt;/a&gt;リソース&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/a2aproject/a2a-java/releases/tag/1.0.0.Beta1&quot;&gt;Release Notes on GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://central.sonatype.com/artifact/org.a2aproject.sdk/a2a-java-sdk-parent/1.0.0.Beta1&quot;&gt;Maven Central&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://javadoc.io/doc/org.a2aproject.sdk/&quot;&gt;JavaDoc&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://a2a-protocol.org/v1.0.0/specification/&quot;&gt;A2A Specification&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are an A2A Java SDK user or just curious, don&amp;#8217;t be shy and join our welcoming community:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;provide feedback on &lt;a href=&quot;https://github.com/a2aproject/a2a-java/issues&quot;&gt;GitHub&lt;/a&gt;;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;craft some code and &lt;a href=&quot;https://github.com/a2aproject/a2a-java/pulls&quot;&gt;push a PR&lt;/a&gt;;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;discuss with us on &lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; and on &lt;a href=&quot;https://discord.com/channels/1362108044737253548/1384238827090219138&quot;&gt;Discord&lt;/a&gt;;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Mon, 27 Apr 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/a2a-java-sdk-1-0-0-beta1-released/
            </guid>
            
            
            
            <author>Emmanuel Hugonnet (https://twitter.com/ehsavoie)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.34.6 - Maintenance release</title>
            <link>
                https://quarkus.io/blog/quarkus-3-34-6-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today, we released Quarkus 3.34.6, the last maintenance release for our 3.34 stream.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.34 に更新するには、最新バージョンの Quarkus CLI に更新し、次を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なお、&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.34 にアプリケーションを更新できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整の詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.34&quot;&gt;Quarkus 3.34 移行ガイド&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can get the full changelog of &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.34.6&quot;&gt;3.34.6&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-34-6-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Quarkus Newsletter #67 - April</title>
            <link>
                https://quarkus.io/blog/quarkus-newsletter-67/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Read &quot;Build a Streaming AI Chat in Java with Quarkus, Vaadin, and LangChain4j&quot;, a hands-on guest post by Sebastian Kühnau showing how to stream LLM responses token by token in a pure Java UI with Vaadin Flow and Quarkus. Check out Mario Fusco&amp;#8217;s post to learn our reasoning behind enabling by default in the Quarkus 3.35 release. Scivics Lab wrote a post &quot;quarkus-chat-ui: A Web Front-End for LLMs, and a Real-World Case for POJO-actor&quot; that introduces a new Chat UI component built with Vaadin and designed to integrate seamlessly into a Quarkus application, simplifying the creation of conversational interfaces. They then follow with another &quot;quarkus-chat-ui (2): The Actor Design Behind LLM-to-LLM Conversation&quot; so you can see how to actually use POJO-actor in quarkus-chat-ui, a Quarkus-based LLM chat UI that connects to Claude Code CLI, vLLM, and other backends. Learn how to integrate Redis caching and data storage in a Quarkus Java application using the Quarkus Redis extension with reactive by reading &quot;How to Use Redis with Quarkus in Java&quot; by Nawaz Dhandala. Markus Eisele wrote &quot;AI Coding Tools in 2026: How to Work With Agents Without Losing Control&quot; a Java engineer’s operating model: Ask/Plan/Code flows, guardrails, and review discipline at scale.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;最新のQuarkus Insightsエピソード、トップツイート/ディスカッション、今後開催されるQuarkus参加イベントもご覧いただけます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://quarkus.io/newsletter/67/&quot;&gt;Newsletter #67: April&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ニュースレターを受信してみませんか？ページ上のフォームを使って &lt;a href=&quot;https://quarkus.io/newsletter&quot;&gt;ニュースレターに登録&lt;/a&gt; してください。&lt;/p&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 22 Apr 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-newsletter-67/
            </guid>
            
            
            
            <author>James Cobb (https://twitter.com/insectengine)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.34.5 - Maintenance release</title>
            <link>
                https://quarkus.io/blog/quarkus-3-34-5-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today, we released Quarkus 3.34.5, the third maintenance release for our 3.34 stream (we skipped 3.34.4, due to a regression detected late in the Platform, caused by a Kafka Clients update).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.34 に更新するには、最新バージョンの Quarkus CLI に更新し、次を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なお、&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.34 にアプリケーションを更新できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整の詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.34&quot;&gt;Quarkus 3.34 移行ガイド&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更ログ&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can get the full changelog of &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.34.4&quot;&gt;3.34.4&lt;/a&gt; and &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.34.5&quot;&gt;3.34.5&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-34-5-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>リフレクションなしの Jackson シリアライザーをデフォルトで有効にする</title>
            <link>
                https://quarkus.io/blog/reflection-free-jsckson-serializers/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;以前から、Jackson が提供し、Quarkus アプリケーションで広く使用されている JSON のシリアル化とデシリアル化の効率を改善する方法を試してきました。パフォーマンスの観点から見ると、Jackson の主なボトルネックは、実行時にデータオブジェクトにアクセスしたり、データを入力したりするために Java のリフレクションに大きく依存していることです。この問題に対処するため、Jackson 向けにリフレクションなしのシリアライザーとデシリアライザーを生成するビルド時メタプログラミング アプローチを開発しました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkus.io/blog/quarkus-metaprogramming/&quot;&gt;この記事&lt;/a&gt; で、Quarkus でこの機能をどのように実装したか、そしてそれによってもたらされるパフォーマンスの改善について説明しました。それ以来、私たちはこの機能を強化し、バグを修正し、さまざまな Jackson 機能との互換性を改善するために継続的に取り組んできました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;configuring-reflection-free-jackson-serialization&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuring-reflection-free-jackson-serialization&quot;&gt;&lt;/a&gt;リフレクションなしの Jackson シリアル化の設定&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;この機能は実験的な性質であったため、当初はオプトイン方式にしていました。Quarkus アプリケーションでリフレクションなしの Jackson シリアライザーとデシリアライザーを有効にするには、&lt;code&gt;application.properties&lt;/code&gt; ファイルに次の設定を追加する必要がありました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-properties hljs&quot; data-lang=&quot;properties&quot;&gt;quarkus.rest.jackson.optimization.enable-reflection-free-serializers=true&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ここ数カ月、この機能を試すユーザーが増え、提供されるパフォーマンス上の利点を活用するだけでなく、バグ、エッジケース、さまざまな Jackson 機能との互換性の問題を発見するのに役立ってくれました。これらは一つずつ対処してきました。全体として、コミュニティーから肯定的なフィードバックをいただいているため、次の明白なステップを踏むことを決定しました。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;enabling-by-default-in-the-quarkus-3-35-release&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#enabling-by-default-in-the-quarkus-3-35-release&quot;&gt;&lt;/a&gt;Quarkus 3.35 リリースでデフォルトで有効化&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;現時点では、Quarkus のテストスイート全体がこの機能を有効にした状態でパスしており、これまでユーザーから報告されたすべての互換性の問題に対処しました。したがって、次の Quarkus 3.35 リリースでは、この機能をデフォルトで有効にすることに決定しました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;可能な限り幅広いユースケースをカバーするために、この機能を有効にした状態でアプリケーションをテストし、できればパフォーマンスへの影響も測定していただくようお願いします。問題に遭遇した場合やフィードバックがある場合は、GitHub リポジトリーに報告するか、Quarkus コミュニティー チャネルでお知らせください。これは、この機能の安定性についてより確信を持ち、すべてのユーザーにスムーズな移行を保証するのに役立ちます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/reflection-free-jsckson-serializers/
            </guid>
            
            
            
            <author>Mario Fusco (https://twitter.com/mariofusco)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.34.3 - メンテナンスリリース</title>
            <link>
                https://quarkus.io/blog/quarkus-3-34-3-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;本日、3.34ストリーム向けの2番目のメンテナンスリリースである Quarkus 3.34.3 をリリースしました (3.34.0はスキップしました)。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.34 にアップデートするには、Quarkus CLI の最新バージョンに更新してから、以下を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なお、&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.34 へアプリケーションを更新できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整の詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.34&quot;&gt;Quarkus 3.34 移行ガイド&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更ログ&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.34.3&quot;&gt;3.34.3&lt;/a&gt; の完全なチェンジログは GitHub で確認できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-34-3-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.34.2 - メンテナンスリリース</title>
            <link>
                https://quarkus.io/blog/quarkus-3-34-2-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;本日、Quarkus 3.34.2 をリリースしました。これは、3.34 ストリーム初のメンテナンスリリースです (3.34.0 はスキップされました)。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.34 にアップデートするには、Quarkus CLI の最新バージョンに更新してから、以下を実行することをお勧めします:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なお、&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.34 へアプリケーションを更新できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整の詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.34&quot;&gt;Quarkus 3.34 移行ガイド&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;完全な変更履歴は、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.34.2&quot;&gt;3.34.2&lt;/a&gt; の GitHub で確認できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-34-2-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.34 - 全体的な機能強化</title>
            <link>
                https://quarkus.io/blog/quarkus-3-34-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;本日、 &lt;a href=&quot;https://quarkus.io/blog/quarkus-3-33-released/&quot;&gt;Quarkus 3.33 LTS&lt;/a&gt; と Quarkus 3.34 の両方をリリースしました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.33 は、Quarkus 3.32 から分岐し、12 か月間メンテナンスされる Long Term Support (LTS) リリースですが、
Quarkus 3.34 には、全体的に多くの機能強化が施されています。
Dev UI、Panache Next、その他多くの領域が改善されました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このリリースには、将来のバージョンで実を結ぶ内部的な変更とリファクタリングも含まれています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.34 に更新するには、最新バージョンの Quarkus CLI に更新し、次を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なお、&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.34 にアプリケーションを更新できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整の詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.34&quot;&gt;Quarkus 3.34 移行ガイド&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.34.0.CR1&quot;&gt;3.34.0.CR1&lt;/a&gt; 、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.34.0&quot;&gt;3.34.0&lt;/a&gt; 、および &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.34.1&quot;&gt;3.34.1&lt;/a&gt; の完全な変更履歴を GitHub で確認できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot;&gt;&lt;/a&gt;コントリビューター&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus コミュニティーは成長しており、現在 &lt;a href=&quot;https://github.com/quarkusio/quarkus/graphs/contributors&quot;&gt;1173 人の貢献者&lt;/a&gt; がいます。
貢献者全員に心から感謝いたします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;特に 3.34 リリースに関しては、Ales Justin、Alexey Loubyansky、Andy Damevin、Asger Askov Blekinge、Ashish Thakur、Aurea Munoz、Aurélien Pupier、Bruno Baptista、Carles Arnal、Char、Chris Ruffalo、Clement Escoffier、Clément de Tastes、Daniel Vergien、David M. Lloyd、Dennis Kniep、Dmitri Bourlatchkov、Erwin Oegema、Faisal Dilawar、Foivos Zakkak、Frank Eichfelder、g、Gaelle Fournier、Galder Zamarreño、George Gastaldi、Georgios Andrianakis、Guillaume Smet、Holly Cummins、Inaki Villar、Jakub Jedlicka、Jan Martiska、jcarranzan、JeffersonSantos29、Jens Teglhus Møller、Julien Ponge、Katia Aresti、Kristian Rickert、Ladislav Thon、Luca Molteni、Martin Kouba、Martin Panzer、María Arias de Reyna Domínguez、Matej Novotny、Matheus Andre、Matheus André、Michael Edgar、Michal Maléř、Michal Vavřík、Nico Hinrichs、Ozan Gunalp、Patrick Schaub、Peter Levart、Phillip Krüger、Roberto Cortez、Sanne Grinovero、Sergey Beryozkin、shjones、Stéphane Épardaud、Thomas McWork、tiwari91、Tom Jenkinson、Tom Schindl、Vincent Sevel、xstefank、Yoann Rodière の各氏に感謝いたします。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-34-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.33 LTS - 新しいLTSバージョン</title>
            <link>
                https://quarkus.io/blog/quarkus-3-33-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このたび、Quarkusの新しいLTS (Long Term Support) バージョンであるQuarkus 3.33のリリースを発表できることを大変嬉しく思います。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このバージョンはQuarkus 3.32をベースに構築されています。本日リリースされた &lt;a href=&quot;https://quarkus.io/blog/quarkus-3-34-released/&quot;&gt;Quarkus 3.34&lt;/a&gt; には新しい機能が導入されています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;LTSポリシーについて詳しく知りたい場合は、 &lt;a href=&quot;https://quarkus.io/blog/lts-releases/&quot;&gt;LTSに関する発表&lt;/a&gt; を必ずお読みください。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;LTSリリースは12ヶ月間サポートされます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;前回のLTSであるQuarkus 3.27 LTSから移行される場合、多くのエキサイティングな新機能がありますので、以下の発表をお読みになることをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkus.io/blog/quarkus-3-28-released/&quot;&gt;Quarkus 3.28 - セキュリティ機能の強化、カスタムGrafanaダッシュボード、Liquibase MongoDBでの複数クライアントのサポートなど&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkus.io/blog/quarkus-3-29-released/&quot;&gt;Quarkus 3.29 - 複数のキャッシュバックエンドとQute DAPデバッガーのサポート&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkus.io/blog/quarkus-3-30-released/&quot;&gt;Quarkus 3.30 - RESTクライアント上のJsonView、Hibernate Validator 9.1、CLI復号コマンドなど&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkus.io/blog/quarkus-3-31-released/&quot;&gt;Quarkus 3.31 - Java 25の完全サポート、Quarkus Mavenパッケージング、Panache Nextなど！&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkus.io/blog/quarkus-3-32-released/&quot;&gt;Quarkus 3.32 - Project Leyden統合、より優雅なシャットダウン、自動Consul登録など！&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.33 LTSにアップデートするには、Quarkus CLIを最新バージョンに更新して、以下を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;quarkus update&lt;/code&gt; コマンドは、Quarkusの任意のバージョン（2.xを含む）からQuarkus 3.33 LTSにアプリケーションを更新できることに注意してください。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;3.32からアップグレードする場合、3.33 LTSは3.32の直接的な継続であるため、何もする必要はありません。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;以前のLTSであるQuarkus 3.27 LTSからアップグレードする場合は、以下の移行ガイドを参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.28&quot;&gt;3.28の移行ガイド&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.29&quot;&gt;3.29の移行ガイド&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.30&quot;&gt;3.30の移行ガイド&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.31&quot;&gt;3.31の移行ガイド&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.32&quot;&gt;3.32の移行ガイド&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.33&quot;&gt;3.33の移行ガイド&lt;/a&gt; - 3.33は3.32の継続であるため、このガイドは空です&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;quarkus update&lt;/code&gt; コマンドはほとんどの面倒な作業を処理するはずですが、手動で処理する必要があるケースもまだありますので、これらの移行ガイドを注意深く読むことをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;whats-new&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-new&quot;&gt;&lt;/a&gt;変更点&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;platform-component-upgrades&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#platform-component-upgrades&quot;&gt;&lt;/a&gt;プラットフォームコンポーネントのアップグレード&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;様々なプラットフォームコンポーネントがアップグレードされました。以下が含まれます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Quarkus CXF を 3.33.0 に - &lt;a href=&quot;https://docs.quarkiverse.io/quarkus-cxf/dev/release-notes/3.33.0.html&quot;&gt;リリースノート&lt;/a&gt; を参照&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Camel Quarkus を 3.33.0 に&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quarkus Operator SDK を 7.7.3 に&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quarkus Vault を 4.7.0 に&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quarkus Qpid JMS を 2.12.0 に&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.33 LTSのコア部分はQuarkus 3.32をベースとしており、3.33.1に含まれるいくつかの追加修正が適用されています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.33.1&quot;&gt;3.33.1&lt;/a&gt; の完全な変更履歴はGitHubで確認できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot;&gt;&lt;/a&gt;コントリビューター&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusコミュニティは成長を続けており、現在 &lt;a href=&quot;https://github.com/quarkusio/quarkus/graphs/contributors&quot;&gt;1173人のコントリビューター&lt;/a&gt; がいます。皆様に心から感謝いたします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;特に3.33リリースの貢献者として、Ales Justin、Alexey Loubyansky、Andy Damevin、Asger Askov Blekinge、Aurea Munoz、Aurélien Pupier、brunobat、Clement Escoffier、Clément de Tastes、David M. Lloyd、Dmitri Bourlatchkov、Erwin Oegema、Faisal Dilawar、Foivos Zakkak、Gaelle Fournier、George Gastaldi、Georgios Andrianakis、Guillaume Smet、Holly Cummins、Jakub Jedlicka、jcarranzan、Jens Teglhus Møller、Julien Ponge、Katia Aresti、Kristian Rickert、Ladislav Thon、Luca Molteni、Martin Kouba、Martin Panzer、María Arias de Reyna Domínguez、Matej Novotny、Michal Maléř、Michal Vavřík、Nico Hinrichs、Ozan Gunalp、Patrick Schaub、Phillip Kruger、Roberto Cortez、Sanne Grinovero、Sergey Beryozkin、shjones、Stéphane Épardaud、Thomas McWork、tiwari91、Tom Schindl、およびYoann Rodièreに感謝いたします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;3.33 LTSは3.32のバグ修正のみを含んでいるため、リストは通常より少し短くなっています。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-33-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.27.3 がリリースされました - LTS メンテナンスリリース</title>
            <link>
                https://quarkus.io/blog/quarkus-3-27-3-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;本日、Quarkus 3.27.3 をリリースしました。これは 3.27 LTS ストリームの次のメンテナンスリリースです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このリリースには、バグ修正、ドキュメントの更新、および以下の CVE に対する修正が含まれています:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-1002&quot;&gt;CVE-2026-1002&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2025-33042&quot;&gt;CVE-2025-33042&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;すでに 3.27 を使用している方にとって、安全なアップグレードとなるはずです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.27 に更新するには、Quarkus CLI の最新バージョンに更新してから、以下を実行することをお勧めします:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update --stream=3.27&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なお、&lt;code&gt;quarkus update&lt;/code&gt; を使用すると、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.27 にアプリケーションを更新できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;以下から &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.27.3&quot;&gt;GitHub で 3.27.3 の完全な変更履歴&lt;/a&gt; を取得できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-27-3-released/
            </guid>
            
            
            
            <author>Jan Martiška (https://twitter.com/janmartiska)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.20.6 リリース - LTS メンテナンスリリース</title>
            <link>
                https://quarkus.io/blog/quarkus-3-20-6-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;本日、Quarkus 3.20.6 をリリースしました。これは 3.20 LTS ストリームの次期メンテナンスリリースです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このリリースには、バグ修正、ドキュメントの更新、および以下の CVE の修正が含まれています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-1002&quot;&gt;CVE-2026-1002&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2025-33042&quot;&gt;CVE-2025-33042&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;既に 3.20 を使用しているユーザーにとっては、安全なアップグレードとなるはずです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.20 に更新するには、Quarkus CLI の最新バージョンに更新してから、以下を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update --stream=3.20&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus のあらゆるバージョン (2.x を含む) から Quarkus 3.20 へアプリケーションを更新できることに注意してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.20.6&quot;&gt;3.20.6 の完全な変更履歴は GitHub で&lt;/a&gt; 確認できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-20-6-released/
            </guid>
            
            
            
            <author>Jan Martiška (https://twitter.com/janmartiska)</author>
            
        </item>
        
        <item>
            <title>Apache Polaris は Quarkus を採用しています</title>
            <link>
                https://quarkus.io/blog/quarkus-polaris/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://polaris.apache.org/&quot;&gt;Apache Polaris&lt;/a&gt; は、 &lt;a href=&quot;https://iceberg.apache.org/&quot;&gt;Apache Iceberg&lt;/a&gt; 用のオープンソースカタログであり、インキュベーション期間を終え、重要な技術的決定として Quarkus をそのクラウドネイティブ基盤として採用することで、正式に Top-Level Project (TLP) へ昇格しました。Iceberg カタログと Supersonic Subatomic Java の融合は、クラウドネイティブな効率性と拡張性だけでなく、コミュニティとの協業も実現し、Polaris をマルチエンジンデータレイクハウスアーキテクチャ向けの主要なソリューションとして位置付けています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/polaris/polaris-quarkus.jpg&quot; alt=&quot;Quarkus + Polaris&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-journey-to-top-level-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-journey-to-top-level-project&quot;&gt;&lt;/a&gt;トップレベルプロジェクトへの道のり&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Apache Polaris は、Apache Incubator から卒業し、Apache Software Foundation (ASF) 内で新しいトップレベルプロジェクト (TLP) となるという、大きな節目を達成しました。この卒業は、プロジェクトの成熟度とコミュニティへの採用だけでなく、ガバナンスと運用における &lt;em&gt;Apache Way&lt;/em&gt; への統合が成功したことを示しています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;understanding-the-apache-incubator&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#understanding-the-apache-incubator&quot;&gt;&lt;/a&gt;Apache Incubator の理解&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://incubator.apache.org/&quot;&gt;Apache Incubator&lt;/a&gt; は、ASF への参加を目指す「ポッドリング」と呼ばれるプロジェクトのエントリーポイントです。経験豊富なメンターがポッドリングと財団のチーム間の連絡役を務め、実力主義に基づいた合意形成型のガバナンス採用を指導します。Polaris はこのメンター付きのインキュベーションプロセスを無事完了し、コミュニティの成熟度と運用準備の両方を示しました。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;technical-evolution-during-incubation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#technical-evolution-during-incubation&quot;&gt;&lt;/a&gt;インキュベーション期間中の技術的進化&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Polaris にとって、インキュベーション期間は単なるガバナンスの練習ではなく、重要な技術開発と戦略的転換を促しました。プロジェクトは、いくつかの重要な変更を実施することで、その適応性と堅牢なアーキテクチャへのコミットメントを示しました。その変更点には以下が含まれます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;新しい JDBC 永続化層：カタログメタデータストレージと設定管理の信頼性と柔軟性を向上させます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;高度なセキュリティ機能：ポリシーベースのカタログアクセスコントロールのための Open Policy Agent (OPA) の実装と、洗練されたオーソライザーフレームワークを通じて、新しいセキュリティ機能を統合します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;堅牢なポリシー管理：マルチテナントカタログデプロイメントの中核機能である、カタログアクセスポリシーと権限を定義および適用するための包括的なフレームワークを開発します。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;極めて重要なことに、チームは成功する TLP には将来性のある技術コアが必要であることを認識し、その最も重要なアーキテクチャ上の決定の 1 つである Quarkus の採用につながりました。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;quarkus-adoption&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#quarkus-adoption&quot;&gt;&lt;/a&gt;Quarkus の採用&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これらの技術的進歩の中で、インキュベーションフェーズで行われた最も重要かつ将来を見据えた決定の 1 つは、Apache Polaris を強化するための &lt;strong&gt;Quarkus の採用&lt;/strong&gt;でした。この戦略的な転換は、複数のクエリエンジンに対応する最新の Iceberg カタログには、従来の Java フレームワークが効率的に提供できる以上のものが必要であることを認識していました。チームは、クラウドネイティブデプロイメントの厳しい要件を満たしつつ、迅速なイノベーションに不可欠な開発者の生産性を維持できる技術スタックを必要としていました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus は、最新のクラウド環境向けに Java アプリケーションが構築される方法における根本的な変化を象徴しています。複数のクエリエンジンに対応するように設計された Iceberg カタログである Apache Polaris にとって、Quarkus はパフォーマンス、開発者の生産性、およびアーキテクチャの柔軟性の理想的な組み合わせを提供します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;container-first-architecture&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#container-first-architecture&quot;&gt;&lt;/a&gt;コンテナーファーストアーキテクチャ&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus は、コンテナーファーストの理念に基づいて最初から設計されました。コンテナー向けに後付けで修正された従来のフレームワークとは異なり、Quarkus は、クラスパスのスキャン、設定のロード、依存性注入などの重い計算処理を実行時からビルド時に移行させることで、コンテナー化された環境向けにアプリケーションを特別に最適化します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Polaris にとって、これは次のことを意味します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;より迅速な水平スケーリング&lt;/strong&gt;: トラフィックスパイクを処理するために追加のカタログインスタンスをデプロイする場合、コンテナーは秒単位ではなくミリ秒単位で起動します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;高密度化&lt;/strong&gt;: メモリフットプリントが小さいため、ノードあたりの Polaris インスタンス数が増え、インフラストラクチャコストが削減されます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;効率的なリソース使用&lt;/strong&gt;: 最小限の CPU とメモリ消費により、運用上のクラウドコストが直接削減され、リソース消費を抑えることで持続可能性のメリットが得られます。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;performance-characteristics&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#performance-characteristics&quot;&gt;&lt;/a&gt;パフォーマンス特性&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus は、次の 4 つの主要な側面を通じてパフォーマンスを提供します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;高速起動時間:&lt;/strong&gt; アプリケーションの初期化処理をビルド時に実行することで、Quarkus は Polaris を迅速に起動させることができます。これは、Spark、Trino、Flink、またはその他のクエリエンジンからのメタデータ要求のバーストを処理するために、カタログインスタンスが迅速に起動する必要があるオートスケーリングシナリオにとって非常に重要です。数値で示すと、標準的な Quarkus アプリケーションは、ネイティブモードで 10ms、AOT (Leyden) を使用すると約 100ms、プレーンな JVM モードでは 1〜3 秒で起動します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;メモリフットプリントの削減&lt;/strong&gt;: リアクティブコアは、大規模なスレッドプールを維持するのではなく、少数のイベントループを使用することで、メモリ使用量を劇的に削減し、より高いデプロイ密度を可能にします。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;高スループット&lt;/strong&gt;: Netty と Eclipse Vert.x に基づくリアクティブな非ブロッキングエンジンにより、Polaris は多数の同時カタログ操作を効率的に処理し、メタデータストアやオブジェクトストレージへの I/O 中のブロッキングを最小限に抑えます。この非ブロッキングなリアクティブアーキテクチャにより、Polaris は Spark や Trino からのメタデータリクエストなど、数千の同時クライアント接続を、リクエストごとにスレッドを割り当てることなく処理できるため、スレッド競合のボトルネックを回避できます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;最適化されたリソース消費&lt;/strong&gt;: ビルド時最適化とリアクティブアーキテクチャの組み合わせにより、CPU 要件が低減され、Polaris を大規模に運用する組織のクラウドコストを直接削減します。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;developer-productivity-and-versatility&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#developer-productivity-and-versatility&quot;&gt;&lt;/a&gt;開発者の生産性と汎用性&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus は、豊富なエクステンションエコシステムを備えた、まとまりのあるフルスタックフレームワークを提供し、Polaris コミュニティがインフラストラクチャの配管を構築するのではなく、カタログ機能に集中できるようにします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;摩擦のない開発体験:&lt;/em&gt; ライブコーディング機能は、開発中に即座にフィードバックを提供し、内部開発ループを劇的に加速させ、カタログ機能やセキュリティ強化のより迅速なイテレーションを可能にします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;プログラミングモデルの柔軟性:&lt;/em&gt; Quarkus は、プレーンな命令型コード、Mutiny API を使用したリアクティブプログラミング、仮想スレッド (JDK 21+) の 3 つの実行アプローチをサポートしており、開発者は各コンポーネントに適切なモデルを選択できます。この汎用性により、Polaris の開発者は、シンプルな管理エンドポイント (ヘルスチェックなど) には慣れ親しんだ命令型パターンを使用しながら、高並行で I/O 集中型のカタログ操作 (メタデータルックアップやコミットなど) にはリアクティブ/非ブロッキングアプローチ (Mutiny または仮想スレッドを使用) を最大限に活用できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;プロトコルの多様性:&lt;/em&gt; REST、gRPC、GraphQL、およびメッセージブローカー (Kafka、RabbitMQ、Pulsar、Apache ActiveMQ) のネイティブサポートにより、Polaris はカタログ API の公開方法や、より広範なデータエコシステムとの統合において柔軟性を持ちます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-power-of-the-quarkiverse-ecosystem&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-power-of-the-quarkiverse-ecosystem&quot;&gt;&lt;/a&gt;Quarkiverse エコシステムの力&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;コアフレームワークを超えて、Quarkus は、数百ものコミュニティ主導およびベンダーサポートのエクステンションからなるエコシステムである &lt;strong&gt;Quarkiverse&lt;/strong&gt; へのアクセスを提供します。Polaris チームは、カスタム統合を構築するのではなく、永続化 (PostgreSQL、MongoDB)、セキュリティ (OIDC、OPA)、および可観測性 (OpenTelemetry、Micrometer) のために実証済みエクステンションを活用しており、次のセクションでコードベースからの具体的な例とともに説明します。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-polaris-leverages-quarkus&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-polaris-leverages-quarkus&quot;&gt;&lt;/a&gt;Polaris が Quarkus をどのように活用するか&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 基盤の真の力は、Apache Polaris がその実装で特定の Quarkus 機能をどのように活用しているかを調べると明らかになります。カタログサービスは、15 を超える専門エクステンションを統合して、本番対応のクラウドネイティブな Iceberg カタログを提供します。ここでは、統合のいくつかの例を示します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;reactive-request-processing-with-quarkus-rest&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reactive-request-processing-with-quarkus-rest&quot;&gt;&lt;/a&gt;Quarkus REST を使用したリアクティブなリクエスト処理&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Polaris は、Quarkus REST を使用して Iceberg REST API を実装し、Quarkus Reactive Core と SmallRye Mutiny を活用して、何千もの同時メタデータリクエストをスレッドをブロックすることなく非同期で処理します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Polaris コードベースの実際のレルムコンテキストリゾルバーを以下に示します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;@ServerRequestFilter(preMatching = true)
public Uni&amp;lt;Response&amp;gt; resolveRealmContext(ContainerRequestContext rc) {
   return realmContextResolver.resolveRealmContext(
                   rc.getUriInfo().getRequestUri().toString(),
                   rc.getMethod(),
                   rc.getUriInfo().getPath(),
                   rc.getHeaders()::getFirst)
           .invoke(realmContext -&amp;gt; realmContextHolder.set(realmContext))
           .invoke(realmContext -&amp;gt; ContextLocals.put(REALM_CONTEXT_KEY, realmContext));
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;わずか数行のリアクティブコードで、Polaris は、従来のフレームワークでは通常はるかに多くの定型コードを必要とするマルチテナントリクエストルーティングを実現します。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;resilience-with-smallrye-fault-tolerance&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resilience-with-smallrye-fault-tolerance&quot;&gt;&lt;/a&gt;SmallRye Fault Tolerance による回復性&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;カタログイベントの永続化などの重要な操作には、Polaris は信頼性を確保するために Quarkus Fault Tolerance (SmallRye Fault Tolerance に依存) を使用します。以下に、Polaris がメタデータストアへの回復力のあるフラッシュ操作を実装する方法の例を示します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;@Retry(maxRetries = 5, delay = 1000, jitter = 100)
@Fallback(fallbackMethod = &quot;onFlushError&quot;)
protected void flush(String realmId, List&amp;lt;PolarisEvent&amp;gt; events) {
   var metaStoreManager =
        metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext);
   metaStoreManager.writeEvents(callContext, events);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;この宣言的な回復性アプローチにより、Polaris はメタデータストアへの失敗した書き込みを、設定可能なバックオフとジッターで自動的に再試行し、サンダリングハーダ問題を防止します。設定されたすべての値は、アプリケーション設定で上書きできることに注意してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;using-cdi-beans-as-extension-points-selecting-the-persistence-layer&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#using-cdi-beans-as-extension-points-selecting-the-persistence-layer&quot;&gt;&lt;/a&gt;CDI Bean を拡張点として使用する: 永続化層の選択&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Polaris は、Quarkus の CDI 修飾子メカニズムを使用して、複数の永続化バックエンド (Quarkus JDBC PostgreSQL エクステンションを介した PostgreSQL、Quarkus MongoDB Client エクステンションを介した MongoDB、およびテスト用のインメモリ) をサポートします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;@Produces
@ApplicationScoped
Backend backend(BackendConfiguration config, @Any Instance&amp;lt;BackendBuilder&amp;gt; builders) {
   var backendName = config.backend()
           .orElseThrow(() -&amp;gt; new IllegalStateException(
               &quot;Configuration polaris.persistence.nosql.backend is missing!&quot;)
           );
   var builder = builders.select(BackendType.Literal.of(backendName));
   return builder.get().buildBackend();
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このアーキテクチャにより、オペレーターは &lt;code&gt;polaris.persistence.nosql.backend&lt;/code&gt; 設定プロパティーを変更するだけで、インフラストラクチャ要件に合致する永続化層で Polaris をデプロイできます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;comprehensive-observability&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#comprehensive-observability&quot;&gt;&lt;/a&gt;包括的な可観測性&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Polaris は、完全な可観測性のために、Prometheus レジストリを備えた Quarkus Micrometer と Quarkus OpenTelemetry を活用します。カタログは自動的に以下を追跡します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;HTTP メトリクス&lt;/strong&gt;: すべての Iceberg REST API リクエストについて、レルム、操作、ステータスコード別にタグ付けされます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;カタログ固有のメトリクス（テーブル数、ネームスペース数、メタデータ操作のレイテンシーなど）に対応する&lt;strong&gt;カスタムゲージとカウンター&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最初のメタデータリクエストからストレージアクセスまで、カタログ操作全体でリクエストを追跡する&lt;strong&gt;分散トレース&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;メトリクスエンドポイントは、Kubernetesのベストプラクティスに従い、メインAPIポート (8181) とは分離された、別の管理ポート (8182) で公開されます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-properties hljs&quot; data-lang=&quot;properties&quot;&gt;quarkus.http.port=8181
quarkus.management.enabled=true
quarkus.management.port=8182
quarkus.micrometer.enabled=true
quarkus.micrometer.export.prometheus.enabled=true&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;collaboration-between-quarkus-and-polaris-communities&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#collaboration-between-quarkus-and-polaris-communities&quot;&gt;&lt;/a&gt;QuarkusコミュニティーとPolarisコミュニティーのコラボレーション&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusの採用は、両コミュニティー間で生産的なフィードバックループを生み出しました。両プロジェクトのエンジニアは緊密に協力し、QuarkusがPolaris内で効果的に使用されることを保証し、バグを報告し、途中で可能な改善点を特定しました。この実践的なコラボレーションは、両者に利益をもたらします。Polarisは堅牢で十分に理解された基盤を獲得し、Quarkusは要求の厳しい高スループットのApache TLPデプロイメントから実世界のフィードバックを得て、Quarkusエコシステム全体に利益をもたらす安定性とパフォーマンスの向上を推進します。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;looking-ahead&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#looking-ahead&quot;&gt;&lt;/a&gt;将来を見据えて&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Apache Polarisがトップレベルプロジェクトとして成功裏に昇格したことと、Quarkusを基盤とすることで得られたパワーと効率は、将来を見据えた重要な技術的課題の出発点に過ぎません。Polarisは、成長のためだけでなく、クラウドネイティブなデータレイクハウスアーキテクチャの未来を積極的に形作る立場にあります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;コミュニティーはすでに、次期メジャーリリースであるQuarkus 4を含む、Quarkusロードマップの最先端に合わせて開発を進めています。この連携により、Polarisはパフォーマンスの向上、新しいクラウドネイティブAPI、およびリアクティブコア向けの最も高度な機能を継続的に利用できるようになります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私たちのビジョンは、最も重要なデプロイメントの要求を満たすために、新しいネットワーキングおよびセキュリティ標準を採用することにまで及びます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;次世代ネットワーキング:&lt;/strong&gt; HTTP/3の採用を検討しており、その多重化とヘッドオブラインブロッキングの削減を活用して、メタデータリクエストのレイテンシーをさらに最小限に抑え、スループットを向上させます。これは、数千の同時操作を管理するクエリーエンジンにとって不可欠です。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;将来性のあるセキュリティ:&lt;/strong&gt; 今日の標準を超えて、プロジェクトは量子安全なTLSと暗号化を調査しています。最新の暗号化プラクティスを統合することで、Polarisは現在だけでなく、将来の計算上の課題に対しても安全なカタログを提供することを目指します。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;活発なコミュニティーによって推進される継続的なイノベーションへのこのコミットメントは、Apache Polarisが高性能で安全な、マルチエンジンIcebergカタログ相互運用性の業界標準となる準備ができていることを保証します。私たちは、このデータエコシステムの次の時代を定義するために、貢献者、ユーザー、および組織が私たちに参加することを歓迎します。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-polaris/
            </guid>
            
            
            
            <author></author>
            
        </item>
        
        <item>
            <title>Quarkus ニュースレター #66 - 3月</title>
            <link>
                https://quarkus.io/blog/quarkus-newsletter-66/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;透明で包括的なパフォーマンス像を提供するため、Quarkusはそのベンチマークを再構築しました。Holly Cumminsによる「Quarkus has great performance – and we have new evidence」で詳細をご覧ください。Guillaume Smetによる「How Project Leyden brought a new perspective」を読んで、Project LeydenがQuarkusにおける起動パフォーマンスについて考える新しい視点をどのように与えたかをご覧ください。Juarez Juniorの投稿「Unleash the Power of AI Agents with Java: Building Intelligent Applications with Quarkus, LangChain4j, and Oracle AI Database」をチェックして、Oracleデータベースのエラーコードに関する顧客サポートを処理するQuarkusベースのAIサポートエージェントを構築する方法を学びましょう。Markus Eiseleによる「Your Java Architecture Is Lying to You: Enforcing Real Boundaries with Quarkus」で、Taikaiを使った実行可能なアーキテクチャテストが、最新のJavaシステムでどのように図、レビュー、部族の知識に取って代わるかをご覧ください。今日、Javaエンタープライズアプリケーションは、フロントエンドにAngular、React、またはVueをデフォルトとすることがよくあります。しかし、この種のアプリケーションには、最も自然なUIフレームワークがJavaエコシステムに既に存在します。それはJakarta Facesです。Nicolas Duminilによる「Rethinking Java Web UIs with Jakarta Faces and Quarkus」で詳細をご覧ください。Markus EiseleがSSE、バッチ処理、PostgreSQLを使ってJava関連の会話を追跡するためのストリーミング取り込みパイプラインをどのように構築したか、「Listening to the Fediverse with Java: A Real-Time Quarkus Experiment」でご覧ください。Hüseyin Akdoğanによる「DPoP: What It Is, How It Works, and Why Bearer Tokens Aren’t Enough」を読んで、DPoP（Demonstration of Proof-of-Possession）とは何か、それが解決する問題、そしてKeycloakとQuarkusを使った動作する実装を見ていきましょう。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;また、最新のQuarkus Insightsのエピソード、話題のツイート/ディスカッション、今後開催されるQuarkus参加イベントもご覧いただけます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkus.io/newsletter/66/&quot;&gt;ニュースレター #66: 3月&lt;/a&gt; をチェックしてください！&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ニュースレターを受信してみませんか？ページ上のフォームを使って &lt;a href=&quot;https://quarkus.io/newsletter&quot;&gt;ニュースレターに登録&lt;/a&gt;してください。&lt;/p&gt;
&lt;/div&gt;
            </description>
            <pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-newsletter-66/
            </guid>
            
            
            
            <author>James Cobb (https://twitter.com/insectengine)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.32.3 - メンテナンスリリース</title>
            <link>
                https://quarkus.io/blog/quarkus-3-32-3-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;本日、Quarkus 3.32.3 をリリースしました。これは 3.32 ストリーム向けの 2 番目のメンテナンスリリースです (3.32.0 はスキップしました)。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;3.32 は 3.33 LTS の基盤となるため、LTS リリースを追跡している場合でも、ぜひテストすることをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.32 にアップデートするには、Quarkus CLI の最新バージョンにアップデートし、以下を実行することをお勧めします:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なお、&lt;code&gt;quarkus update&lt;/code&gt; は Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.32 へアプリケーションをアップデートできます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整の詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.32&quot;&gt;Quarkus 3.32 移行ガイド&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.32.3&quot;&gt;3.32.3&lt;/a&gt; の完全な変更履歴は GitHub で確認できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-32-3-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.32.2 - メンテナンスリリース</title>
            <link>
                https://quarkus.io/blog/quarkus-3-32-2-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;本日、Quarkus 3.32.2 をリリースしました。これは、3.32 ストリームにとって最初のメンテナンスリリースです (3.32.0 はスキップしました)。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;3.32 は 3.33 LTS の基盤となるため、LTS リリースを追跡している場合でも、ぜひテストしてください。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.32 に更新するには、Quarkus CLI の最新バージョンに更新してから、以下を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;quarkus update&lt;/code&gt; を使用すると、Quarkus のあらゆるバージョン (2.x を含む) から Quarkus 3.32 へアプリケーションを更新できることに注意してください。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整の詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.32&quot;&gt;Quarkus 3.32 移行ガイド&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.32.2&quot;&gt;3.32.2&lt;/a&gt; の完全な変更履歴は GitHub で確認できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-32-2-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Project Leyden を Quarkus に統合した方法</title>
            <link>
                https://quarkus.io/blog/leyden-2/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus は、それぞれ異なるトレードオフに最適化された JVM モードとネイティブイメージモードの両方を長年サポートしてきました。ネイティブイメージは、比類のない起動時間とフットプリントを実現します。JVM モードは、ピークスループット、動的な機能、成熟したツールエコシステムを提供します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus はネイティブイメージとの連携を改善し続けており、最近では Project Leyden のおかげで、この方程式の JVM 側を強化することができました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;以前の &lt;a href=&quot;https://quarkus.io/blog/leyden-1/&quot;&gt;ブログ記事&lt;/a&gt; で、Project Leyden と、それが Java アプリケーションの起動パフォーマンスに新たな視点を与えてくれたことへの熱意を共有しました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;この投稿では、Project Leyden を Quarkus に統合するまでの道のり、そしてこの統合をユーザーにとって効率的かつ使いやすいものにするためにどのように取り組んだかを紹介します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;acknowledgements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgements&quot;&gt;&lt;/a&gt;謝辞&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;まず、Project Leyden に関する取り組みと、Leyden を理解し、Quarkus に統合するための最善の方法を決定する上で非常に役立った多くの議論について、IBM の OpenJDK チームに感謝いたします。具体的には（アルファベット順で）、Maria Arias de Reyna Dominguez 氏、Andrew Dinn 氏、および Ashutosh Mehra 氏です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;より広く、Project Leyden に貢献しているすべての方々に感謝いたします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Project Leyden はまだ進化途上にあり、Java 27 以降に向けてどのような準備をしているのか楽しみにしています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;最後に、Sanne Grinovero 氏には、適切なタイミングで Leyden チームに紹介していただき、私たちの仕事に対する洞察と貴重なフィードバックをいただいたことに深く感謝いたします。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-project-leyden&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-project-leyden&quot;&gt;&lt;/a&gt;Project Leyden とは？&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;graalvm&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#graalvm&quot;&gt;&lt;/a&gt;GraalVM と Java における AOT の普及&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java の世界では、Java アプリケーションをネイティブ実行可能ファイルにコンパイルする GraalVM ネイティブイメージの登場により、Ahead-of-Time (AOT) コンパイルが注目を集めるようになりました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これは Java エコシステムに大きな影響を与え、Java アプリケーションの起動パフォーマンスにとって画期的なものでした。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;起動時間とメモリフットプリントが大幅に削減されます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードはすでにネイティブコードにコンパイルされているため、ウォームアップフェーズはありません。パフォーマンスは実質的に最初からピークに達します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;結果として生成される実行可能ファイルは小さく、より小さなコンテナーイメージにつながります。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Resident Set Size (RSS) メモリ使用量は、通常の JVM アプリケーションと比較してはるかに小さくなります。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;しかし、これにはいくつかの欠点があります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;すべての Java 機能とライブラリが OpenJDK と同じようにそのままサポートされているわけではありません。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;これはクローズドワールドの仮定に依存し、ほとんどのランタイムダイナミズムを排除します（少なくとも現在の形式では。GraalVM 側の作業によって将来的に変更される可能性はあります）。注記: Quarkus は同じ仮定を置いているため、これは Quarkus にとって問題ではありませんでしたが、サードパーティライブラリにとっては問題となる可能性があります。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特定の制約が導入され、最も一般的なのは明示的なリフレクション設定を提供する必要があることです。これらの要件は開発およびテスト中に労力を追加しますが、Quarkus がサポートするエクステンションの場合、それらは最小限に抑えられます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ネイティブイメージのビルドは著しく遅くなります。これは通常、内部開発ループに影響を与えませんが（ネイティブ固有の問題をデバッグする場合を除く）、CI リソースに顕著な影響を与える可能性があります。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ネイティブ実行可能ファイルのデバッグは困難です。改善されてはいますが、GDB の使用とビルドにおけるデバッグシンボルの存在が必要であるため、JVM でのデバッグよりもはるかに困難です。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;そして、すべてが AOT コンパイルされるため、実行時にコードを最適化する JIT コンパイラが存在せず、場合によっては最適なピークパフォーマンスが得られないことがあります。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;全体として、ネイティブイメージは起動時間とフットプリントが主要な目標である場合に優れた選択肢です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;しかし、すべてのアプリケーションがこれらの側面を最適化するわけではありません。一部のアプリケーションは、ピークスループット、開発速度、デバッグ容易性、既存ツールとの互換性を優先します。ここで Leyden が興味深いものになります。これは、従来の JVM モデルに近いままで、起動とフットプリントの改善を目指します。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;project-leydens-approach-to-aot&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-leydens-approach-to-aot&quot;&gt;&lt;/a&gt;Project Leyden の AOT へのアプローチ&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Project Leyden は GraalVM ネイティブイメージと同じ根本的な問題に対処しますが、異なるアプローチを取っています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;これは依然として「純粋な」Java であり、OpenJDK の一部です。アプリケーションは JVM 上で実行され、特別な設定なしに Java の機能とライブラリに完全にアクセスできます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;トレーニングフェーズ中に、アプリケーションの動作を記録し、ロードされたクラスやリンクされたクラスなどの情報を収集します。より新しいバージョンでは、JIT 出力の一部も記録し始め、各 JVM バージョンでスコープと最適化の可能性を拡大しています。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;この情報は AOT キャッシュファイルに保存されます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;起動時に、この AOT キャッシュファイルを使用して JVM を設定します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アプリケーションは依然として JVM 上で実行されるため、JIT コンパイラ、好みのガーベージコレクタ、およびその他のすべての JVM 最適化の恩恵を受け続け、通常 JVM に関連付けられている高いスループットを維持します。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;AOT キャッシュはまさにその通り、キャッシュです。キャッシュにクラスが存在しない場合は、通常通りロードおよびリンクされます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Project Leyden は、クラスのロードとリンクを最適化することで起動時間を短縮します。JVM にプロファイリング情報を提供することでウォームアップ時間を短縮し、コンパイルされたコード自体がキャッシュに保存されるようになれば、さらに短縮されるでしょう。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/leyden-2/leyden.png&quot; alt=&quot;How Leyden works&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 1. Leyden の仕組み&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;とはいえ、Project Leyden も魔法ではありません。現在の形式では以下のようになります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;起動時間とウォームアップ時間の改善は著しいですが、GraalVM/Mandrel ネイティブイメージほど実質的ではありません。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アプリケーションをトレーニングし、AOT キャッシュを生成する必要があります。実際には、これは難しくなく、Quarkus では可能な限りシームレスにしました。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アプリケーションと一緒に JVM を配布する必要があります。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;また、AOT キャッシュも配布する必要があり、これはコンテナーイメージがネイティブ実行可能ファイルよりも大幅に大きくなることを意味します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;現時点ではメモリフットプリントの恩恵は得られません。ほとんどの場合、通常の JVM と同程度です。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私たちの見解では、Project Leyden はパフォーマンスと互換性の魅力的なバランスを非常に合理的なコストで提供し、JVM 上で実行される多くの Java アプリケーションのデフォルトのデプロイメントワークフローの一部となる可能性があります。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;project-leyden-status&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-leyden-status&quot;&gt;&lt;/a&gt;Project Leyden のステータス&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;OpenJDK 25 では、以下の Project Leyden 関連 JEP が利用可能です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openjdk.org/jeps/483&quot;&gt;JEP 483 - Ahead-of-Time Class Loading &amp;amp; Linking&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openjdk.org/jeps/514&quot;&gt;JEP 514 - Ahead-of-Time Command-Line Ergonomics&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openjdk.org/jeps/515&quot;&gt;JEP 515 - Ahead-of-Time Method Profiling&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これらの JEP が連携することで、OpenJDK 25 から Project Leyden を完全に利用できるようになります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;追加の JEP は OpenJDK 26 以降で計画されています。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;project-leyden-in-quarkus&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-leyden-in-quarkus&quot;&gt;&lt;/a&gt;Quarkus における Project Leyden&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus は、広範なビルド時処理と最適化を備えた、非常に特化したフレームワークです。Project Leyden もまた、独自の制約と要件を持つ特化されたテクノロジーです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私たちの目標は、Quarkus の長所を維持しつつ、Leyden の利点を最大限に引き出す形で Project Leyden を Quarkus に統合することでした。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.32 には、エンドツーエンドの Leyden 統合の最初のバージョンが含まれています。その仕組みを詳しく見ていきましょう。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;aot-jar-packaging&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#aot-jar-packaging&quot;&gt;&lt;/a&gt;AOT JAR パッケージング&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;お使いの Quarkus アプリケーションが &lt;code&gt;target/quarkus-app/&lt;/code&gt; ディレクトリーにパッケージされているのをご覧になっているかもしれませんが、常にそうだったわけではありません。Quarkus の初期の頃は、他のほとんどの Java フレームワークと同様に、依存関係を &lt;code&gt;lib/&lt;/code&gt; ディレクトリーに配置して、&lt;code&gt;target/&lt;/code&gt; に従来のランナー JAR をビルドしていました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus の現在のデフォルトパッケージングは &lt;code&gt;fast-jar&lt;/code&gt; と呼ばれています。その主要な目標の 1 つは、クラスローディングを最適化することです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これを達成するために、独自のクラスローダーを導入しました。このクラスローダーは、たとえば、&lt;code&gt;package name&lt;/code&gt; &amp;#8594; &lt;code&gt;jar file&lt;/code&gt; マッピングをメモリーに保持します。また、&lt;code&gt;META-INF/services&lt;/code&gt; のような特定の場所の完全なディレクトリーインデックスを維持するなど、追加の最適化も含まれています。これらはこのパッケージングが行うことのほんの一部ですが、いくつかの文脈を提供できるはずです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このパッケージングは従来の JVM 環境では非常に優れたパフォーマンスを発揮しますが、Project Leyden とはうまく連携しません。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Project Leyden は保守的なアプローチをとっており、標準の JDK クラスローダーによってロードされたクラスのみをキャッシュします。つまり、AOT キャッシュを最大限に活用したい場合は、カスタムクラスローダーは許可されません。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;いずれかの時点で、この制限が Leyden チームによって解除されることを願っています。もしそうなれば、&lt;code&gt;fast-jar&lt;/code&gt; パッケージング、またはその進化版に戻る予定です。&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;正確には、AOT キャッシュを最大限に活用したい場合、&lt;strong&gt;クラス&lt;/strong&gt; をロードするためにカスタムクラスローダーを使用することはできません。ただし、&lt;strong&gt;リソース&lt;/strong&gt; のロードのみを目的としてカスタムクラスローダーを使用することはできます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これが、Project Leyden 専用のパッケージングである &lt;code&gt;aot-jar&lt;/code&gt; を開発した理由です。AOT が有効になっている場合、これは自動的に選択され、移行が完全に透過的になります。これは &lt;code&gt;fast-jar&lt;/code&gt; パッケージングと同じファイルレイアウトを使用します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;すべての &lt;strong&gt;クラス&lt;/strong&gt; のローディングを JDK クラスローダーに委譲することに加えて、このパッケージングにはいくつかの特定の特性があります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;META-INF/services&lt;/code&gt; からサービスディスクリプターを収集し、それらを統合してメモリーに保持します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quarkus 設定ファイル (例: &lt;code&gt;application.properties&lt;/code&gt;) にも同じアプローチを適用します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特定のディレクトリー (例: ルートディレクトリー、&lt;code&gt;META-INF&lt;/code&gt;、および &lt;code&gt;META-INF/services&lt;/code&gt;) の完全なインデックスを維持します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;事前初期化フェーズを導入し、その間に選択された要素が並行して事前ロードされます (例: タイムゾーンデータベース)。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このパッケージング形式は新しいものであるため、実際の使用状況からフィードバックを収集したいと考えています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;はっきりさせておきますが、Project Leyden が使用されていない場合、&lt;code&gt;aot-jar&lt;/code&gt; は &lt;code&gt;fast-jar&lt;/code&gt; よりもパフォーマンスが劣ります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これは &lt;code&gt;fast-jar&lt;/code&gt; のすべての最適化を含んでおらず、Project Leyden と組み合わせてのみ使用することを意図しています。したがって、この特定のユースケース以外では使用すべきではありません。&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;training-and-aot-cache-generation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#training-and-aot-cache-generation&quot;&gt;&lt;/a&gt;トレーニングと AOT キャッシュの生成&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;AOT キャッシュは、それを生成するために使用されるトレーニングデータの質に依存します。トレーニングフェーズ中、JVM はロードおよびリンクされたクラスを記録し、メソッドプロファイリングデータを収集します。トレーニングワークロードがより代表的であるほど、結果として得られるキャッシュはより効果的です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私たちは、Quarkus ユーザーにとってトレーニングが可能な限りシームレスであることを望みました。既存の統合テストインフラストラクチャーを活用するのが自然な選択でした。つまり、すでに &lt;code&gt;@QuarkusIntegrationTest&lt;/code&gt; テストがある場合、それらをトレーニングワークロードとして利用できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;AOT トレーニングが有効な場合、以下のフローになります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Quarkus は &lt;code&gt;aot-jar&lt;/code&gt; パッケージングでアプリケーションをビルドします。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アプリケーションは AOT トレーニングが有効な状態で起動します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;統合テストがアプリケーションに対して実行され、そのエンドポイントと機能を検証します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JVM はテスト実行全体を通してプロファイリングデータをキャプチャーします。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;記録されたデータから最適化された &lt;code&gt;app.aot&lt;/code&gt; キャッシュファイルが生成されます。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これは実用的かつ効果的です。あなたはすでにアプリケーションを検証するために統合テストを作成しており、それらはAOTキャッシュ用の比較的現実的なトレーニングデータも生成します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;@QuarkusIntegrationTest&lt;/code&gt; を使用する統合テストは、Dev Services を利用するため、ターゲットアプリケーションの実行を非常に簡単にします。&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;integration-with-the-build-system&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#integration-with-the-build-system&quot;&gt;&lt;/a&gt;ビルドシステムとの統合&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私たちは、Quarkus で Leyden を有効にするのが、1 つのフラグで済む操作であることを望みました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;quarkus.package.jar.aot.enabled=true&lt;/code&gt; を設定するだけで十分です。Quarkus は自動的に &lt;code&gt;aot-jar&lt;/code&gt; パッケージングに切り替わり、AOT パイプライン全体を設定します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Maven では、完全なフローは単一のコマンドです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;./mvnw verify -Dquarkus.package.jar.aot.enabled=true -DskipITs=false&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これにより、アプリケーションがビルドされ、AOT トレーニングを伴う統合テストが実行され、&lt;code&gt;target/quarkus-app/&lt;/code&gt; に &lt;code&gt;app.aot&lt;/code&gt; キャッシュファイルが生成されます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私たちのツールで生成されたプロジェクトを使用している場合、統合テストはデフォルトで無効になっています。&lt;code&gt;-DskipITs=false&lt;/code&gt; を追加することで、それらが実行されるようになります。&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;AOT キャッシュを使用してアプリケーションを実行するのも同様に簡単です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;cd target/quarkus-app
java -XX:AOTCache=app.aot -jar quarkus-run.jar&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;また、AOT をコンテナーイメージエクステンション (Jib、Docker、Podman) と統合しました。AOT を有効にしてコンテナーイメージをビルドする際、Quarkus は次の処理を行います。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;aot-jar&lt;/code&gt; パッケージングでアプリケーションをビルドします。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ベースコンテナーイメージを作成します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AOT キャッシュをトレーニングするために、コンテナーに対して統合テストを実行します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AOT キャッシュを含み、起動時にそれを使用するように事前設定された最終的なコンテナーイメージ (バージョンに &lt;code&gt;-aot&lt;/code&gt; サフィックスが付加されます) を生成します。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このエンドツーエンドの統合は、単一のコマンドでソースコードから AOT 最適化されたコンテナーイメージへの移行を意味します。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;some-numbers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#some-numbers&quot;&gt;&lt;/a&gt;いくつかの数値&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Project Leyden の利点は理論上説明しましたが、実際にはどのように機能するのでしょうか？&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;それを調べるために、2 つの異なる Quarkus アプリケーションについていくつかの数値を収集しました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;quarkus create app&lt;/code&gt; を実行したときに得られるシンプルな REST アプリケーション&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;非常に大規模な REST CRUD アプリケーション: 1,000 エンティティー、1,000 リポジトリー、1,000 サービス、1,000 REST エンドポイント&amp;#8230;&amp;#8203; 合計で &lt;code&gt;9,000&lt;/code&gt; 個の .java ファイル。これは極端なケースなので、自宅では試さないでください！&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;コンテナーイメージのサイズは、Red Hat の UBI 9 Minimal をベースとし、JDK 25 を使用する当社のデフォルトイメージを使用して測定されました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;raw-numbers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#raw-numbers&quot;&gt;&lt;/a&gt;生の値&lt;/h3&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これらの数値は、起動時にロードされたすべてのクラスを完全に記録して取得されました。これらは隔離されたラボ環境ではなく、私たちのラップトップで測定されました。近いうちに、ラボでより包括的なベンチマークセットを実行する予定です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;結果はいくつかの理由で異なる場合があります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;起動時に必要となるすべてのクラスが記録されたわけではありません。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アプリケーションは起動中に実際の作業を実行します。Leyden はクラスのロードのみを最適化し、アプリケーションロジックは最適化しません。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;いずれにせよ、予期せぬ結果が見られた場合は、ぜひフィードバックをお寄せください。ご連絡いただければ、有用なプロファイリング情報を収集する方法をご案内します。&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;RSS は常駐セットサイズ (Resident Set Size) メモリー使用量を指します。&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;small-rest-application&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#small-rest-application&quot;&gt;&lt;/a&gt;小規模 REST アプリケーション&lt;/h4&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 18.1818%;&quot;&gt;
&lt;col style=&quot;width: 18.1818%;&quot;&gt;
&lt;col style=&quot;width: 9.0909%;&quot;&gt;
&lt;col style=&quot;width: 18.1818%;&quot;&gt;
&lt;col style=&quot;width: 9.0909%;&quot;&gt;
&lt;col style=&quot;width: 18.1818%;&quot;&gt;
&lt;col style=&quot;width: 9.091%;&quot;&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;起動時間&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;差分&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;コンテナーイメージサイズ&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;差分&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;RSS&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;差分&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;デフォルト fast-jar&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;370 ミリ秒&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;参考&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;456 MB&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;参考&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;122 MB&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;参考&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Project Leyden および aot-jar&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;80 ミリ秒&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;-78%&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;495 MB&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;+9%&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;103 MB&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;-16%&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Mandrel ネイティブ実行可能ファイル&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;17 ミリ秒&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;-95%&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;155 MB&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;-66%&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;37 MB&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;-70%&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;AOT キャッシュファイルのサイズは &lt;code&gt;39 MB&lt;/code&gt; で、Quarkus REST アプリケーションで期待できる最小値です。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;large-rest-crud-application&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#large-rest-crud-application&quot;&gt;&lt;/a&gt;大規模 REST CRUD アプリケーション&lt;/h4&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 18.1818%;&quot;&gt;
&lt;col style=&quot;width: 18.1818%;&quot;&gt;
&lt;col style=&quot;width: 9.0909%;&quot;&gt;
&lt;col style=&quot;width: 18.1818%;&quot;&gt;
&lt;col style=&quot;width: 9.0909%;&quot;&gt;
&lt;col style=&quot;width: 18.1818%;&quot;&gt;
&lt;col style=&quot;width: 9.091%;&quot;&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;起動時間&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;差分&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;コンテナーイメージサイズ&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;差分&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;RSS&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;差分&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;デフォルト fast-jar&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;3,189 ミリ秒&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;参考&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;517 MB&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;参考&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;580 MB&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;参考&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Project Leyden および aot-jar&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;924 ミリ秒&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;-71%&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;715 MB&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;+38%&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;580 MB&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;0%&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;strong&gt;Mandrel ネイティブ実行可能ファイル&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;242 ミリ秒&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;-92%&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;244 MB&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;-53%&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;210 MB&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-right valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;code&gt;-64%&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;AOT キャッシュファイルのサイズは &lt;code&gt;198 MB&lt;/code&gt; ですが、アプリケーションに 9,000 個の &lt;code&gt;.java&lt;/code&gt; ファイルが含まれていることを考えると、驚くにはあたりません。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;startup-time&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#startup-time&quot;&gt;&lt;/a&gt;起動時間&lt;/h3&gt;
&lt;script src=&quot;/assets/javascript/chart.min.js&quot;&gt;&lt;/script&gt;
&lt;div class=&quot;chart-container&quot;&gt;
  &lt;canvas id=&quot;startup-time-graph&quot;&gt;&lt;/canvas&gt;
&lt;/div&gt;
&lt;script&gt;
const startupTime = document.getElementById(&apos;startup-time-graph&apos;);
new Chart(startupTime, {
     type: &apos;bar&apos;,
     data: {
     labels: [&apos;Small REST app&apos;, &apos;Large REST CRUD app&apos;],
     datasets: [
     {
          label: &apos;Default&apos;,
          data: [370, 3189],
          backgroundColor: &apos;rgba(54, 162, 235, 0.7)&apos;,
          borderColor: &apos;rgba(54, 162, 235, 1)&apos;,
          borderWidth: 1
     },
     {
          label: &apos;Project Leyden&apos;,
          data: [80, 924],
          backgroundColor: &apos;rgba(255, 206, 86, 0.7)&apos;,
          borderColor: &apos;rgba(255, 206, 86, 1)&apos;,
          borderWidth: 1
     },
     {
          label: &apos;Native&apos;,
          data: [17, 242],
          backgroundColor: &apos;rgba(75, 192, 192, 0.7)&apos;,
          borderColor: &apos;rgba(75, 192, 192, 1)&apos;,
          borderWidth: 1
     }
     ]
     },
     options: {
     responsive: true,
     plugins: {
     title: {
          display: true,
          text: &apos;Startup time comparison&apos;
     },
     legend: {
          position: &apos;top&apos;,
     }
     },
     scales: {
     y: {
          beginAtZero: true,
          title: {
          display: true,
          text: &apos;Startup time (ms)&apos;
          }
     }
     }
     }
});
&lt;/script&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Leyden は、小規模アプリケーションと非常に大規模なアプリケーションの両方で起動時間を大幅に改善します。ネイティブ実行可能ファイルの起動速度には及ばないものの、その結果は依然として素晴らしいものです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ここで少し立ち止まりましょう。&lt;strong&gt;JVM で Quarkus REST アプリケーションをわずか &lt;code&gt;80 ms&lt;/code&gt; で起動できました&lt;/strong&gt;。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/leyden-2/quarkus-startup.png&quot; alt=&quot;Starting fast&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 2. Quarkus は高速に起動します！&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;確かに、単一のエンドポイントを持つシンプルな REST アプリケーションですが、それでもフル機能の REST 実装に依存しています。そして、JVM で動作します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;非常に大規模なアプリケーションでも、結果は同様に印象的です。&lt;strong&gt;起動時間を &lt;code&gt;71%&lt;/code&gt; 削減できました&lt;/strong&gt;。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;container-image-size&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#container-image-size&quot;&gt;&lt;/a&gt;コンテナーイメージサイズ&lt;/h3&gt;
&lt;div class=&quot;chart-container&quot;&gt;
  &lt;canvas id=&quot;container-image-size-graph&quot;&gt;&lt;/canvas&gt;
&lt;/div&gt;
&lt;script&gt;
const containerImageSize = document.getElementById(&apos;container-image-size-graph&apos;);
new Chart(containerImageSize, {
     type: &apos;bar&apos;,
     data: {
     labels: [&apos;Small REST app&apos;, &apos;Large REST CRUD app&apos;],
     datasets: [
     {
          label: &apos;Default&apos;,
          data: [456, 517],
          backgroundColor: &apos;rgba(54, 162, 235, 0.7)&apos;,
          borderColor: &apos;rgba(54, 162, 235, 1)&apos;,
          borderWidth: 1
     },
     {
          label: &apos;Project Leyden&apos;,
          data: [495, 715],
          backgroundColor: &apos;rgba(255, 206, 86, 0.7)&apos;,
          borderColor: &apos;rgba(255, 206, 86, 1)&apos;,
          borderWidth: 1
     },
     {
          label: &apos;Native&apos;,
          data: [155, 244],
          backgroundColor: &apos;rgba(75, 192, 192, 0.7)&apos;,
          borderColor: &apos;rgba(75, 192, 192, 1)&apos;,
          borderWidth: 1
     }
     ]
     },
     options: {
     responsive: true,
     plugins: {
     title: {
          display: true,
          text: &apos;Container image size comparison&apos;
     },
     legend: {
          position: &apos;top&apos;,
     }
     },
     scales: {
     y: {
          beginAtZero: true,
          title: {
          display: true,
          text: &apos;Container image size (MB)&apos;
          }
     }
     }
     }
});
&lt;/script&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;驚くことではありませんが、Container Image に AOT キャッシュファイルを含める必要もあるため、Leyden はイメージサイズを増加させます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus REST アプリケーションの場合、最小サイズは約 &lt;code&gt;40 MB&lt;/code&gt; です。アプリケーションが大きくなるにつれてキャッシュサイズも大きくなります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;一方、ネイティブ化すると、完全な JVM を含める必要がなくなるため、Container Image サイズが大幅に削減されます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;memory-footprint&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#memory-footprint&quot;&gt;&lt;/a&gt;メモリフットプリント&lt;/h3&gt;
&lt;div class=&quot;chart-container&quot;&gt;
  &lt;canvas id=&quot;rss-graph&quot;&gt;&lt;/canvas&gt;
&lt;/div&gt;
&lt;script&gt;
const rss = document.getElementById(&apos;rss-graph&apos;);
new Chart(rss, {
     type: &apos;bar&apos;,
     data: {
     labels: [&apos;Small REST app&apos;, &apos;Large REST CRUD app&apos;],
     datasets: [
     {
          label: &apos;Default&apos;,
          data: [122, 580],
          backgroundColor: &apos;rgba(54, 162, 235, 0.7)&apos;,
          borderColor: &apos;rgba(54, 162, 235, 1)&apos;,
          borderWidth: 1
     },
     {
          label: &apos;Project Leyden&apos;,
          data: [103, 580],
          backgroundColor: &apos;rgba(255, 206, 86, 0.7)&apos;,
          borderColor: &apos;rgba(255, 206, 86, 1)&apos;,
          borderWidth: 1
     },
     {
          label: &apos;Native&apos;,
          data: [37, 210],
          backgroundColor: &apos;rgba(75, 192, 192, 0.7)&apos;,
          borderColor: &apos;rgba(75, 192, 192, 1)&apos;,
          borderWidth: 1
     }
     ]
     },
     options: {
     responsive: true,
     plugins: {
     title: {
          display: true,
          text: &apos;RSS comparison&apos;
     },
     legend: {
          position: &apos;top&apos;,
     }
     },
     scales: {
     y: {
          beginAtZero: true,
          title: {
          display: true,
          text: &apos;RSS (MB)&apos;
          }
     }
     }
     }
});
&lt;/script&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;RSS の観点では、Project Leyden は状況を大きく変えませんが、ネイティブ実行可能ファイルは大幅に低いメモリフットプリントを提供します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;メモリ使用量の削減は、今のところ Project Leyden の主要な目標ではありませんが、将来的に進化する可能性があります。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;lets-take-a-step-back&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#lets-take-a-step-back&quot;&gt;&lt;/a&gt;一歩下がって考えてみましょう&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;この時点で、「すべてをネイティブにしないのはなぜだろう？」と考えているかもしれません。&lt;a href=&quot;#graalvm&quot;&gt;私たちが概説した&lt;/a&gt; すべての理由から、あなたにとって意味のある場合にネイティブを使用してください。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;スループットの問題もあります。適切なセットアップがなかったため、私たちはスループットの数値を独自に収集していませんが、一部の同僚が隔離された環境でテストを実行しており、最近 &lt;a href=&quot;https://quarkus.io/blog/new-benchmarks/&quot;&gt;新しいベンチマーク結果&lt;/a&gt; を公開しました。ネイティブ実行可能ファイルは、少なくとも Mandrel と GraalVM CE で今日オープンソースとして利用できるものについては、通常、スループットが低くなる傾向があります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ここが Project Leyden が真価を発揮する点です。通常の JVM と比較して起動時間が大幅に高速になりながらも、JVM で実行することのすべての利点を保持します。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;whats-next-for-leyden-in-quarkus&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next-for-leyden-in-quarkus&quot;&gt;&lt;/a&gt;Quarkus における Leyden の次なる展開は？&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Project Leyden は積極的に進化しており、私たちはその開発を密接に追跡しています。特に OpenJDK Leyden リポジトリの &lt;code&gt;premain&lt;/code&gt; ブランチを通じて、実験的な機能が主流の JDK リリースに統合される前に開発されています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;改善が期待されるいくつかの領域があります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JIT コンパイルされたコードを AOT キャッシュに保存することで、ウォームアップ時間がさらに短縮されます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;カスタムクラスローダーの潜在的なサポートにより、より最適化された &lt;code&gt;fast-jar&lt;/code&gt; パッケージングに戻れるようになります。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 側では、以下の点にも取り組んでいます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Windows を含む追加プラットフォームでのテストと検証。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Project Leyden が成熟するにつれて、私たちは新しい機能を Quarkus に統合し続けます。Java 27 以降がもたらすものに期待しています。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot;&gt;&lt;/a&gt;まとめ&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Project Leyden を Quarkus に統合するための実験と作業を1ヶ月間行った後、私たちはこのテクノロジーの結果と可能性に非常に興奮しています。そして、Quarkus 3.32 に統合できたことを大変嬉しく思っており、皆様はすでにそれを使って試すことができます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Project Leyden は継続的に改善されており、Java プラットフォームの将来において重要な位置を占める可能性が高いです。最高の開発プラットフォームを提供するという Quarkus の探求の一環として、IBM の OpenJDK チームの協力を得て、私たちはアップストリーム（ &lt;a href=&quot;https://github.com/openjdk/leyden/tree/premain&quot;&gt;&lt;code&gt;git@github.com:openjdk/leyden.git&lt;/code&gt;&lt;/a&gt; の &lt;code&gt;premain&lt;/code&gt; ブランチ）での進捗状況を積極的に監視しており、Quarkus と Leyden のエクスペリエンスをそれに応じて形成し続ける予定です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;AOT サポートにより、Quarkus はそのランタイムの柔軟性を拡張します。プレーンな JVM、Leyden 最適化 JVM、そしてネイティブイメージです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これらのモードは互いに置き換わるのではなく、トレードオフのスペクトルを形成します。ネイティブイメージは起動と最小フットプリントにおいて比類がありません。Leyden は JVM の起動の利点を強化します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;どれが最適かは、あなたの優先事項、制約、およびアプリケーションのワークロードによって異なります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私たちのコミットメントは変わっていません。開発者にそのワークロードに最適なオプションを提供し、各パスを改善し続けることです。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/leyden-2/
            </guid>
            
            
            
            <author></author>
            
        </item>
        
        <item>
            <title>Quarkusは素晴らしいパフォーマンスを発揮します。その新たな証拠があります</title>
            <link>
                https://quarkus.io/blog/new-benchmarks/
            </link>
            <description>
                &lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;tldr&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tldr&quot;&gt;&lt;/a&gt;要約&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusにとってパフォーマンスは重要ですが、公開されていたパフォーマンスに関するグラフィックは古く、重要な情報（私たちが素晴らしいスループットを持っているという事実など）が欠けていました。これを解決するために、私たちは透明性があり、再現可能で、パフォーマンスの全体像を測定する新しいベンチマークを作成しました。私たちの実験では、QuarkusはSpring Bootよりも1秒あたり2.7倍多くのトランザクションを処理でき、2.3倍速く起動し、メモリは半分しか消費しません。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-start-of-the-story&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-start-of-the-story&quot;&gt;&lt;/a&gt;物語の始まり&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;もし &lt;a href=&quot;https://quarkusio&quot;&gt;quarkus.io&lt;/a&gt; サイトを訪れたことがあるなら（もちろん、ここにいるのだから訪れたことはあるでしょう）、フロントページの下部にあるパフォーマンスチャートに気づいたかもしれません。Quarkusチームは私たちのパフォーマンスを誇りに思っています。なぜなら、良いパフォーマンスは高いスケーラビリティ、低レイテンシー、低リソース使用量、低コスト、そしてより良い持続可能性を意味するからです。基本的には、パフォーマンスが重要です。以前に示していたのは次のとおりです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/new-benchmarks/old-benchmark-light.png&quot; alt=&quot;The previous performance graphic&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;しかし、パフォーマンスの重要性にもかかわらず、私たちのパフォーマンスチャートにはいくつかの問題がありました。第一に、数字が古いです。どれくらい古いか？それは、チャートに日付がないため、判断が難しいです。実際、その数字がどのように測定されたかについての情報は一切なく、ベンチマークのソースコードへのリンクもありません。これは、誰も再現できないことを意味し、誰も検証できないことを意味します。再現できなければ、信頼できません。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なぜベンチマークのソースコードにリンクしなかったのでしょうか？歴史的に、私たちは比較対象について意図的に曖昧にしてきました（マナーの問題！）。ソースコードを共有すれば、他のフレームワークが何であるかが完全に明らかになっていたでしょう。ベンチマークのソース共有を妨げるだけでなく、他のフレームワークを匿名化することにはそれ自体の問題がありました。フレームワーク名を共有しないことは丁寧ですが、読者に情報に基づいたフレームワークの選択をするための有用な情報を提供しないことになります。Quarkusの方が優れているのか？ああ、はい、間違いなく。何よりも優れているのか？シーッ、それは秘密です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But there&amp;#8217;s an even bigger problem with our old graphics, in my view. We show Quarkus starts fast, and we show it has a small footprint.
We do not show anything about throughput. There&amp;#8217;s a classic performance tradeoff between throughput and memory footprint or startup time.
It&amp;#8217;s easy for people looking at the charts to assume that if Quarkus doesn&amp;#8217;t show its throughput figures, they must be terrible, right?
Wrong! For Quarkus, &lt;em&gt;there is no trade-off&lt;/em&gt;. Quarkus is more efficient than alternatives across the board. (Want to know where a trade-off strikes back? &lt;a href=&quot;#native-tradeoffs&quot;&gt;Read on&lt;/a&gt;.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;しかし、Quarkusのスループットが悪いという誤解はあちこちで発生しています。外部のブログで何度も出てきますし、お気に入りのAIサービスにQuarkusの利点について尋ねても、スループットに言及する可能性は低いです。その代わりに、起動時間やメモリに焦点を当てるでしょう。それらも重要ですが、スループットも同様に重要です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私たちのチャートには、Quarkusに関する誤解の一因となっている、もう一つのより微妙な省略があります。私たちはQuarkusのネイティブモードでのパフォーマンスを示していますが、他のフレームワークのネイティブモードでのパフォーマンスは示していません。一部の人々は、これがQuarkusはネイティブモードがすべてであり、Quarkusを使用するならネイティブモードを使用すべきだと解釈します。Quarkusをネイティブモードで、他のフレームワークをJVMモードで比較するブログをよく見かけますが、これは単に愚かです。QuarkusをJVMモードで使う場合は他のフレームワークをJVMモードで使う場合と比較すべきであり、Quarkusをネイティブモードで使う場合は他のフレームワークをネイティブモードで使う場合と比較すべきです。Quarkusはネイティブモードに非常に優れていますが、ネイティブモードを使用するかどうかは、どのフレームワークを選択するかとは直交する選択肢です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Because of all these problems, several members of the Quarkus community have ended up rolling their own benchmarks to use in conference talks, or for demos.
I&amp;#8217;ve done it myself, in fact. Having members of the same team re-doing similar work is wasteful. What&amp;#8217;s more, benchmarking is hard!
Getting numbers is trivially easy, but getting numbers which are actually measuring what you think you&amp;#8217;re measuring is hard.
Doing it really really right needs the sorts of skills performance specialists have.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;ok-so-we-definitely-needed-a-new-benchmark&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ok-so-we-definitely-needed-a-new-benchmark&quot;&gt;&lt;/a&gt;よし、だから私たちは間違いなく新しいベンチマークが必要でした&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;何かをする必要がありました。幸いなことに、私の同僚であるEric Deandreaは、この正確な問題に数年間取り組んでいました。Ericは、以前John O&amp;#8217;Haraが作成したベンチマークに基づいて、制御された条件下でパフォーマンスラボで測定を実行できる一連の自動化を構築していました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ericと私は &lt;a href=&quot;https://github.com/quarkusio/spring-quarkus-perf-comparison&quot;&gt;新しいリポジトリ&lt;/a&gt; を立ち上げ、Ericのベンチマークコードをそこに移動させ、自動化を改良して、結果をラボのファイアウォールを越えてデータストアとして機能する &lt;a href=&quot;https://github.com/quarkusio/benchmarks&quot;&gt;別のリポジトリ&lt;/a&gt; にプッシュするようにしました。私たちは数値を取得し、( &lt;a href=&quot;https://quarkus.io/extensions/io.quarkiverse.batik/quarkus-batik/&quot;&gt;Apache Batik&lt;/a&gt; を使用した少しの作業の後) 図も手に入れました！Quarkusのスループットがいかに素晴らしいかに注目してください。Quarkusは、Spring Bootと比較して、1秒あたり2.7倍（19255対7238 tps）多くのトランザクションを処理でき、起動も2.3倍（2.919秒対6.569秒）高速であり、すべて半分のメモリ（583MBではなく269MB）で実現します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://quarkus.io/benchmarks/spring-quarkus-perf-comparison/2026-02-05_12-30-36/metrics-ootb-composite-for-main-comparison-dark.svg&quot; alt=&quot;A chart showing Quarkus throughput&quot; width=&quot;as compared to Spring Boot&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ここからが本当の作業の始まりでした。ベンチマークがオープンソース化されたことで、以前にはなかった方法で厳密な精査にさらされるようになりました。（もちろん、これがオープンソースの魔法の一部です。）Quarkusのパフォーマンス専門家の一人であるFrancesco Nigroは、測定をより堅牢にできるいくつかの領域を発見しました。例えば、私たちのセットアップでは、cgroupsとcpusetを使用してプロセスを特定のCPUコアに固定していました。これは正しいアプローチですが、テスト対象のアプリケーションと負荷ジェネレーターの両方が同じcgroupに集まり、同じコアを奪い合っていました。負荷ジェネレーターが16スレッドを使用するように設定されていたため、これが測定にかなりのノイズをもたらしました。 &lt;a href=&quot;https://github.com/quarkusio/spring-quarkus-perf-comparison/issues/55&quot;&gt;個別のコア割り当て&lt;/a&gt; に切り替えることでこれは解決しましたが、データベースが専用のコアを持たないことや、誤ってホスト上のすべてのプロセスに影響を与えていたキャッシュドロップのステップなど、他の干渉源は残っていました。適切な分離が確立されると、スループットの結果は微妙に変化しました。修正前は、負荷が低いことで他のプロセスにより多くの余裕が生まれていたため、遅いフレームワークも競争力があるように見えました。彼らは、自分たちが引き起こす競合が少ないという点で過大評価されていたのです。上記のチャートは、改善されたセットアップを反映しています。これこそが、ベンチマークにはスキルが必要だと私が先に言ったことです。これらの間違いは簡単に起こり、検出が微妙なのです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;しかし、最も大きな助けはQuarkusコミュニティの外から来ました。ベンチマークの意図は、通常のユーザーの体験を再現することであり、各フレームワークを極限までチューニングすることではありませんでした。（そのためには &lt;a href=&quot;https://www.techempower.com/benchmarks/#section=data-r23&quot;&gt;TechEmpower&lt;/a&gt; があります。）「初期設定（out of the box）」のパフォーマンスを測定することが最善の道だと考えました。その理由の一つは、ほとんどの人がデフォルトで経験するパフォーマンスだからであり、もう一つはそれが最も公平だったからです。公平性は重要な目標でした。そうでなければ、比較する意味がありません。私たちのチームはQuarkusアプリケーションを非常に鋭いパフォーマンスにチューニングするスキルを持っていますが、私たちのほとんどはSpringに対して同じスキルを持っていません。それは私たちの職務記述書にはないのです。QuarkusだけをチューニングしてSpringをチューニングしないのは明らかに公平 &lt;em&gt;ではない&lt;/em&gt; でしょう。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;しかし、最初の結果を公開し始めてから、Spring Boot を日常的に使用している人々から連絡がありました。彼らは、&lt;a href=&quot;https://github.com/quarkusio/spring-quarkus-perf-comparison/issues/108&quot;&gt;両フレームワークが open-session-in-view 設定と接続プールサイズの処理において違いがある&lt;/a&gt; と指摘しました。これらの違いは十分に大きく、初期設定の動作を比較することが、実際に &lt;em&gt;最も公平な選択肢であったか&lt;/em&gt; どうかを評価し始めました。open-session-in-view 設定と N+1 問題の修正は数値に大きな違いをもたらしませんでしたが、接続プールサイズの調整は違いをもたらしました。デフォルト設定では、Spring アプリケーションは深刻な接続エラーに悩まされていました。クライアントが接続できない場合、スループットはゼロになるため、エラーがスループットを低下させていました。Eric、Francesco、Sanne Grinovero は、Spring アプリケーションがエラーなしで負荷を処理できるように、ログを詳細に調査し、プロファイリングを行って設定の微調整を見つけ出すために多くの時間を費やしました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私たちのSpringの友人たちは、このような調整は完全に標準的なものだと教えてくれました。私たちは依然として初期設定のパフォーマンスを測定したいと考えていたため、妥協案に落ち着きました。初期設定バージョンと、軽くチューニングされたバージョンの両方を測定しました。フロントページに表示しているグラフィックでは、チューニングされたバージョンを表示しています。以下に、同じコードレベルとスクリプトを使用した、上記の初期設定の結果に相当するチューニング版を示します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://quarkus.io/benchmarks/spring-quarkus-perf-comparison/2026-02-16_17-11-38/metrics-tuned-composite-for-main-comparison-dark.svg&quot; alt=&quot;A chart showing Quarkus throughput&quot; width=&quot;time to first response&quot; height=&quot;and memory footprint&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;チューニングの効果は、全体的にかなり控えめだったことがわかります。また、スループットとメモリフットプリントの間には多少のトレードオフがあったことにも注目してください。どちらのフレームワークでも、チューニングによる最適化は、速度向上のために一部のメモリを犠牲にすることになりました。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;guiding-principles&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#guiding-principles&quot;&gt;&lt;/a&gt;基本原則&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;チューニングの問題をどのように扱うかを決めようとする中で、私たちはこの取り組み全体の基本原則に立ち返ることになりました。それらは次のとおりです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;parity&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#parity&quot;&gt;&lt;/a&gt;同等性&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Spring版とQuarkus版のアプリケーションのコードは、同じ機能を実行するために可能な限り同等であるべきです。これは、ドメインモデルが同一であり、基盤となる永続化メカニズムが同一であるべきであることを意味します（私たちのケースでは、Hibernateを使用するJPA）。パフォーマンスの違いは、フレームワーク自体のアーキテクチャの違いとライブラリ統合の最適化から生じるべきです。アプリケーションのアーキテクチャを変更する変更（つまり、ブロッキングをリアクティブに移行する、仮想スレッドを使用するなど）が行われる場合、これらの変更はアプリケーションのすべてのバージョンに適用されるべきです。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;normal-ness&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#normal-ness&quot;&gt;&lt;/a&gt;標準性&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;パフォーマンスの最後のひとひねりまで絞り出すことよりも、現実性が重要です。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;high-quality&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#high-quality&quot;&gt;&lt;/a&gt;高い品質&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションはベストプラクティスをモデル化する必要があります。アプリケーションが典型的な使い方を表すことを望んでいますが、それをコピーする人が「間違った」または悪いコードをコピーするべきではありません。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;testing-the-framework-not-the-infrastructure&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#testing-the-framework-not-the-infrastructure&quot;&gt;&lt;/a&gt;インフラではなくフレームワークのテスト&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;測定は、データベースのようなサポートインフラストラクチャではなく、フレームワークのパフォーマンスを測定するものであるべきです。実際には、これは実験セットアップがCPUバウンドであることを意味します。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;exploring-our-performance&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#exploring-our-performance&quot;&gt;&lt;/a&gt;パフォーマンスの探求&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;この作業の素晴らしい点の一つは、「Quarkusには素晴らしいパフォーマンスがあるのか？」という問いを超えて、パフォーマンスに関する様々な疑問を探求できるようになったことです。例えば、仮想スレッドで実行すると結果に影響があるでしょうか？はい！すべてのフレームワークで、仮想スレッドは約6,000トランザクション/秒を追加しました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://quarkus.io/benchmarks/spring-quarkus-perf-comparison/2026-02-16_17-11-38/metrics-tuned-throughput-for-virtual-threads-dark.svg&quot; alt=&quot;A chart showing Quarkus throughput with and without virtual threads&quot; width=&quot;as compared to Spring Boot&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;そして、他にも疑問がありました。Spring Boot 3とSpring Boot 4の間でパフォーマンスに違いはあったのでしょうか？いくつかの点で改善され、いくつかの点で悪化したことが判明しました。Spring 4はSpring 3よりも高いスループットを提供しますが、最初の応答までの時間が遅くなり、メモリフットプリントも増加するという犠牲を伴います。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://quarkus.io/benchmarks/spring-quarkus-perf-comparison/2026-02-16_17-11-38/metrics-tuned-composite-for-java-and-native-frameworks-dark.svg&quot; alt=&quot;A chart showing Quarkus throughput&quot; width=&quot;as compared to Spring Boot 3 and 4&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusの新しい &lt;a href=&quot;/guides/aot&quot;&gt;AOTパッケージング&lt;/a&gt; は起動時間にどのような影響を与えるでしょうか？（これについてはまだ作業中ですが、その答えを見るのが楽しみです。）&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;native-tradeoffs&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#native-tradeoffs&quot;&gt;&lt;/a&gt;スループットと起動時間のトレードオフ、再訪&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusでは、起動時間とパフォーマンスの間にトレードオフがないと述べました。他のフレームワークと比較した場合、これは確かに真実です。ビルド時の原則のようなQuarkusの内部効率は、起動時間 &lt;em&gt;と&lt;/em&gt; スループットの両方を改善します。しかし、JVM上のQuarkusをネイティブのQuarkusと比較すると、トレードオフが再び現れます！GraalVMを使用してQuarkusアプリケーションをネイティブにコンパイルすると、Quarkusは電球よりも速く起動し、非常に小さなメモリフットプリントを持っています。しかし、スループットのペナルティ &lt;em&gt;はあります&lt;/em&gt; 。ネイティブにするとスループットは半分になります。（Spring Bootの場合、ネイティブのペナルティは同様です。）ほとんどのアプリケーションにとって、このトレードオフは価値がありません。特に、より長いビルド時間やネイティブの追加の制約と組み合わせるとそうです。しかし、時にはトレードオフに価値がある場合もあります。アプリケーションが非常に頻繁に起動および停止される場合や、非常に低いワークロードの場合は、ネイティブを使用してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;want-to-try-the-benchmarks-at-home&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#want-to-try-the-benchmarks-at-home&quot;&gt;&lt;/a&gt;自宅でベンチマークを試してみたいですか？&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;可能です！すべてのソースコードとスクリプトは &lt;a href=&quot;https://github.com/quarkusio/spring-quarkus-perf-comparison&quot; class=&quot;bare&quot;&gt;https://github.com/quarkusio/spring-quarkus-perf-comparison&lt;/a&gt; で利用できます。誰もが簡単に再現できることは、ベンチマークを設計する上で重要な基本原則でしたが、少々複雑になります。パフォーマンスの世界では、「厳密」と「簡単」は同じ文脈では使用されません。難しいことを常にアクセスしやすくしたい私としては、これは &lt;em&gt;本当に&lt;/em&gt; 歯がゆいです。結局、私たちは妥協点に落ち着きました。もし手元にパフォーマンスラボがあるなら、もちろん理想的です。すべてのスクリプトが自分のハードウェアでジョブを実行できるように利用可能です。そのようなセットアップがなくても、Linuxマシンがある場合は、私たちが使用する専門家が承認したスクリプトを使用できます。内部的には、それらはオーケストレーションに &lt;a href=&quot;https://github.com/Hyperfoil/qDup&quot;&gt;qDup&lt;/a&gt; のようなツールを使用し、協調的な省略のリスクなしに負荷を駆動し、プロセスの分離を確実にするために &lt;a href=&quot;https://hyperfoil.io/&quot;&gt;Hyperfoil&lt;/a&gt; を使用しています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;しかし、 &lt;em&gt;本当に&lt;/em&gt; 簡単なものが欲しい場合はどうでしょう？この時点から、物事は難しくなります。私たちは、シンプルさを追求したスクリプトの第2バージョンを作成しました。これらは馴染みのあるツールのみを使用し、プロセス分離は試みません。そのため、MacとLinuxの両方、そして適切なターミナルがあればWindowsでも実行できます。ただし、結果は注意して扱う必要があります。ラップトップの電源管理はあらゆる種類の奇妙な影響を引き起こす可能性があり、負荷が多すぎたり少なすぎたりすると、QuarkusやSpringとは関係のないボトルネックを測定してしまう可能性があります。最も一般的な問題を回避する方法や、測定しているものが自分が考えているものかどうかを判断する方法について、別のブログ（または6つ！）を計画しています。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/new-benchmarks/
            </guid>
            
            
            
            <author>Holly Cummins (https://twitter.com/holly_cummins)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.32 - Project Leyden の統合、より優雅なシャットダウン、自動 Consul 登録など！</title>
            <link>
                https://quarkus.io/blog/quarkus-3-32-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.32 のリリースをお知らせいたします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これは重要なマイルストーンです。3.32 は、次期 LTS リリースである Quarkus 3.33 LTS の機能凍結を示します。今後の LTS は 3.32 ラインから分岐され、このリリースが 3.33 LTS が構築される基盤となります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.32 は、いくつかの重要な改善点と新機能も提供します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/52376&quot;&gt;#52376&lt;/a&gt; および &lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/52224&quot;&gt;#52224&lt;/a&gt; - Project Leyden の統合&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/50975&quot;&gt;#50975&lt;/a&gt; - HTTP に関してより優雅になるよう、優雅なシャットダウンを再構築&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/47997&quot;&gt;#47997&lt;/a&gt; - Quarkus アプリケーションの自動 Consul 登録&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/52090&quot;&gt;#52090&lt;/a&gt; - OIDC: カスタム DPoP ノンスプロバイダーのサポート&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/52353&quot;&gt;#52353&lt;/a&gt; - OIDC: リッチ認可リクエストの基本的なサポートを追加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/52175&quot;&gt;#52175&lt;/a&gt; - 組み込みの認証メカニズムの順序をカスタマイズ可能にする&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/52537&quot;&gt;#52537&lt;/a&gt; - OIDC AuthenticationCompletionAction の導入&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/52380&quot;&gt;#52380&lt;/a&gt; - Google Cloud Function フレームワーク 2.0 へのアップグレード&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;早急に 3.32 にアップグレードすることを強くお勧めします。これにより、フィードバックを収集し、今後の 3.33 LTS が可能な限り安定していることを確認できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;現在 3.27 LTS を実行している場合は、今が 3.33 LTS へのアップグレードパスを検証するのに最適な時期です。問題が発生した場合はお知らせください。この段階でのフィードバックは特に貴重です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.32 に更新するには、Quarkus CLI の最新バージョンに更新し、以下を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なお、&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.32 へアプリケーションを更新できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整に関する詳細は、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.32&quot;&gt;Quarkus 3.32 移行ガイド&lt;/a&gt;を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;whats-new&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-new&quot;&gt;&lt;/a&gt;変更点&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;project-leyden-integration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-leyden-integration&quot;&gt;&lt;/a&gt;Project Leyden の統合&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Project Leyden は、Ahead-of-Time (AOT) コンパイルを JVM にもたらします。トレーニング実行中にクラスロード、クラスリンク、およびメソッドプロファイリングを記録することで、JVM が後続の実行に使用できる AOT キャッシュファイルを生成できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;その結果、制約や欠点がほとんどなく、JVM の起動時間が大幅に改善されます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Project Leyden は OpenJDK 25 (LTS リリースのみをカウント) から利用可能です。近日中に専用のブログ記事で詳細を説明します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus では、Project Leyden AOT を統合しました。これにより、&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;トレーニング実行は、ビルド時 (最小限のトレーニング) にトリガーすることも、統合テストを通じてトリガーすることもできます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;生成された AOT キャッシュファイルは、コンテナーイメージに直接含めることができます。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;改善はネイティブ実行可能ファイルほど実質的ではなく、AOT キャッシュファイルのためにコンテナーイメージサイズが若干大きくなりますが、必要とされる労力が最小限であることを考えると、その結果は印象的です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;quarkus create app で作成された最小限の REST アプリケーションは、起動時間が&lt;strong&gt;370 ミリ秒&lt;/strong&gt;から&lt;strong&gt;80 ミリ秒&lt;/strong&gt;に短縮されました。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;9,000 クラスを持つ大規模な REST CRUD アプリケーションは、&lt;strong&gt;3 秒&lt;/strong&gt;から &lt;strong&gt;900 ミリ秒&lt;/strong&gt;になります。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;詳細については、 &lt;a href=&quot;https://quarkus.io/guides/aot&quot;&gt;Quarkus AOT ガイド&lt;/a&gt;を参照してください。近日公開のブログ記事で、詳細なチュートリアルを共有します。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;graceful-shutdown&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#graceful-shutdown&quot;&gt;&lt;/a&gt;優雅なシャットダウン&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Keycloak チームの作業により、HTTP の優雅なシャットダウンにいくつかの改善が加えられました。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;stork&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stork&quot;&gt;&lt;/a&gt;Stork&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus アプリケーションは、Stork エクステンション を使用して Consul に自動的に登録できるようになりました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;この新機能は、 &lt;a href=&quot;https://quarkus.io/guides/stork-registration&quot;&gt;Quarkus 用 SmallRye Stork による自動サービス登録&lt;/a&gt;ガイドで詳しく説明されています。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;security&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#security&quot;&gt;&lt;/a&gt;セキュリティー&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;いつものように、このバージョンには新しいセキュリティ機能と機能強化が含まれています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/52090&quot;&gt;#52090&lt;/a&gt; - OIDC: カスタム DPoP ノンスプロバイダーのサポート&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/52353&quot;&gt;#52353&lt;/a&gt; - OIDC: リッチ認可リクエストの基本的なサポートを追加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/52175&quot;&gt;#52175&lt;/a&gt; - 組み込みの認証メカニズムの順序をカスタマイズ可能にする&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/52537&quot;&gt;#52537&lt;/a&gt; - OIDC AuthenticationCompletionAction の導入&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;google-cloud-function&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#google-cloud-function&quot;&gt;&lt;/a&gt;Google Cloud Function&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Google Cloud Function フレームワークが 2.0 に更新されました。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;platform-updates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#platform-updates&quot;&gt;&lt;/a&gt;プラットフォームの更新&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Camel Quarkus を Camel Quarkus 3.32 に更新しました。
詳細については、 &lt;a href=&quot;https://camel.apache.org/blog/2026/02/camel-quarkus-3.32.0/&quot;&gt;発表&lt;/a&gt;を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus CXF も 3.32 に更新されました。
以前の Quarkus の発表に 3.31.1 のリリースノートを含めるのを忘れていたため、両方のリリースノートを読むことができます:
 &lt;a href=&quot;https://docs.quarkiverse.io/quarkus-cxf/dev/release-notes/3.31.1.html&quot;&gt;3.31.1&lt;/a&gt;および
 &lt;a href=&quot;https://docs.quarkiverse.io/quarkus-cxf/dev/release-notes/3.32.0.html&quot;&gt;3.32.0&lt;/a&gt;。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.32.0.CR1&quot;&gt;3.32.0.CR1&lt;/a&gt;、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.32.0&quot;&gt;3.32.0&lt;/a&gt;、および &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.32.1&quot;&gt;3.32.1&lt;/a&gt; の完全な変更履歴は GitHub で確認できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot;&gt;&lt;/a&gt;コントリビューター&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus コミュニティは成長しており、現在 &lt;a href=&quot;https://github.com/quarkusio/quarkus/graphs/contributors&quot;&gt;1163 名の貢献者&lt;/a&gt; がいます。皆様に心より感謝申し上げます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;特に 3.32 リリースに関しては、Ales Justin、Alexander Schwartz、Alexandre Dutra、Alexey Loubyansky、andreatp、Asger Askov Blekinge、Aurea Munoz、Aurélien Pupier、azerr、Bruno Baptista、Carles Arnal、cfitzw、Chris Laprun、Clement Escoffier、Daniel Vergien、David M. Lloyd、Dennis Kniep、Erwin Oegema、Foivos Zakkak、Fouad Almalki、Frank Eichfelder、George Gastaldi、Georgios Andrianakis、Guillaume Smet、Holly Cummins、Jakub Jedlicka、James Netherton、Jerome Prinet、Jiri Ondrusek、jtama、Julien Ponge、Karm Michal Babacek、Katia Aresti、Kristian Rickert、Ladislav Thon、lberrymage、lloydmeta、Loïc Mathieu、Marc Nuri、Marco Belladelli、marco sappe griot、mariofusco、marko-bekhta、Martin Kouba、Martin Panzer、Matej Novotny、Matheus Cruz、melloware、Michael Edgar、Michal Vavřík、Nejc Tomažič、Nicola Concetti、Olivier V、osoohynn、Ozan Gunalp、Patrick Schaub、Peter Levart、Peter Palaga、Phillip Krüger、Robert Stupp、Robert Toyonaga、Roberto Cortez、Sanne Grinovero、Sergey Beryozkin、shjones、sNiXx、Steve Hawkins、Stéphane Épardaud、Teymur Babayev、Victor Dalosto、Vincent Sevel、vincent-duluth、xstefank、および Yoann Rodière に感謝いたします。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-32-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Project Leyden がもたらした新しい視点</title>
            <link>
                https://quarkus.io/blog/leyden-1/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これは Project Leyden にまつわる物語です。そして、これは Project Leyden だけの物語ではありません。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これは、Project Leyden が Quarkus、そしてより広くは Java 全体における起動パフォーマンスの考え方に、いかに新しい視点を与えてくれたかという物語です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これは、フレームグラフが登場する物語でもあります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これこそ、最高の物語だと思いませんか？&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;acknowledgments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgments&quot;&gt;&lt;/a&gt;謝辞&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私はこの道のりを、親愛なる同僚である Georgios Andrianakis と共に歩みました。彼はこのプロジェクトを実現する上で極めて重要な役割を果たしました。これこそまさに、誰かと共有したくなるような素晴らしい道のりでした。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-the-story-started&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-the-story-started&quot;&gt;&lt;/a&gt;物語の始まり&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;すべては、Quarkus の起動パフォーマンスを改善するのが非常に難しくなってきたと、私が何度もぼやいたことから始まりました。起動プロセスはクラスロードのノイズで埋め尽くされていました。つまり、起動時のプロファイルを確認するたびに、何か怪しい部分をクリックしては次のように気づくことの繰り返しだったのです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;「ああ、これはただ初めてクラスをロードしているだけか&amp;#8230;&amp;#8203; がっかりだ」&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私は忍耐強い人間です。しかし、1 日にマウスをクリックできる回数には限りがあります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;そんなある日、シャワーを浴びているときに、あるアイデアが浮かびました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;「Project Leyden は、他の機能とともにクラスロードの問題も改善してくれるはずではないか？」&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Project Leyden を使ってクラスロードのノイズを取り除けば、起動中に実際に何が起きているのかをより明確に把握できるのではないかと考えたのです。&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;結局のところ、これはかなり奥の深い話になりました。Project Leyden は期待を大きく上回る結果をもたらし、最終的に Georgios と協力して Quarkus に密接に統合することになりました (別のブログ投稿が続くことが予想できますよね？)。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;しかし今日は、皆さんが楽しみにしているフレームグラフをお約束しました。さあ、本題に入りましょう！&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;changing-the-perspective&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#changing-the-perspective&quot;&gt;&lt;/a&gt;視点の転換&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これについては今後のブログ投稿で詳しく説明しますが、現時点では、Project Leyden がクラスをロードおよびリンクされた状態でキャッシュし、メソッドのプロファイリング情報や、将来的にはコンパイル済みコードなどの追加メタデータも保持できることを知っておけば十分です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;実際には、Project Leyden はクラスのロードやリンクといったコストのかかる作業を専用のトレーニングフェーズに移行させることで、Java の起動パフォーマンスを向上させます。この状態を事前にキャプチャしておくことで、アプリケーションは通常実行時に行われる冗長なセットアップの多くをスキップできます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;言い換えれば、すべてが適切に記録されていれば、クラスロードを起動パスからほぼ完全に排除できるのです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;すると突然、未知の領域に足を踏み入れることになります。シンプルな &lt;code&gt;quarkus create app&lt;/code&gt; で作成した Quarkus REST アプリケーションが 130 ミリ秒で起動するのです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これだけでも十分に素晴らしいですよね？しかし、さらに興味深いのは、私たちがそれ以上の成果を上げることができた点です (次のブログ投稿でお会いしましょう、覚えていますよね？)。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ここで視点が大きく変わります。約 100 ミリ秒で起動する場合、節約する十数ミリ秒のすべてが意味のある改善になります。もはや 5 ミリ秒のコストを無視することはできません。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;誰かが叫んでいるのが聞こえます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;「言葉はいいから！フレームグラフを見せてくれ！」&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;わかりました、わかりました。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-can-we-improve-as-an-ecosystem&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-can-we-improve-as-an-ecosystem&quot;&gt;&lt;/a&gt;エコシステム全体としてどのように改善できるか&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;始める前に、非常に重要な注意点があります。 &lt;strong&gt;ここで特定のライブラリーやフレームワークを批判するつもりはありません&lt;/strong&gt;。Quarkus 自体にも簡単に改善できる点が見つかりました。 &lt;strong&gt;私たちは皆、同じ船に乗っているのです&lt;/strong&gt;。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このブログ投稿の目的は、Project Leyden が、あまりにも長い間隠されていたものを明らかにするのにいかに役立ったかを示すことです。そして、これが他のライブラリーやフレームワークの作者にいくつかの有益なアイデアを提供し、最終的に Java エコシステム全体の改善につながることを願っています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;最悪の場合でも、少なくともフレームグラフは見られますからね \o/。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;compatibility-layers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#compatibility-layers&quot;&gt;&lt;/a&gt;互換性レイヤー&lt;/h3&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/leyden-1/flamegraph-compatibility-layer.png&quot; alt=&quot;Netty trying to determine whether virtual threads are available&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 1. 仮想スレッドが利用可能か判断しようとする Netty&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;多くのライブラリーには、複数の JDK バージョンをサポートするための互換性レイヤーが含まれています。通常、これらは仮想スレッドなどの機能が利用可能かどうかを判断するためにリフレクションに依存しています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus エコシステムでは、Netty や Vert.x などの低レベルライブラリーでこれが一般的です。しかし実際には、このパターンはいたるところで見られます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これを避けるべきです。これにはコストがかかり、そのコストはこれらのライブラリーを使用するすべてのアプリケーションの &lt;strong&gt;起動のたびに&lt;/strong&gt; 支払われます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;マルチリリース JAR も完璧ではありません。メンテナンスが難しく、テストも難しく、IDE で常に十分にサポートされているわけでもありません。しかし、この問題は解決してくれます。そして、ライブラリーやフレームワークの作者として、コストをアプリケーションの起動時ではなく、ビルド時に一度だけ支払うようにするのは私たちの責任であると私は主張します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Georgios とともに、アプリケーションが特定の機能をサポートする Java バージョンをターゲットにしている場合に、これらのライブラリーの一部のバイトコードをビルド時に書き換え、リフレクション呼び出しを削除して直接呼び出しに置き換える実験を行うことにしました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これは少しハック的であり、長期的にメンテナンスしたいものではありませんが、アイデアを検証し、迅速に成果を上げるための素晴らしい方法でした。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;reading-annotations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reading-annotations&quot;&gt;&lt;/a&gt;アノテーションの読み込み&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これは私たちにとって新しいことではありません。そもそも Quarkus を作成した理由の 1 つは、実行時のアノテーションの読み込みを避けることでした。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ほとんどのユースケースでは、ビルド時にアノテーションを処理し、必要なバイトコードを生成できるため、実行時に検査する必要はありません。私たちのアノテーションインデクサーである Jandex は、このための素晴らしいツールであり、Quarkus で広く使用されています。しかし&amp;#8230;&amp;#8203; Quarkus でさえ、実行時にアノテーションが読み込まれるケースがまだ存在します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なぜアノテーションの読み込みはこれほどコストがかかるのでしょうか？それは、アノテーションの解析にコストがかかるからです。これは実行時に初めてアクセスを試みたときに発生し、JDK はアノテーションの値を公開するためのプロキシインスタンスを作成します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;netty-and-marker-annotations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#netty-and-marker-annotations&quot;&gt;&lt;/a&gt;Netty とマーカーアノテーション&lt;/h4&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/leyden-1/flamegraph-marker-annotation.png&quot; alt=&quot;Netty trying to determine if a ChannelHandler is sharable&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 2. &lt;code&gt;ChannelHandler&lt;/code&gt; が共有可能かどうかを判断しようとする Netty&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Netty のケースは、インターフェースの実装の機能を判断するためにアノテーションを読み込んでいるため、特に興味深いものです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このようなユースケースには、アノテーションの代わりにマーカーインターフェースまたはメソッドを使用することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Georgios は再びバイトコードの書き換えを利用して、アノテーションのルックアップを排除しました。これもまた、長期的にメンテナンスしたいものではありません。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;hibernate-orm&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hibernate-orm&quot;&gt;&lt;/a&gt;Hibernate ORM&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hibernate ORM もこの文脈において非常に興味深いものです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;最初の重要な点は、Quarkus における Hibernate ORM では、依然として実行時にメタデータを構築しているということです。つまり、実行時に多くのアノテーションを読み込むことになります。この状況を改善するための長期的な取り組みはすでに始まっていますが、これは大規模なプロジェクトであり、メタデータの構築をビルド時に移行できるようになるまでには時間がかかります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;それはひとまず置いておきましょう。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;また興味深いのは、Hibernate ORM が実行時に、Hibernate 独自のアノテーションと JPA アノテーションの両方について、自身のメタデータを収集している点です。これは膨大な量のアノテーションであり、処理すべきメタデータも大量にあります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/leyden-1/flamegraph-hibernate-annotations.png&quot; alt=&quot;Hibernate ORM collecting metadata about its own annotations&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 3. 自身のアノテーションに関するメタデータを収集する Hibernate ORM&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;たとえば、JPA または Hibernate の各アノテーションに対して、アノテーションのターゲット (クラス、メソッド、フィールド) や、それが継承されているかどうかを判断します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;結局のところ、めったに変更されないものに対して、かなりの量のアノテーション処理が行われていることになります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私は少し前にこの問題を特定し、Hibernate チームの同僚である Luca Molteni が近いうちに調査する予定です。修正がどれほど容易かはまだわかりませんが、要旨は理解していただけるでしょう。可能な限り、この種のメタデータは一度だけで完全に解決されるべきです。そして、テストによってその正確さを強制し、正確で最新の状態を維持できるようにすべきです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;近いうちにこれを改善できることを願っています。そして、ここでの改善は Quarkus アプリケーションだけでなく、Hibernate ORM を使用するすべてのアプリケーションに利益をもたらすという点が素晴らしいところです。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-new-cost-of-loading&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-new-cost-of-loading&quot;&gt;&lt;/a&gt;ロードにかかる新たなコスト&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Leyden を使用しない場合、膨大な数のクラスをロードすることになります。
JAR ファイルはどうせ開かれるので、それは &lt;em&gt;&quot;fine&quot;&lt;/em&gt; とされます。
まあ、何をもって &lt;em&gt;&quot;fine&quot;&lt;/em&gt; とするかによりますが。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Leyden を使用すると、起動時にクラスがまったくロードされないというレベルにまで到達できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;つまり、クラスパスから何かをロードしようとする試みはすべて、JAR ファイルを開き (最初にアクセスされたとき)、ディスクから読み取る動作をトリガーすることになります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;そして、いくつかのリソースがクラスパスからロードされることは間違いありません。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JDK や多くのライブラリー、フレームワークがインターフェースの実装を見つけるために使用する &lt;code&gt;ServiceLoader&lt;/code&gt; のサービスファイル (&lt;code&gt;META-INF/services/&lt;/code&gt; 内のもの)。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;設定ファイル。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;そして、おそらく他にも多くのものがあります。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;non-existing-classes-and-resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#non-existing-classes-and-resources&quot;&gt;&lt;/a&gt;存在しないクラスとリソース&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なぜ存在しないクラスをロードしようとするのでしょうか？それは良い質問です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/leyden-1/flamegraph-packageinfo.png&quot; alt=&quot;Hibernate ORM trying to load non-existing package-info&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 4. 存在しない &lt;code&gt;package-info&lt;/code&gt; をロードしようとする Hibernate ORM&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;package-info.java&lt;/code&gt; ファイルを覚えていますか？たとえば Hibernate ORM は、パッケージレベルのアノテーションを検査するためにこれらをロードしようとします。多くの場合、これらのファイルは存在しませんが、それは完全に正常なことです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;クラスロードのキャッシュは Leyden のスコープ内ですが、Leyden はネガティブキャッシュ (存在しないことのキャッシュ) は行いません。なぜでしょうか？Leyden は AOT (事前コンパイル) ですが、依然として真の Java だからです。Java は動的な言語です。キャッシュを記録したときにクラスが存在しなかったとしても、後で追加されるかもしれません。実際には、特に「閉じた世界 (closed world)」を前提とする Quarkus ではそうではないことが多いのですが、Leyden はその前提に頼ることはできません。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus で Leyden を使用する場合、エンティティを含むすべてのパッケージに対して、まだ存在しない場合に空の &lt;code&gt;package-info&lt;/code&gt; クラスを生成することにしました。これにより、Hibernate ORM は存在しないクラスをロードしようとする必要がなくなります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/leyden-1/flamegraph-non-existing-class.png&quot; alt=&quot;JBoss Logging loading a non-existing class&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 5. 存在しないクラスをロードする JBoss Logging&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;別の例は JBoss Logging の国際化です。現在のロケールのクラスをロードしようとし、そのクラスが存在しない場合はデフォルトのクラスにフォールバックします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;リソースでも同様のパターンが見られます。アプリケーションが存在しない設定ファイルやサービス記述子をロードしようとすることがあります。それは完全に正常であり、欠落していることを知る唯一の方法は試してみることです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus では、これを軽減するためのクラスローダーのトリックをいくつか持っています。しかし、一般的なケースでは、それに対処する必要があります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ここに落とし穴があります。これらすべてのケースで、ランタイムはクラスパス全体を走査し (何も見つからないことを思い出してください)、クラスやリソースを特定しようとします。その際、クラスやリソースが存在しないという結論を出すためだけに、大量の JAR ファイルを開いて読み取る可能性があります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;確かに JAR 全体を読み取るわけではなく、各アーカイブにはインデックスがありますが、それでもコストはかかります。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;serviceloader&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#serviceloader&quot;&gt;&lt;/a&gt;ServiceLoader&lt;/h4&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/leyden-1/flamegraph-serviceloader-storm.png&quot; alt=&quot;A ServiceLoader storm&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 6. &lt;code&gt;ServiceLoader&lt;/code&gt; の嵐&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;ServiceLoader&lt;/code&gt; のケースを詳しく見てみましょう。これは特に興味深いものです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;クラスロードが問題にならなくなると、起動時間のかなりの部分が JAR ファイルからのサービス記述子のロードに費やされていることが明らかになります。私たちはクラスローダーのトリックを使って一部のサービスでこれを改善できましたが、それはスレッドコンテキストクラスローダーを通じてロードされるサービスに対してのみ有効です。JDK クラスローダーによってロードされるサービスについては、まだ良い解決策がありません。少なくとも今のところは。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;次回のブログ投稿では、Project Leyden 自体と、それをどのように Quarkus に統合したかについて詳しく説明します。お楽しみに。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;some-other-fun-facts&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#some-other-fun-facts&quot;&gt;&lt;/a&gt;その他の &lt;em&gt;面白い&lt;/em&gt; 事実&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;uuid-generation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#uuid-generation&quot;&gt;&lt;/a&gt;UUID の生成&lt;/h4&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/leyden-1/flamegraph-uuid.png&quot; alt=&quot;Generating a UUID for the first time&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 7. 初めて UUID を生成する動作&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これは単純明快です。 &lt;code&gt;UUID&lt;/code&gt; を生成するたびに、JDK は &lt;code&gt;SecureRandom&lt;/code&gt; インスタンスを初期化します。そして、 &lt;code&gt;SecureRandom&lt;/code&gt; インスタンスの初期化は、決してタダではありません。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;もちろん、アプリケーションがいずれにせよ &lt;code&gt;SecureRandom&lt;/code&gt; を必要とするのであれば気にすることはありません。しかし、必要ない場合に、お気に入りのフレームワークが内部用途のために &lt;code&gt;UUID&lt;/code&gt; を生成するのは理想的ではありません。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;言うまでもなく、アプリケーションが本当に &lt;code&gt;UUID&lt;/code&gt; 生成を必要とするのであれば、そのまま使用してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;bigdecimal&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bigdecimal&quot;&gt;&lt;/a&gt;BigDecimal&lt;/h4&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/leyden-1/flamegraph-bigdecimal.png&quot; alt=&quot;Initialization of BigDecimal&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 8. &lt;code&gt;BigDecimal&lt;/code&gt; の初期化&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;同様に、 &lt;code&gt;BigDecimal&lt;/code&gt; クラスには、実際にはかなりの量の作業を行う静的初期化子があります。 &lt;code&gt;BigDecimal&lt;/code&gt; の初期化には、無視できない時間がかかることがあります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私たちがこれに遭遇したのは、Quarkus の起動時間を出力する際にいくつかの計算を行うために &lt;code&gt;BigDecimal&lt;/code&gt; を使用していたからです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なんてことだ。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;そのコードを置き換えましたが、別の問題が見つかりました。 Hibernate ORM の &lt;code&gt;DurationJavaType&lt;/code&gt; クラス内の非常に限定的なユースケースでも、 &lt;code&gt;BigDecimal&lt;/code&gt; が先行して初期化されていました。これもすでに修正されています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;UUID&lt;/code&gt; と同様に、アプリケーションが本当に &lt;code&gt;BigDecimal&lt;/code&gt; を必要とするのであれば、それを使用してコストを支払うべきです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これは、実際には必要のないときのコストを避けるための話です。&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;time-zones&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#time-zones&quot;&gt;&lt;/a&gt;タイムゾーン&lt;/h4&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/leyden-1/flamegraph-timezone.png&quot; alt=&quot;Loading the time zone database&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 9. タイムゾーンデータベースのロード&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;タイムゾーンの扱いが難しいことは誰もが知っています。しかし今、私たちはそのロードも遅いということを知りました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;タイムゾーンデータベースはかなり大きく、たとえば &lt;code&gt;TimeZone.getDefault()&lt;/code&gt; を呼び出す際などにそれをロードすると、目に見えるほどの時間がかかることがあります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;サーバーアプリケーションでタイムゾーンを必要とする人なんているでしょうか？たとえば、ローカルのタイムゾーンでタイムスタンプを出力したいロギングレイヤーなどがそうです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/leyden-1/flamegraph-zoneid.png&quot; alt=&quot;Loading the zone rules&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 10. ゾーンルールのロード&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;さらに興味深いのは、タイムゾーンを &lt;code&gt;ZoneId&lt;/code&gt; に変換する際にも、ゾーンルールをロードする必要があるため、追加のコストがかかることです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これら 2 つの問題は依然として存在しており、解決できるかどうかもわかりませんが、AOT 用に開発した特定のパッケージングを使用することで、Quarkus ではそのコストをある程度軽減することができました。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot;&gt;&lt;/a&gt;結論&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;この投稿は、Quarkus と Quarkus が依存するライブラリーで行った作業についてです。しかし、私たちが学んだ教訓は Java エコシステム全体に適用できるものだと私は考えています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私たちの経験を共有することで、他のプロジェクト、特にライブラリーやフレームワークの作者が同様のアプローチをとり、起動パフォーマンスを向上させるきっかけになれば幸いです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;正直なところ、これは単に起動パフォーマンスを向上させるだけでなく、起動時に浪費されるリソースを削減することでもあります。私たちはよく Green IT について話しますが、特に簡単に達成できるケースでは、ライブラリーやフレームワークをよりグリーンなものにしていきましょう。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私たちの発見やレシピのいくつかを共有しましたが、各ライブラリーやフレームワークに固有のものは他にもあるはずです。今こそ自分たちの起動プロファイルを確認し、パフォーマンスを向上させるための「低いところにある果実 (簡単に改善できる点)」を見つける絶好の機会です。Quarkus 3.32 と新しい AOT 統合がまもなく登場すれば、これはかつてないほど容易になるでしょう。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;質問がある場合は、 &lt;a href=&quot;https://quarkusio.zulipchat.com/#narrow/channel/187038-dev&quot;&gt;こちらのコミュニティー&lt;/a&gt; でお待ちしています。また、何か面白いものを見つけたら、ぜひ共有してください。お話を聞けるのを楽しみにしています！&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;さらなる高みへ！&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;コミュニティーへの参加&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私たちは皆様からのフィードバックを大切にしています。バグ報告や改善要望など、ぜひお寄せください。一緒に素晴らしいものを作り上げましょう！&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus ユーザーの方も、興味があるだけの方も、遠慮なく私たちの温かいコミュニティーに参加してください。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバックを送る。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを書いて &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;PR を送る&lt;/a&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; で議論する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問する。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Tue, 24 Feb 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/leyden-1/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Quarkus Chicory を活用した Java による Go CEL ポリシーエンジンの構築</title>
            <link>
                https://quarkus.io/blog/k8s-style-CEL-with-quarkus-chicory/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;数日前、我々は &lt;a href=&quot;https://github.com/quarkiverse/quarkus-chicory/releases/tag/0.0.1&quot;&gt;Quarkus Chicory の最初のバージョン&lt;/a&gt; をリリースしました。これは、 &lt;a href=&quot;https://github.com/dylibso/chicory&quot;&gt;Chicory WebAssembly ランタイム&lt;/a&gt; のパワーを Quarkus アプリケーションにもたらすエクステンションです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;開発を繰り返す中で、実際のユースケースに基づいた統合テストを実装する必要性を感じました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;一般的なシナリオについての調査と実験を重ねた結果、最終的に非常に興味深いものにたどり着きました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;a-kubernetes-style-cel-policy-engine&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-kubernetes-style-cel-policy-engine&quot;&gt;&lt;/a&gt;Kubernetes スタイルの CEL ポリシーエンジン&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;CEL を使用すると、Kubernetes リソースの式ベースのポリシー検証が可能になります。この要件はオペレーターによって実装されますが、それらは &lt;em&gt;通常&lt;/em&gt; Go で記述されています :-)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;しかし、Keycloak オペレーターのように Java ベースの Quarkus オペレーターも存在します。ではどうすればよいでしょうか。Java で CEL ポリシー検証エンジンを一から実装しなければならないのでしょうか。それとも、 &lt;a href=&quot;https://github.com/projectnessie/cel-java&quot; class=&quot;bare&quot;&gt;https://github.com/projectnessie/cel-java&lt;/a&gt; などの適切な Java ライブラリーを探すべきでしょうか。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;そのどちらでもありません。ここで、Java 用の WebAssembly ランタイムである Chicory が役に立ちます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;広く使用され、十分にテストされた Go ライブラリーを再利用しましょう。Java からエクスポートされた関数をサンドボックス化された安全な方法で呼び出すだけで、すべてが解決します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なぜか？&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;書き直しの必要がない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;メンテナンスコストが低い&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1:1 の動作再現&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;a-chicory-extension-for-quarkus-applications&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-chicory-extension-for-quarkus-applications&quot;&gt;&lt;/a&gt;Quarkus アプリケーション用 Chicory エクステンション&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Chicory は、オープンソースの 100% ネイティブ Java WebAssembly (Wasm) ランタイムです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;その主な目的は、Java 開発者がネイティブライブラリー、JNI (Java Native Interface) の使用、または unsafe なコードに依存することなく、JVM 内で Wasm モジュールを実行できるようにすることです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;プラットフォーム固有のバイナリーを必要とする他の Wasm ランタイムとは異なり、Chicory はピュア Java です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;JVM のメモリー空間内で Wasm コードを実行し、「ダブルサンドボックス」効果 (Wasm の分離 + JVM のセキュリティー) を提供します。また、Wasm モジュールがシステムリソースと安全にやり取りできるようにする WASI (WebAssembly System Interface) サポートも提供します。さらに、高速な実行のための &lt;em&gt;インタープリター&lt;/em&gt; と &lt;em&gt;ランタイムコンパイラー&lt;/em&gt; の両方に加え、Wasm を Java バイトコードに変換して最適なパフォーマンスを実現する &lt;em&gt;ビルド時コンパイラー&lt;/em&gt; も含まれています。詳細は &lt;a href=&quot;https://chicory.dev/docs/usage/execution_modes/&quot;&gt;Chicory execution modes&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これはプラグインシステムに理想的であり、ユーザーが Wasm にコンパイルされる任意の言語 (Rust、C++、Go など) で安全なプラグインを記述し、それを Java アプリ内で実行できるようにします。また、Java ベースのインフラストラクチャー上でアプリケーションコンテナーのオーバーヘッドなしに軽量なロジックを実行する手段を提供するため、サーバーレスやエッジコンピューティングのケースにも使用できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;そして、古びることのないクロスプラットフォームのポータビリティーについても、アーキテクチャーごとに異なる &lt;code&gt;.so&lt;/code&gt; や &lt;code&gt;.dll&lt;/code&gt; ファイルを管理することなく、アプリケーションは &lt;em&gt;&quot;Write Once, Run Anywhere&quot;&lt;/em&gt; 状態を維持できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://chicory.dev/docs/&quot;&gt;Chicory&lt;/a&gt; についての詳細を確認できますが、ここからはその Quarkus エクステンションに焦点を当てましょう。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Quarkus Chicory は、Chicory を Quarkus アプリケーション開発者にもたらし、その機能を Quarkus エコシステムやアプリケーションのビルド時および実行時の特性に統合して、自然な開発体験を提供します。まさに、ただ動くのです！&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#features&quot;&gt;&lt;/a&gt;主な機能&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ビルド時のコード生成&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;WebAssembly モジュールから Java バイトコードを生成し、Chicory Maven プラグインを置き換えます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;依存関係管理&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus と Chicory の ASM 依存関係間のバージョン整合性を自動的に処理します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;マルチ WASM モジュールサポート&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;複数の WebAssembly モジュールを構成および管理します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;動的ロード&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;実行時にロードされる WASM モジュールを管理します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;実行モードのインテリジェントな選択&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;環境に基づいて &lt;code&gt;MachineFactory&lt;/code&gt; と &lt;code&gt;WasmModule&lt;/code&gt; インスタンスを構成します。 &lt;code&gt;MachineFactory&lt;/code&gt; は、本番環境やネイティブ環境で最適なパフォーマンスを得るためにビルド時に生成されたバイトコードを活用し、開発やテストの際にはランタイムモードやインタープリターモードを使用できます。同様に、 &lt;code&gt;WasmModule&lt;/code&gt; インスタンスも、ビルド時のコード生成プロセスを活用することで、純粋な WASM ペイロードではなく WASM メタデータを使用して初期化でき、パフォーマンスとメモリーフットプリントを向上させることができます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;開発時のライブリロード&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;静的モジュールは自動的に監視され、リロードされます。誰もがお気に入りの &lt;code&gt;quarkus:dev&lt;/code&gt; を、Rust や Go のモジュールでも利用できると考えてください。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Native Image 互換性&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WASM/WASI サポート&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このポテンシャルを手に、我々はいくつかの Go オペレーターで採用されている人気の高い &lt;a href=&quot;https://github.com/google/cel-go&quot;&gt;Google CEL&lt;/a&gt; (Go ライブラリー/API) を選択し、アプリケーションに統合することにしました。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;application-setup-and-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#application-setup-and-configuration&quot;&gt;&lt;/a&gt;アプリケーションのセットアップと設定&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションの作成は、Quarkus Maven プラグインを使用して簡単に行えます。Quarkus 3.x には Java 17 以上が必要であることに注意してください (この例では Java 21 を使用しました)。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;mvn io.quarkus.platform:quarkus-maven-plugin:create \
    -DprojectGroupId=io.quarkiverse.chicory.demo \
    -DprojectArtifactId=quarkus-cel-k8s-validator \
    -Dextensions=&apos;rest&apos;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;次に、Quarkus Chicory エクステンションを pom.xml に追加します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-xml hljs&quot; data-lang=&quot;xml&quot;&gt;    &amp;lt;properties&amp;gt;
        &amp;lt;dylibso.version&amp;gt;1.6.1&amp;lt;/dylibso.version&amp;gt;
        &amp;lt;quarkus-chicory.version&amp;gt;0.0.1&amp;lt;/quarkus-chicory.version&amp;gt;
    &amp;lt;/properties&amp;gt;

    &amp;lt;dependencyManagement&amp;gt;
        &amp;lt;dependencies&amp;gt;
            &amp;lt;dependency&amp;gt;
                &amp;lt;groupId&amp;gt;${quarkus.platform.group-id}&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;${quarkus.platform.artifact-id}&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;${quarkus.platform.version}&amp;lt;/version&amp;gt;
                &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;
                &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt;
            &amp;lt;/dependency&amp;gt;
            &amp;lt;dependency&amp;gt;
                &amp;lt;groupId&amp;gt;com.dylibso.chicory&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;wasi&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;${dylibso.version}&amp;lt;/version&amp;gt;
            &amp;lt;/dependency&amp;gt;
            &amp;lt;dependency&amp;gt;
                &amp;lt;groupId&amp;gt;io.quarkiverse.chicory&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;quarkus-chicory&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;${quarkus-chicory.version}&amp;lt;/version&amp;gt;
            &amp;lt;/dependency&amp;gt;
        &amp;lt;/dependencies&amp;gt;
    &amp;lt;/dependencyManagement&amp;gt;

    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;io.quarkus&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;quarkus-rest&amp;lt;/artifactId&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;io.quarkus&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;quarkus-rest-jackson&amp;lt;/artifactId&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;io.quarkus&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;quarkus-arc&amp;lt;/artifactId&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;io.quarkiverse.chicory&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;quarkus-chicory&amp;lt;/artifactId&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;com.dylibso.chicory&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;wasi&amp;lt;/artifactId&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;!-- more dependencies here... --&amp;gt;
    &amp;lt;/dependencies&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;最後に、WASM モジュールの設定を application.properties に記述します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-properties hljs&quot; data-lang=&quot;properties&quot;&gt;quarkus.chicory.modules.go-cel.name=io.quarkiverse.chicory.demo.GoCelModule
quarkus.chicory.modules.go-cel.wasm-file=src/main/resources/wasm/go-cel.wasm&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これにより、Quarkus Chicory に対して、指定された WASM ファイルからビルド時に &lt;code&gt;GoCelModule&lt;/code&gt; クラスを生成するように指示します。エクステンションは、WebAssembly モジュールから Java バイトコードを自動的に生成し、実行環境に基づいて適切な &lt;code&gt;MachineFactory&lt;/code&gt; を構成し、開発モードでは WASM ファイルの変更を監視してライブリロードをトリガーします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;最後のステップです。 &lt;a href=&quot;https://chicory.dev/docs/usage/annotations#wasmmoduleinterface&quot;&gt;&lt;code&gt;WasmModuleInterface&lt;/code&gt; アノテーション&lt;/a&gt; を使用し、 &lt;a href=&quot;https://chicory.dev/docs/usage/annotations#enabling-the-annotation-processor&quot;&gt;アノテーションプロセッサー&lt;/a&gt; を設定します。これにより、Chicory は Go のエクスポートされた関数と 1:1 でマッピングされるメソッドを含む Java クラスを生成します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;まず、アノテーションを配置する &lt;code&gt;K8sCel&lt;/code&gt; Java クラスを作成しましょう。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;package io.quarkiverse.chicory.demo;

import com.dylibso.chicory.annotations.WasmModuleInterface;

@WasmModuleInterface(WasmResource.absoluteFile)
public class K8sCel {

    private K8sCel() {}

}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ビルド時に、Chicory アノテーションプロセッサーはこのアノテーションを検出し、エクスポートされたメソッドを提供する &lt;code&gt;K8sCel_ModuleExports&lt;/code&gt; クラスを生成します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;package io.quarkiverse.chicory.demo;

import com.dylibso.chicory.runtime.ExportFunction;
import com.dylibso.chicory.runtime.Instance;
import com.dylibso.chicory.runtime.Memory;

public class K8sCel_ModuleExports {
    private final ExportFunction field__start;
    private final ExportFunction field_malloc;
    private final ExportFunction field_free;
    private final ExportFunction field_evalPolicy;
    private final Memory field_memory;

    public K8sCel_ModuleExports(Instance instance) {
        this.field__start = instance.exports().function(&quot;_start&quot;);
        this.field_malloc = instance.exports().function(&quot;malloc&quot;);
        this.field_free = instance.exports().function(&quot;free&quot;);
        this.field_evalPolicy = instance.exports().function(&quot;evalPolicy&quot;);
        this.field_memory = instance.exports().memory(&quot;memory&quot;);
    }

    public void _start() {
        this.field__start.apply(new long[0]);
    }

    public int malloc(int arg0) {
        long result = this.field_malloc.apply(new long[]{(long)arg0})[0];
        return (int)result;
    }

    public void free(int arg0) {
        this.field_free.apply(new long[]{(long)arg0});
    }

    public int evalPolicy(int arg0, int arg1, int arg2, int arg3) {
        long result = this.field_evalPolicy.apply(new long[]{(long)arg0, (long)arg1, (long)arg2, (long)arg3})[0];
        return (int)result;
    }

    public Memory memory() {
        return this.field_memory;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これだけで十分です！&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-wasmquarkuscontext-api&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-wasmquarkuscontext-api&quot;&gt;&lt;/a&gt;&lt;code&gt;WasmQuarkusContext&lt;/code&gt; API&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このサンプルアプリケーションは、関心事が分離されたクリーンアーキテクチャパターンに従っています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;K8sCelValidatorService&lt;/strong&gt; - WASM 統合とビジネスロジックを管理&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;K8sCelValidatorResource&lt;/strong&gt; - REST API エンドポイントを提供&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus Chicory エクステンションは、設定された WASM モジュールにアクセスするためのインジェクション用 &lt;code&gt;WasmQuarkusContext&lt;/code&gt; API を提供します。サービスでの使用方法は次のとおりです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;@ApplicationScoped
public class K8sCelValidatorService {

    @Inject
    @Named(&quot;go-cel&quot;)
    WasmQuarkusContext wasmQuarkusContext;

    Instance instance;
    K8sCel_ModuleExports exports;

    @PostConstruct
    public void init() throws IOException {
        WasmModule wasmModule = wasmQuarkusContext.getWasmModule();
        if (wasmModule == null) {
            throw new IllegalStateException(&quot;Wasm module &quot; + wasmQuarkusContext.getName() + &quot; not found!&quot;);
        }

        // Create WASI support for stdout/stderr
        WasiOptions options = WasiOptions.builder()
                .withStdout(new ByteArrayOutputStream())
                .withStderr(new ByteArrayOutputStream())
                .build();
        WasiPreview1 wasi = WasiPreview1.builder()
                .withOptions(options)
                .build();
        Store store = new Store().addFunction(wasi.toHostFunctions());

        instance = Instance.builder(wasmModule) &lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
                .withMachineFactory(wasmQuarkusContext.getMachineFactory())
                .withImportValues(store.toImportValues())
                // Don&apos;t auto-run _start(), we&apos;ll call it manually
                .withStart(false)
                .build();

        // Get exported functions BEFORE calling _start
        exports = new K8sCel_ModuleExports(instance);   &lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;

        // Initialize Go runtime by calling _start()
        // This is required to perform initialization, i.e. to run main(), which indeed should exit with 0,
        // so we catch the expected WasiExitException accordingly.
        try {
            exports.start();    &lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
        } catch (com.dylibso.chicory.wasi.WasiExitException e) {
            // Expected - Go main() exits after completing
            if (e.exitCode() != 0) {
                throw new RuntimeException(&quot;Go runtime initialization failed with exit code: &quot; + e.exitCode());
            }
            // Exit code 0 is success - runtime is now initialized and exported functions are ready
        }
    }

    public ValidationResult validate(final String resourceJson, final String celPolicy) {

        byte[] policyBytes = celPolicy.getBytes(StandardCharsets.UTF_8);
        byte[] inputBytes = resourceJson.getBytes(StandardCharsets.UTF_8);

        // Allocate memory for policy string in WASM
        int policyPtr = exports.malloc(policyBytes.length);
        if (policyPtr == 0) {
            throw new IllegalStateException(&quot;Failed to allocate memory for policy&quot;);
        }

        // Allocate memory for input JSON in WASM
        int inputPtr = exports.malloc(inputBytes.length);
        if (inputPtr == 0) {
            throw new IllegalStateException(&quot;Failed to allocate memory for input&quot;);
        }

        try {
            // Write policy and input to WASM memory
            exports.memory().write(policyPtr, policyBytes);
            exports.memory().write(inputPtr, inputBytes);

            // Call evalPolicy(policyPtr, policyLen, inputPtr, inputLen)
            int returnCode = exports.evalPolicy(policyPtr, policyBytes.length, inputPtr, inputBytes.length);

            // Interpret result
            if (returnCode == 11) {
                return new ValidationResult(VALIDATION_RESULT_ALLOWED, &quot;Policy ALLOWS the request&quot;, celPolicy);
            } else if (returnCode == 0) {
                return new ValidationResult(VALIDATION_RESULT_DENIED, &quot;Policy DENIES the request&quot;, celPolicy);
            } else {
                // Negative values are errors
                String errorMsg = switch (returnCode) {
                    case -1 -&amp;gt; &quot;JSON parse error&quot;;
                    case -2 -&amp;gt; &quot;CEL environment creation error&quot;;
                    case -3 -&amp;gt; &quot;CEL compilation error&quot;;
                    case -4 -&amp;gt; &quot;CEL program creation error&quot;;
                    case -5 -&amp;gt; &quot;CEL runtime error&quot;;
                    default -&amp;gt; &quot;Unknown error: &quot; + returnCode;
                };
                return new ValidationResult(VALIDATION_RESULT_ERROR, &quot;CEL evaluation failed: &quot; + errorMsg, celPolicy);
            }
        } finally {
            // Free allocated memory in WASM
            exports.free(policyPtr);
            exports.free(inputPtr);
        }
    }

    public static final String VALIDATION_RESULT_ALLOWED = &quot;allowed&quot;;
    public static final String VALIDATION_RESULT_DENIED = &quot;denied&quot;;
    public static final String VALIDATION_RESULT_ERROR = &quot;error&quot;;

    public record ValidationResult(String status, String message, String policy) {}
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;インジェクトされた &lt;code&gt;WasmQuarkusContext&lt;/code&gt; Bean は、アプリケーションの設定と実行環境に基づいて動的に作成される &lt;code&gt;MachineFactory&lt;/code&gt; および &lt;code&gt;WasmModule&lt;/code&gt; インスタンスを使用するように &lt;code&gt;Instance.Builder&lt;/code&gt; を構成します。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;instance&lt;/code&gt; が構築されると、 &lt;code&gt;export&lt;/code&gt; は &lt;code&gt;K8sCel_ModuleExports&lt;/code&gt; インスタンスで初期化され、後に &lt;code&gt;validate()&lt;/code&gt; メソッドで呼び出されるエクスポート関数を提供します。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Go ランタイムを初期化するために、エクスポートされた &quot;_start&quot; 関数が呼び出されます。これにより、Go プログラムの &lt;code&gt;main()&lt;/code&gt; 関数が実行されます。今回の実装では中身が空であるため、すぐに終了します。そのため、 &lt;code&gt;WasiExitException&lt;/code&gt; をキャッチして、終了コードが 0 (エラーなし) であることを確認します。&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;a-note-about-multi-user-and-thread-safety&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-note-about-multi-user-and-thread-safety&quot;&gt;&lt;/a&gt;マルチユーザーとスレッドセーフに関する注意&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;WasmQuarkusContext&lt;/code&gt; インスタンスは &lt;code&gt;@ApplicationScoped&lt;/code&gt; Bean としてインジェクトされます。これは、単一のアプリケーションインスタンスが複数のクライアント (またはユーザーリクエスト) やスレッドによって使用される可能性があることを意味します。とはいえ、API の実装は &lt;em&gt;ステートレス&lt;/em&gt; であり、 &lt;code&gt;getMachineFactory()&lt;/code&gt; と &lt;code&gt;getWasmModule()&lt;/code&gt; は常に新しいインスタンスを返します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これらのインスタンスの扱い方やライフサイクルのオーケストレーション方法は、アプリケーションドメインに属する事項です。例えば、上記のターゲット実装は並行性を考慮していません。複数のスレッドが同じ &lt;code&gt;Memory&lt;/code&gt; インスタンスを消費する場合、共有されている &lt;code&gt;WasmModule&lt;/code&gt; の線形メモリーの破損を避けるために、スレッドセーフな実装が必要になります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションコードに戻ると、REST リソースは単純な委譲レイヤーとなります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;@Path(&quot;/k8s&quot;)
public class K8sCelValidatorResource {

    @Inject
    K8sCelValidatorService validatorService;

    @POST
    @Path(&quot;/validate&quot;)
    public Response validate(@RestForm String resourceJson, @RestForm String celPolicy) {
        ValidationResult result = validatorService.validate(resourceJson, celPolicy);

        Response.Status status = switch (result.status()) {
            case &quot;allowed&quot; -&amp;gt; Response.Status.OK;
            case &quot;denied&quot; -&amp;gt; Response.Status.FORBIDDEN;
            default -&amp;gt; Response.Status.BAD_REQUEST;
        };

        return Response.status(status).entity(result).build();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;WasmQuarkusContext&lt;/code&gt; API は、2 つの主要なメソッドを提供します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;getWasmModule()&lt;/code&gt;: 解析された WebAssembly モジュールを返します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;getMachineFactory()&lt;/code&gt;: 環境に基づいた適切な &lt;code&gt;MachineFactory&lt;/code&gt; を返します (開発時はインタープリター、本番/ネイティブ時はビルド時コンパイル)。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;@Named&lt;/code&gt; 修飾子は、application.properties のモジュール名と一致します。エクステンションが WASM モジュールのライフサイクルの複雑さをすべて処理するため、開発者はビジネスロジックに集中できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-it-works-go-wasm-java-bytecode&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-it-works-go-wasm-java-bytecode&quot;&gt;&lt;/a&gt;仕組み: Go &amp;#8594; Wasm &amp;#8594; Java バイトコード&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションの核心は、WebAssembly にコンパイルされた Go CEL 実装です。Go コードは、3 つの主要なエクスポート関数を実装しています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-go hljs&quot; data-lang=&quot;go&quot;&gt;//go:wasmexport evalPolicy
func evalPolicy(policyPtr, policyLen, inputPtr, inputLen uint32) int32 {
    // Convert pointers to Go types
    policy := unsafe.String((*byte)(unsafe.Pointer(uintptr(policyPtr))), policyLen)
    inputJSON := unsafe.Slice((*byte)(unsafe.Pointer(uintptr(inputPtr))), inputLen)

    // Parse the JSON input
    var input map[string]any
    if err := json.Unmarshal(inputJSON, &amp;amp;input); err != nil {
        return -1  // JSON parse error
    }

    // Create CEL environment
    env, err := cel.NewEnv(
        cel.Declarations(
            decls.NewVar(&quot;object&quot;, decls.NewMapType(decls.String, decls.Dyn)),
        ),
    )
    if err != nil {
        return -2  // CEL environment creation error
    }

    // Compile and evaluate the CEL expression
    ast, iss := env.Compile(policy)
    if iss.Err() != nil {
        return -3  // Compilation error
    }

    prg, err := env.Program(ast)
    if err != nil {
        return -4  // Program creation error
    }

    out, _, err := prg.Eval(map[string]any{&quot;object&quot;: input})
    if err != nil {
        return -5  // CEL runtime error
    }

    // Return 1 for allow, 0 for deny
    if b, ok := out.Value().(bool); ok &amp;amp;&amp;amp; b {
        return 1
    }
    return 0
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;この Go コードは、WASI ターゲットを使用して WASM にコンパイルされます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;GOOS=wasip1 GOARCH=wasm go build -o go-cel.wasm main.go&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;サービスの実装において:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Java はポリシー文字列と入力リソースマニフェスト (JSON) 用に WASM メモリーを割り当て、データを WASM メモリーに書き込みます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java は、引数へのポインターとそのサイズを指定して &lt;code&gt;evalPolicy()&lt;/code&gt; を呼び出します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go コードはそのメモリー空間から読み取り、Google CEL ライブラリーを使用して CEL 式を評価します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go は整数の結果コードを返します (1=許可、0=拒否、負の値=エラー)。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java は結果を解釈し、クリーンアップを実行します。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;これは WebAssembly のパワーを示しています。成熟し、十分にテストされた Google CEL-Go ライブラリーを、CEL を一から再実装することなく Java から使用できるのです。&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;WASM の境界は、2 つの言語間にクリーンで安全なインターフェースを提供します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;本番環境では、Go オペレーターと同じように Kubernetes リソースを検証する CEL ポリシーを記述できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-cel hljs&quot; data-lang=&quot;cel&quot;&gt;// Require production label
has(object.metadata.labels.env) &amp;amp;&amp;amp; object.metadata.labels.env == &quot;production&quot;

// Deny privileged containers
!(has(object.spec.containers) &amp;amp;&amp;amp; object.spec.containers.exists(c,
  has(c.securityContext) &amp;amp;&amp;amp; c.securityContext.privileged == true))

// Require resource limits
has(object.spec.containers) &amp;amp;&amp;amp; object.spec.containers.all(c,
  has(c.resources) &amp;amp;&amp;amp; has(c.resources.limits))&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot;&gt;&lt;/a&gt;結論&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus Chicory と、WebAssembly にコンパイルされた Google CEL-Go を組み合わせることで、完全に Java で動作する Kubernetes スタイルの CEL ポリシーエンジンを作成しました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このアプローチにはいくつかの利点があります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;既存の Go ライブラリーの再利用: Java で CEL を再実装する必要がなく、オリジナルの Go コードと 1:1 で対応します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;型安全性とパフォーマンス: Quarkus Chicory が WASM モジュールから Java バイトコードを生成します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本番環境への対応: Go オペレーターで使用されているものと同じ CEL ライブラリーが、Java でも利用可能になります。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;開発者体験: ライブリロード、ビルド時のコード生成、および Native Image サポート。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;エコシステムの互換性: &lt;a href=&quot;https://github.com/operator-framework/java-operator-sdk&quot;&gt;Java ベースの Kubernetes オペレーター&lt;/a&gt; とシームレスに連携します。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これは、WebAssembly が単なるブラウザー技術ではなく、クラウドネイティブアプリケーションにおける言語間相互運用のための強力なツールであることを示しています。また、Quarkus Chicory のおかげで、このワークフローを Quarkus アプリケーションに簡単に統合できることも実証されました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Kubernetes オペレーターを構築する Java 開発者にとって、このアプローチは JVM を離れることなく Go エコシステムの大部分を活用する道を切り開きます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;完全な動作例は、こちらで確認できます。 &lt;a href=&quot;https://github.com/fabiobrz/quarkus-cel-k8s-validator&quot; class=&quot;bare&quot;&gt;https://github.com/fabiobrz/quarkus-cel-k8s-validator&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot;&gt;&lt;/a&gt;参照&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.quarkiverse.io/quarkus-chicory/dev&quot;&gt;Quarkus Chicory エクステンション&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dylibso/chicory&quot;&gt;Chicory WebAssembly ランタイム&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/google/cel-go&quot;&gt;Google CEL&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://kubernetes.io/docs/reference/using-api/cel/&quot;&gt;Kubernetes CEL バリデーション&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wasi.dev/&quot;&gt;WebAssembly System Interface (WASI)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Thu, 19 Feb 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/k8s-style-CEL-with-quarkus-chicory/
            </guid>
            
            
            
            <author>Fabio Burzigotti</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.31.4 - メンテナンスリリース</title>
            <link>
                https://quarkus.io/blog/quarkus-3-31-4-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;本日、3.31 ストリーム向けの3回目のメンテナンスリリースである Quarkus 3.31.4 をリリースしました (3.31.0 はスキップしました)。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.31 に更新するには、Quarkus CLI の最新バージョンに更新して、以下を実行することを推奨します:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なお、&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.31 へアプリケーションを更新できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整の詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.31&quot;&gt;Quarkus 3.31 マイグレーションガイド&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.31.4&quot;&gt;3.31.4&lt;/a&gt; の完全な変更履歴は GitHub で確認できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-31-4-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Quarkusニュースレター #65 - 2月</title>
            <link>
                https://quarkus.io/blog/quarkus-newsletter-65/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusはマイクロサービスに重点を置いていますが、既存のアプリケーションをよりモダンなランタイムに移行する場合でも、新しいアプリケーションをゼロから構築する場合でも、大規模なモノリスにも完全に適しています。Quarkusは常に大規模なアプリケーションを処理できましたが、特にビルド時間に関しては、この分野で最近大幅な改善を行いました。これらの改善の詳細については、Guillaume Smetによる「Towards faster builds (より高速なビルドに向けて)」をお読みください。Guillaume Laforgeによる「Implementing an arXiv MCP Server with Quarkus in Java (QuarkusとJavaでarXiv MCPサーバーを実装する)」を読んで、事前公開版がコミュニティと共有されるarXiv研究論文ウェブサイトにアクセスするためのMCPサーバーの構築について学びましょう。著者の目標は、Model Context Protocolのあまり知られていない側面、ツール、リソース、プロンプトに光を当てることでした。Anand Jaisyが「Micronaut vs Quarkus: Why I Switched After Two Years (Micronaut vs Quarkus: 2年後にフレームワークを切り替えた理由)」でフレームワークを切り替えることを選んだ理由の詳細を学びましょう。Nawaz Dhandalaによる「How to Trace Quarkus Reactive Messaging with OpenTelemetry (OpenTelemetryでQuarkus Reactive Messagingをトレースする方法)」をチェックして、OpenTelemetryを使用してKafkaやその他のメッセージングシステム間でメッセージを追跡するためのQuarkus Reactive Messagingアプリケーションの分散トレースを実装する方法を学びましょう。Markus Eiseleによる「Your Second Reactive Messaging App: What Production Systems Actually Need (あなたの2番目のリアクティブメッセージングアプリ: 生産システムが実際に必要とするもの)」で、バリデーション、再試行、冪等性、Kafkaを活用したワークフローをQuarkusで示すこの実践的なJavaウォークスルーをぜひ試してみてください。次に、彼の2番目のブログ投稿「Your Quarkus Architecture Is Drifting. JQAssistant Can Prove It. (あなたのQuarkusアーキテクチャは漂流している。JQAssistantがそれを証明できる。)」で、グラフベースの分析を使用してJavaアプリケーションのアーキテクチャの劣化を検出および防止する方法について学ぶことができます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;最新のQuarkus Insightsエピソード、トップツイート/ディスカッション、今後開催されるQuarkus参加イベントもご覧いただけます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkus.io/newsletter/65/&quot;&gt;ニュースレター #65: 2月&lt;/a&gt;をチェックしてください！&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ニュースレターを受信してみませんか？ページ上のフォームを使って &lt;a href=&quot;https://quarkus.io/newsletter&quot;&gt;ニュースレターに登録&lt;/a&gt;してください。&lt;/p&gt;
&lt;/div&gt;
            </description>
            <pubDate>Fri, 13 Feb 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-newsletter-65/
            </guid>
            
            
            
            <author>James Cobb (https://twitter.com/insectengine)</author>
            
        </item>
        
        <item>
            <title>A2A Java SDK 1.0.0.Alpha2 リリース</title>
            <link>
                https://quarkus.io/blog/a2a-java-sdk-1-0-0-alpha2-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A2A Java SDK 1.0.0.Alpha2 のリリースをお知らせします。このリリースでは、 &lt;a href=&quot;https://a2a-protocol.org/latest/specification/&quot;&gt;A2A 1.0 仕様&lt;/a&gt; への準拠を継続し、重要な新機能と改善が導入されています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;whats-a2a&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-a2a&quot;&gt;&lt;/a&gt;A2A とは&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Agent2Agent (A2A) プロトコルは、基盤となるフレームワーク、言語、ベンダーに関係なく、AI エージェント同士が通信し、連携できるようにするためのオープンスタンダードです。A2A Java SDK を使用すると、Quarkus ベースのリファレンス実装を使用して、A2A 準拠のエージェントを Java で簡単に構築できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;key-highlights-in-1-0-0-alpha2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-highlights-in-1-0-0-alpha2&quot;&gt;&lt;/a&gt;1.0.0.Alpha2 における主なハイライト&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このリリースには、いくつかの重要な機能強化と破壊的変更が含まれています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;new-features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-features&quot;&gt;&lt;/a&gt;新機能&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;telemetry-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#telemetry-support&quot;&gt;&lt;/a&gt;テレメトリーのサポート&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A2A Java SDK に、OpenTelemetry を使用したテレメトリーのサポートが組み込まれました。これにより、エージェントの操作を監視およびトレースできるようになり、問題の診断やパフォーマンス特性の把握が容易になります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;テレメトリー機能を使用するには、プロジェクトに OpenTelemetry エクストラを追加します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-xml hljs&quot; data-lang=&quot;xml&quot;&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;io.github.a2asdk&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;a2a-java-sdk-extras-opentelemetry-client&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0.0.Alpha2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;io.github.a2asdk&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;a2a-java-sdk-extras-opentelemetry-server&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0.0.Alpha2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;push-notifications&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#push-notifications&quot;&gt;&lt;/a&gt;プッシュ通知&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A2A 1.0 仕様で規定されているプッシュ通知を完全にサポートしました。これにより、エージェントはポーリングを行うことなくタスクの更新通知を受け取ることができます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;サーバーエージェントで以下のことが可能になりました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;プッシュ通知エンドポイントの設定&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;タスクごとのプッシュ通知設定の管理&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;タスクの状態が変化した時の通知の受信&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;クライアントで以下のことが可能になりました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;プッシュ通知設定の取得、設定、一覧表示、および削除&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プッシュ通知によるタスク更新の購読&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;protocol-updates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#protocol-updates&quot;&gt;&lt;/a&gt;プロトコルのアップデート&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;breaking-changes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#breaking-changes&quot;&gt;&lt;/a&gt;破壊的変更&lt;/h4&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このリリースには、最新の A2A 仕様に準拠するための破壊的変更が含まれています。&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AgentEmitter API&lt;/strong&gt;: &lt;code&gt;AgentExecutor&lt;/code&gt; メソッドは、従来の &lt;code&gt;EventQueue&lt;/code&gt; と &lt;code&gt;TaskUpdater&lt;/code&gt; の組み合わせの代わりに &lt;code&gt;AgentEmitter&lt;/code&gt; を使用するようになり、より合理化され直感的な API が提供されます。この機能強化により、単純なエージェント間のやり取りのためのメッセージを &lt;code&gt;AgentEmitter&lt;/code&gt; 経由で直接送信できるようになり、EventQueue を直接操作する必要がなくなりました。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;プロトコルの整合性&lt;/strong&gt;: gRPC プロトコル定義の更新を含む、最新の仕様改訂に合わせるために A2A プロトコルの実装を更新しました。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;additional-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#additional-improvements&quot;&gt;&lt;/a&gt;その他の改善点&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Null 安全性&lt;/strong&gt;: spec モジュールを JSpecify アノテーションを使用するように移行し、より優れた Null 安全性を保証しました。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jakarta CDI 互換性&lt;/strong&gt;: Jakarta CDI の互換性を向上させるために、引数なしのコンストラクターを追加しました。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;HTTP+JSON/REST トランスポート&lt;/strong&gt;: 統合を改善するために、 &lt;code&gt;quarkus-rest-jackson&lt;/code&gt; を &lt;code&gt;quarkus-rest&lt;/code&gt; に置き換えました。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;イベント処理&lt;/strong&gt;: より堅牢なイベントキュー処理を実現するために、 MainEventBus アーキテクチャーを実装しました。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MicroProfile Config&lt;/strong&gt;: microprofile-config 統合に欠落していた &lt;code&gt;META-INF/beans.xml&lt;/code&gt; を追加しました。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;migration-guide&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#migration-guide&quot;&gt;&lt;/a&gt;移行ガイド&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;1.0.0.Alpha1 からアップグレードする場合は、以下の変更を行う必要があります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;update-agentexecutor-implementation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update-agentexecutor-implementation&quot;&gt;&lt;/a&gt;AgentExecutor 実装の更新&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;execute&lt;/code&gt; および &lt;code&gt;cancel&lt;/code&gt; メソッドは、 &lt;code&gt;EventQueue&lt;/code&gt; の代わりに &lt;code&gt;AgentEmitter&lt;/code&gt; パラメーターを受け取るようになりました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;// Before (1.0.0.Alpha1)
@Override
public void execute(RequestContext context, EventQueue eventQueue) throws JSONRPCError {
    final TaskUpdater updater = new TaskUpdater(context, eventQueue);
    updater.submit();
    updater.startWork();
    // ...
}

// After (1.0.0.Alpha2)
@Override
public void execute(RequestContext context, AgentEmitter agentEmitter) throws JSONRPCError {
    agentEmitter.submit();
    agentEmitter.startWork();
    // ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;AgentEmitter&lt;/code&gt; インターフェースは、よりクリーンな API で同等の機能を提供します。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;getting-started&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#getting-started&quot;&gt;&lt;/a&gt;はじめに&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A2A Java SDK 1.0.0.Alpha2 を使用するには、プロジェクトに適切な依存関係を追加してください。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-xml hljs&quot; data-lang=&quot;xml&quot;&gt;&amp;lt;dependencyManagement&amp;gt;
    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;io.github.a2asdk&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;a2a-java-sdk-bom&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;1.0.0.Alpha1&amp;lt;/version&amp;gt;
            &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;
            &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;
&amp;lt;/dependencyManagement&amp;gt;

&amp;lt;!-- For JSON-RPC transport --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;io.github.a2asdk&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;a2a-java-sdk-reference-jsonrpc&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0.0.Alpha2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;

&amp;lt;!-- For gRPC transport --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;io.github.a2asdk&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;a2a-java-sdk-reference-grpc&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0.0.Alpha2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;

&amp;lt;!-- For HTTP+JSON/REST transport --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;io.github.a2asdk&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;a2a-java-sdk-reference-rest&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0.0.Alpha2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources&quot;&gt;&lt;/a&gt;リソース&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/a2aproject/a2a-java/releases/tag/v1.0.0.Alpha2&quot;&gt;GitHub 上のリリースの注記&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/a2aproject/a2a-samples/tree/main/samples/java/agents&quot;&gt;A2A Java SDK サンプル&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/a2aproject/a2a-java/blob/main/README.md&quot;&gt;A2A Java SDK ドキュメント&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://a2a-protocol.org/latest/specification/&quot;&gt;A2A 仕様&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot;&gt;&lt;/a&gt;まとめ&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A2A Java SDK 1.0.0.Alpha2 は、完全な A2A 1.0 仕様準拠への道のりにおける重要な前進です。テレメトリーサポートとプッシュ通知の追加により、本番環境に対応したエージェントの構築が容易になり、プロトコルのアップデートによって最新の仕様との互換性が確保されます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このリリースをぜひお試しいただき、 &lt;a href=&quot;https://github.com/a2aproject/a2a-java/issues&quot;&gt;GitHub イシュートラッカー&lt;/a&gt; を通じてフィードバックをお寄せください。皆様からの入力が A2A Java SDK の将来を形作る助けとなります。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Thu, 12 Feb 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/a2a-java-sdk-1-0-0-alpha2-released/
            </guid>
            
            
            
            <author>Emmanuel Hugonnet (https://twitter.com/ehsavoie)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.31.3 - メンテナンスリリース</title>
            <link>
                https://quarkus.io/blog/quarkus-3-31-3-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;本日、Quarkus 3.31ストリームの2番目のメンテナンスリリースである Quarkus 3.31.3 をリリースしました (3.31.0 はスキップしました)。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.31 に更新するには、Quarkus CLI の最新バージョンに更新して、以下を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なお、&lt;code&gt;quarkus update&lt;/code&gt; を使用すると、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.31 へアプリケーションを更新できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整の詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.31&quot;&gt;Quarkus 3.31 移行ガイド&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.31.3&quot;&gt;3.31.3&lt;/a&gt; の完全な変更履歴は GitHub で入手できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-31-3-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>ギャップを埋める：Quarkus エクステンションのテストカバレッジ</title>
            <link>
                https://quarkus.io/blog/quarkus-test-coverage-extensions/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;テストカバレッジは通常、テストによって実行されたコードの割合を測定する指標として定義されます。その有用性を疑う開発者もいますが、私は「テストカバレッジは、コードベースのテストされていない部分を見つけるための有用なツールである」という &lt;a href=&quot;https://martinfowler.com/bliki/TestCoverage.html&quot;&gt;Martin Fowler 氏&lt;/a&gt;の意見に同意します。算出される数値自体が重要だとは思いません。結局のところ、生成された getter のテストを書くことには全く意味がありません。しかし、エクステンションのホットパスにおいてテストが不十分なコードを特定できれば、テストスイートを改善し、リリース前にバグを発見することができます。これは常に報われる作業です。同様に重要なこととして、リグレッションを捕捉する能力を高めることもできます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;長い間、https://www.jacoco.org/jacoco/index.html[JaCoCo コードカバレッジライブラリー]を統合する &lt;code&gt;io.quarkus:quarkus-jacoco&lt;/code&gt; エクステンションが存在していました。しかし、最近まではエクステンションプロジェクトのランタイムモジュールのカバレッジを測定することは不可能でした。言い換えれば、&lt;code&gt;@QuarkusTest&lt;/code&gt; ではカバレッジを測定できましたが、エクステンションのテストの大部分を占めるのが一般的な &lt;code&gt;QuarkusUnitTest&lt;/code&gt; では測定できなかったのです。適切なカバレッジサポートがなければ、開発者は自身のバイトコード拡張やレコーディングロジックが効果的にテストされているかどうか確信が持てず、手探りの状態でした。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;technical-overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#technical-overview&quot;&gt;&lt;/a&gt;技術的な概要&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;JaCoCo は実行カバレッジデータを記録するためにクラスをインストゥルメントします。デフォルトでは、クラスは Java エージェントによってオンザフライでインストゥルメントされます。しかし、Quarkus では &lt;a href=&quot;https://www.jacoco.org/jacoco/trunk/doc/offline.html&quot;&gt;オフラインインストゥルメンテーション&lt;/a&gt;を使用して、ビルド中にクラスのバイトコードを修正します。デフォルトでは、すべてのアプリケーションアーカイブ内のすべてのクラスがインストゥルメントされます。アプリケーションアーカイブとは、アプリケーションにコンポーネントを提供するアーカイブのことです。これは Jandex を介してインデックス化され、エクステンションはその内容を分析できます。例えば、Quarkus は CDI Bean の検出中にアプリケーションアーカイブを分析します。しかし、エクステンションのランタイムモジュールは通常、アプリケーションアーカイブではありません。そのため、エクステンションのクラスはインストゥルメントされませんでした。今までは。Quarkus 3.31.2 では、インストゥルメントするアーティファクトを指定する新しい設定プロパティー &lt;code&gt;quarkus.jacoco.instrument-artifacts.&quot;dependency-name&quot;.group-id&lt;/code&gt; と &lt;code&gt;quarkus.jacoco.instrument-artifacts.&quot;dependency-name&quot;.artifact-id&lt;/code&gt; が導入されました。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;basic-setup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#basic-setup&quot;&gt;&lt;/a&gt;基本設定&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;エクステンションのランタイムモジュールのテストカバレッジを測定したい場合は、デプロイメントモジュールで特定の JaCoCo 設定が必要になります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-xml hljs&quot; data-lang=&quot;xml&quot;&gt;&amp;lt;profiles&amp;gt;
    &amp;lt;profile&amp;gt;
        &amp;lt;id&amp;gt;test-coverage&amp;lt;/id&amp;gt;
        &amp;lt;activation&amp;gt;
            &amp;lt;property&amp;gt;
                &amp;lt;name&amp;gt;jacoco&amp;lt;/name&amp;gt; &lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
            &amp;lt;/property&amp;gt;
        &amp;lt;/activation&amp;gt;
        &amp;lt;dependencies&amp;gt;
            &amp;lt;dependency&amp;gt;
                &amp;lt;groupId&amp;gt;io.quarkus&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;quarkus-jacoco-deployment&amp;lt;/artifactId&amp;gt; &lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
                &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
            &amp;lt;/dependency&amp;gt;
        &amp;lt;/dependencies&amp;gt;
        &amp;lt;build&amp;gt;
            &amp;lt;plugins&amp;gt;
                &amp;lt;plugin&amp;gt;
                    &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;
                    &amp;lt;configuration&amp;gt;
                        &amp;lt;systemPropertyVariables&amp;gt;
                            &amp;lt;quarkus.jacoco.instrument-artifacts.runtime.group-id&amp;gt;io.quarkus&amp;lt;/quarkus.jacoco.instrument-artifacts.runtime.group-id&amp;gt;
                            &amp;lt;quarkus.jacoco.instrument-artifacts.runtime.artifact-id&amp;gt;quarkus-runtime-module-name&amp;lt;/quarkus.jacoco.instrument-artifacts.runtime.artifact-id&amp;gt; &lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
                        &amp;lt;/systemPropertyVariables&amp;gt;
                    &amp;lt;/configuration&amp;gt;
                &amp;lt;/plugin&amp;gt;
            &amp;lt;/plugins&amp;gt;
        &amp;lt;/build&amp;gt;
    &amp;lt;/profile&amp;gt;
&amp;lt;/profiles&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;このプロファイルは &lt;code&gt;jacoco&lt;/code&gt; プロパティーによって有効化されます。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;テストスコープで &lt;code&gt;quarkus-jacoco-deployment&lt;/code&gt; 依存関係を追加します。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;io.quarkus:quarkus-runtime-module-name&lt;/code&gt; アーティファクトをインストゥルメントするように JaCoCo プラグインに指示します。&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;デフォルトでは、JaCoCo データは &lt;code&gt;target/jacoco-quarkus.exec&lt;/code&gt; ファイルに保存され、カバレッジレポートは &lt;code&gt;target/jacoco-report&lt;/code&gt; ディレクトリに自動的に生成されます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;multi-module-setup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#multi-module-setup&quot;&gt;&lt;/a&gt;マルチモジュール設定&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;マルチモジュールプロジェクトの場合、さらに多くの設定プロパティーが必要になる場合があります。通常、エクステンションプロジェクトに互いに依存する複数のエクステンションが含まれている場合、より複雑な設定が必要になります。以下のプロジェクトでは、&lt;code&gt;foo&lt;/code&gt; と &lt;code&gt;bar&lt;/code&gt; という 2 つのエクステンションサブモジュールがあります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre&gt;/my-extension-project
   ├── /foo
   │  ├── runtime
   │  ├── deployment
   │  └── pom.xml
   ├── /bar (depends on foo)
   │  ├── runtime
   │  ├── deployment
   │  └── pom.xml
   └── pom.xml&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;サブモジュール &lt;code&gt;bar&lt;/code&gt; は &lt;code&gt;foo&lt;/code&gt; に依存し、その機能を拡張します。&lt;code&gt;foo/deployment&lt;/code&gt; サブモジュールには、&lt;code&gt;foo/runtime&lt;/code&gt; のクラスをテストする &lt;code&gt;QuarkusUnitTest&lt;/code&gt; が含まれています。&lt;code&gt;bar/deployment&lt;/code&gt; サブモジュールには、&lt;code&gt;bar/runtime&lt;/code&gt; と &lt;code&gt;foo/runtime&lt;/code&gt; の両方のクラスをテストする &lt;code&gt;QuarkusUnitTest&lt;/code&gt; が含まれています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私たちの目標は、&lt;code&gt;foo/runtime&lt;/code&gt; と &lt;code&gt;bar/runtime&lt;/code&gt; の両方のカバレッジを測定することです。どのように進めればよいでしょうか。まず、親プロジェクトにいくつかの設定を適用する必要があります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;&lt;code&gt;my-extension-project/pom.xml&lt;/code&gt;&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-xml hljs&quot; data-lang=&quot;xml&quot;&gt;&amp;lt;profiles&amp;gt;
    &amp;lt;profile&amp;gt;
        &amp;lt;id&amp;gt;test-coverage&amp;lt;/id&amp;gt;
        &amp;lt;activation&amp;gt;
            &amp;lt;property&amp;gt;
                &amp;lt;name&amp;gt;jacoco&amp;lt;/name&amp;gt; &lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
            &amp;lt;/property&amp;gt;
        &amp;lt;/activation&amp;gt;
        &amp;lt;build&amp;gt;
            &amp;lt;plugins&amp;gt;
                &amp;lt;plugin&amp;gt;
                    &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;
                    &amp;lt;configuration&amp;gt;
                        &amp;lt;systemPropertyVariables&amp;gt;
                           &amp;lt;quarkus.jacoco.data-file&amp;gt;${maven.multiModuleProjectDirectory}/target/jacoco.exec&amp;lt;/quarkus.jacoco.data-file&amp;gt; &lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
                           &amp;lt;quarkus.jacoco.reuse-data-file&amp;gt;true&amp;lt;/quarkus.jacoco.reuse-data-file&amp;gt; &lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
                           &amp;lt;quarkus.jacoco.report-location&amp;gt;${maven.multiModuleProjectDirectory}/target/coverage&amp;lt;/quarkus.jacoco.report-location&amp;gt; &lt;i class=&quot;conum&quot; data-value=&quot;4&quot;&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;
                           &amp;lt;quarkus.jacoco.aggregate-report-data&amp;gt;true&amp;lt;/quarkus.jacoco.aggregate-report-data&amp;gt; &lt;i class=&quot;conum&quot; data-value=&quot;5&quot;&gt;&lt;/i&gt;&lt;b&gt;(5)&lt;/b&gt;
                        &amp;lt;/systemPropertyVariables&amp;gt;
                    &amp;lt;/configuration&amp;gt;
                &amp;lt;/plugin&amp;gt;
            &amp;lt;/plugins&amp;gt;
        &amp;lt;/build&amp;gt;
    &amp;lt;/profile&amp;gt;
&amp;lt;/profiles&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;このプロファイルは &lt;code&gt;jacoco&lt;/code&gt; プロパティーによって有効化されます。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;共有される JaCoCo データファイルは &lt;code&gt;my-extension-project/target/jacoco.exec&lt;/code&gt; になります。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;共有された JaCoCo データはすべてのテストで再利用されます。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;4&quot;&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;生成されるカバレッジレポートは &lt;code&gt;my-extension-project/target/coverage&lt;/code&gt; ディレクトリに出力されます。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;5&quot;&gt;&lt;/i&gt;&lt;b&gt;5&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;レポートデータ (ソースディレクトリとクラスファイル) は、単一のレポートを生成できるように集計されます。&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;その後、&lt;code&gt;foo&lt;/code&gt; と &lt;code&gt;bar&lt;/code&gt; のデプロイメントモジュールを修正します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;&lt;code&gt;my-extension-project/bar/pom.xml&lt;/code&gt;&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-xml hljs&quot; data-lang=&quot;xml&quot;&gt;&amp;lt;profiles&amp;gt;
   &amp;lt;profile&amp;gt;
      &amp;lt;id&amp;gt;test-coverage&amp;lt;/id&amp;gt;
      &amp;lt;activation&amp;gt;
         &amp;lt;property&amp;gt;
            &amp;lt;name&amp;gt;jacoco&amp;lt;/name&amp;gt; &lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
         &amp;lt;/property&amp;gt;
      &amp;lt;/activation&amp;gt;
      &amp;lt;dependencies&amp;gt;
         &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;io.quarkus&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;quarkus-jacoco-deployment&amp;lt;/artifactId&amp;gt;
            &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
         &amp;lt;/dependency&amp;gt;
      &amp;lt;/dependencies&amp;gt;
      &amp;lt;build&amp;gt;
         &amp;lt;plugins&amp;gt;
            &amp;lt;plugin&amp;gt;
               &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;
               &amp;lt;configuration&amp;gt;
                  &amp;lt;systemPropertyVariables&amp;gt;
                     &amp;lt;quarkus.jacoco.instrument-artifacts.foo.group-id&amp;gt;org.acme&amp;lt;/quarkus.jacoco.instrument-artifacts.foo.group-id&amp;gt;
                     &amp;lt;quarkus.jacoco.instrument-artifacts.foo.artifact-id&amp;gt;foo&amp;lt;/quarkus.jacoco.instrument-artifacts.foo.artifact-id&amp;gt; &lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
                     &amp;lt;quarkus.jacoco.instrument-artifacts.bar.group-id&amp;gt;org.acme&amp;lt;/quarkus.jacoco.instrument-artifacts.bar.group-id&amp;gt;
                     &amp;lt;quarkus.jacoco.instrument-artifacts.bar.artifact-id&amp;gt;bar&amp;lt;/quarkus.jacoco.instrument-artifacts.bar.artifact-id&amp;gt; &lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
                  &amp;lt;/systemPropertyVariables&amp;gt;
               &amp;lt;/configuration&amp;gt;
            &amp;lt;/plugin&amp;gt;
         &amp;lt;/plugins&amp;gt;
      &amp;lt;/build&amp;gt;
   &amp;lt;/profile&amp;gt;
&amp;lt;/profiles&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;このプロファイルは &lt;code&gt;jacoco&lt;/code&gt; プロパティーによって有効化されます。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bar/deployment&lt;/code&gt; でテストを実行する際に &lt;code&gt;org.acme:foo&lt;/code&gt; をインストゥルメントします。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bar/deployment&lt;/code&gt; でテストを実行する際に &lt;code&gt;org.acme:bar&lt;/code&gt; をインストゥルメントします。&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;同様に &lt;code&gt;my-extension-project/foo/pom.xml&lt;/code&gt; を修正し、&lt;code&gt;mvn clean test -Djacoco&lt;/code&gt; を実行するだけです。ビルドが完了すると、&lt;code&gt;my-extension-project/target/coverage&lt;/code&gt; ディレクトリにあるコードカバレッジレポートを分析できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
Quarkus の JaCoCo 設定は、&lt;code&gt;@QuarkusTest&lt;/code&gt; または &lt;code&gt;@QuarkusUnitTest&lt;/code&gt; のアノテーションが付いたテストに対してのみ機能します。それ以外のテストのカバレッジも確認したい場合は、JaCoCo Maven プラグインにフォールバックする必要があります。詳細については、https://quarkus.io/guides/tests-with-coverage#coverage-for-tests-not-using-quarkustest[ドキュメント]を参照してください。
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot;&gt;&lt;/a&gt;まとめ&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.31.2 以降、Quarkus エクステンションのランタイムモジュールのコードカバレッジを測定し、分析できるようになりました。テストスイートを改善し、リリース前に多くのバグを発見し、より多くのリグレッションを捕捉しましょう。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Tue, 10 Feb 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-test-coverage-extensions/
            </guid>
            
            
            
            <author>Martin Kouba (https://twitter.com/martunek)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.31.2 - メンテナンスリリース</title>
            <link>
                https://quarkus.io/blog/quarkus-3-31-2-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;本日、3.31 ストリームで最初のメンテナンスリリースである Quarkus 3.31.2 をリリースしました (3.31.0 はスキップしました)。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.31 にアップデートするには、Quarkus CLI の最新バージョンにアップデートして、以下を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なお、&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus のあらゆるバージョン (2.x を含む) から Quarkus 3.31 にアプリケーションをアップデートできます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整に関する詳細情報については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.31&quot;&gt;Quarkus 3.31 移行ガイド&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.31.2&quot;&gt;3.31.2&lt;/a&gt; の完全な変更履歴は GitHub で確認できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 04 Feb 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-31-2-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.31 - フルJava 25サポート、Quarkus Mavenパッケージング、Panache Next、その他！</title>
            <link>
                https://quarkus.io/blog/quarkus-3-31-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;前回の機能リリースから2ヶ月が経ち、Quarkus 3.31の提供開始を発表できることを嬉しく思います！&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.31には、多くの新機能と改善が含まれています:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;フルJava 25サポート&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51587&quot;&gt;#51587&lt;/a&gt; - Quarkus Mavenパッケージングと関連するライフサイクルの導入&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/50058&quot;&gt;#50058&lt;/a&gt; - 開発者エクスペリエンスが向上し、Hibernate ORMとHibernate Reactiveの両方に新機能が追加された次世代PanacheであるPanache Nextの導入&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/50519&quot;&gt;#50519&lt;/a&gt; - Hibernate ORM 7.2、Reactive 3.2、Search 8.2、クライアント/サーバー向けElasticsearch 9.2 / OpenSearch 3.3 (dev services) へのアップグレード&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51586&quot;&gt;#51586&lt;/a&gt; - Hibernate Spatial のサポート&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51314&quot;&gt;#51314&lt;/a&gt; - Testcontainers 2 へのアップグレード&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51412&quot;&gt;#51412&lt;/a&gt; - JUnit 6 へのアップグレード&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/50987&quot;&gt;#50987&lt;/a&gt; - Jakarta Data リポジトリーにおけるセキュリティアノテーションのサポート&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51188&quot;&gt;#51188&lt;/a&gt; - REST Data Panache エンドポイントでの &lt;code&gt;@PermissionsAllowed&lt;/code&gt; セキュリティアノテーションのサポート&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51220&quot;&gt;#51220&lt;/a&gt; - カスタム TokenStateManager 実装向けのOIDCトークンの暗号化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51383&quot;&gt;#51383&lt;/a&gt; - トークン向けのOIDC DBトークンステートマネージャーカラムサイズの設定を許可&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51743&quot;&gt;#51743&lt;/a&gt; - 個々の動的GraphQLクライアント向けOIDCクライアントの選択を許可&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51679&quot;&gt;#51679&lt;/a&gt; - スケジュールされたタスクにユーザーとロールを割り当てることを許可&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51799&quot;&gt;#51799&lt;/a&gt; - OIDCエクステンションへのOAuth 2.0 Pushed Authorization Requestsのサポート追加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/50603&quot;&gt;#50603&lt;/a&gt; - ネイティブイメージ向けWindowsでのヘッドレスAWTの有効化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51736&quot;&gt;#51736&lt;/a&gt; - QuarkusプロジェクトにはMaven 3.9.0+を要求&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51049&quot;&gt;#51049&lt;/a&gt; - Dev UIにi18nを追加&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;いつものように、このリリースには、素晴らしいコミュニティーのおかげで、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51891&quot;&gt;2020年に作成された非常に古い問題&lt;/a&gt; の修正を含む、多くのバグ修正も含まれています！&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このバージョンにはいくつかの重要な変更が含まれているため、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.31&quot;&gt;移行ガイド&lt;/a&gt; を参照することを強くお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.31に更新するには、Quarkus CLIの最新バージョンに更新して、以下を実行することをお勧めします:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkusの任意のバージョン（2.xを含む）からQuarkus 3.31にアプリケーションを更新できることに注意してください。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに行う必要がある調整の詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.31&quot;&gt;Quarkus 3.31移行ガイド&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;whats-new&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-new&quot;&gt;&lt;/a&gt;変更点&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;full-support-for-java-25&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-support-for-java-25&quot;&gt;&lt;/a&gt;Java 25のフルサポート&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.31は、Java 25ランタイムイメージおよびMandrelを使用したネイティブイメージビルドを含む、Java 25のフルサポートを追加します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java 25で新しいプロジェクトを作成すると、プロジェクトはデフォルトでJava 25を完全にターゲットとします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java 25でQuarkusアプリケーションを実行する際の互換性を確保し、可能な限り多くの警告を回避するために懸命に取り組みました。そこに表示されるべきではない警告を含む問題に遭遇した場合は、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;バグトラッカー&lt;/a&gt; に報告してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;new-quarkus-maven-packaging-and-lifecycle&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-quarkus-maven-packaging-and-lifecycle&quot;&gt;&lt;/a&gt;新しいQuarkus Mavenパッケージングとライフサイクル&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;数ヶ月前、私たちはビルドを高速化することに取り組み始めました（詳細については、この &lt;a href=&quot;https://quarkus.io/blog/building-large-applications/&quot;&gt;ブログ記事&lt;/a&gt; を参照してください）。Quarkus 3.31では、より統合され、大幅に効率的なビルドライフサイクルを提供するように設計された、 &lt;code&gt;quarkus&lt;/code&gt; と呼ばれる新しいMavenパッケージングタイプを導入しています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;言い換えれば、私たちはデフォルトのMaven &lt;code&gt;jar&lt;/code&gt; ライフサイクルから離れ、Quarkusアプリケーションに最適化されたQuarkus固有のライフサイクルを導入し、ほとんどの場合に不要なゴールの実行を回避します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これは新しく作成されるQuarkusプロジェクトのデフォルトであり、既存のプロジェクトでも使用できます（詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.31#new-quarkus-packaging-and-maven-lifecycle&quot;&gt;移行ガイド&lt;/a&gt; を参照してください）。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;larger-applications&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#larger-applications&quot;&gt;&lt;/a&gt;大規模なアプリケーション&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;この「高速ビルド」の取り組みは、大規模なアプリケーションにとって特に有益であり、非常に大規模なアプリケーションを作成する際の最新のボトルネックの1つを軽減しました。それは、アプリケーション内のCDI Beanの数がビルド中にクラスファイルの制限に達する可能性があったことです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.31では、CDI Beanの数によって制限されることはもうありません。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;panache-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#panache-next&quot;&gt;&lt;/a&gt;Panache Next&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;QuarkusでHibernate ORMを使用している場合、おそらくHibernate ORM with Panacheについてはすでにご存知でしょう。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Panache Nextは、より良い開発者エクスペリエンスと新機能をもたらす次世代のPanacheです。現在のPanache実装と同じ基盤となる概念に依拠しつつ、Panache Nextはより直感的なAPI、改善された型安全性、および強化されたクエリ機能を提供します。また、Hibernate ORMとHibernate Reactive、ステートフルおよびステートレスセッション間のプログラミングモデルを統一し、開発者がそれらを簡単に切り替えられるようにします。最後に、Jakarta Dataとシームレスに統合されます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;さらに多くのことを言うべきですが、最善は &lt;a href=&quot;https://quarkus.io/guides/hibernate-panache-next&quot;&gt;ドキュメント&lt;/a&gt; を見て試してみることです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これはまだ実験的な段階であり、皆様からのフィードバックをお待ちしております。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;hibernate&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hibernate&quot;&gt;&lt;/a&gt;Hibernate ORM&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.31は、Hibernate ORMを7.2、Hibernate Reactiveを3.2、Hibernate Searchを8.2、Elasticsearch/OpenSearchクライアントおよびサーバーをそれぞれ9.2/3.3にアップグレードします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;また、Hibernate Spatialのサポートも導入され、開発者はQuarkusアプリケーションで空間データ型を操作し、空間クエリを実行できるようになります。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;junit-6-and-testcontainers-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#junit-6-and-testcontainers-2&quot;&gt;&lt;/a&gt;JUnit 6とTestcontainers 2&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;JUnit 6（更新は比較的簡単）とTestcontainers 2（より多くの破壊的変更を伴う）にアップグレードしました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;quarkus-junit5&lt;/code&gt; エクステンションは &lt;code&gt;-junit&lt;/code&gt; に名前が変更されました。既存のプロジェクトを壊さないようにリロケーションが設定されています。 &lt;code&gt;quarkus update&lt;/code&gt; を使用して自動的に更新してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;security&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#security&quot;&gt;&lt;/a&gt;セキュリティー&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;セキュリティの改善なしにQuarkusリリースがあるでしょうか？&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このリリースには、当社のセキュリティエクステンションに対する多くの改善が含まれており、以下を含みます:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/50987&quot;&gt;#50987&lt;/a&gt; - Jakarta Data リポジトリーにおけるセキュリティアノテーションのサポート&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51188&quot;&gt;#51188&lt;/a&gt; - REST Data Panache エンドポイントでの &lt;code&gt;@PermissionsAllowed&lt;/code&gt; セキュリティアノテーションのサポート&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51220&quot;&gt;#51220&lt;/a&gt; - カスタム TokenStateManager 実装向けのOIDCトークンの暗号化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51383&quot;&gt;#51383&lt;/a&gt; - トークン向けのOIDC DBトークンステートマネージャーカラムサイズの設定を許可&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51743&quot;&gt;#51743&lt;/a&gt; - 個々の動的GraphQLクライアント向けOIDCクライアントの選択を許可&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51679&quot;&gt;#51679&lt;/a&gt; - スケジュールされたタスクにユーザーとロールを割り当てることを許可&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51799&quot;&gt;#51799&lt;/a&gt; - OIDCエクステンションへのOAuth 2.0 Pushed Authorization Requestsのサポート追加&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;maven-3-9-required&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#maven-3-9-required&quot;&gt;&lt;/a&gt;Maven 3.9が必須&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusアプリケーションをビルドするには、Maven 3.9が必須になりました。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;headless-awt-on-windows-for-native-images&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#headless-awt-on-windows-for-native-images&quot;&gt;&lt;/a&gt;ネイティブイメージでのWindowsにおけるヘッドレスAWT&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;AWTエクステンションに、ネイティブイメージでのWindowsにおけるヘッドレスAWTのサポートを追加しました。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;i18n-for-dev-ui&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#i18n-for-dev-ui&quot;&gt;&lt;/a&gt;Dev UIのI18N&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Dev UIが国際化されました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;翻訳の改善や新しい言語の追加への貢献を歓迎します。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.31.0.CR1&quot;&gt;3.31.0.CR1&lt;/a&gt; 、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.31.0&quot;&gt;3.31.0&lt;/a&gt; 、および &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.31.1&quot;&gt;3.31.1&lt;/a&gt; の完全な変更履歴はGitHubで確認できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot;&gt;&lt;/a&gt;コントリビューター&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusコミュニティは成長を続けており、現在 &lt;a href=&quot;https://github.com/quarkusio/quarkus/graphs/contributors&quot;&gt;1153名の貢献者&lt;/a&gt; がいます。各貢献者の皆様に深く感謝いたします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;特に3.31リリースでは、Ales Justin、Alexandre Dutra、Alexey Loubyansky、Andrea Boriero、Andy Damevin、Anis Da Silva Campos、Aurea Munoz、Aurélien Pupier、Bastian、Brian Setz、Bruno Baptista、cfitzw、Chihiro Ito、Chris Laprun、Christian Pieczewski、Clement Escoffier、dancer13、David M. Lloyd、Dione de Souza Silva、Evgeny Potapov、Fedor Dudinsky、Foivos Zakkak、Fouad Almalki、Francesco Nigro、Galder Zamarreño、George Gastaldi、Georgios Andrianakis、Guillaume Smet、Holly Cummins、Jakub Pietrzak、James Netherton、Jan Martiska、Jan Schatteman、Jeff Mesnil、Jens Teglhus Møller、Jiri Ondrusek、Julien Ponge、Karm Michal Babacek、Katia Aresti、Ladislav Thon、Lars、Lars Andringa、lloydmeta、Luca Molteni、Lucas、Lucas Pottersky、Lukas Lowinger、Maciej Lisowski、Marco Belladelli、Marco Sappé Griot、mariofusco、marko-bekhta、Martin Bartoš、Martin Kouba、Martin Ocenas、Martin Panzer、Matheus Cruz、matthaios.stavrou、Melloware、Michael Edgar、Michal Vavřík、Nicolo Pietro Belcastro、Olivier V、Ozan Gunalp、Phillip Krüger、Quark、Roberto Cortez、Rolf Thorup、Rolfe Dlugy-Hegwer、Rostislav Svoboda、Sanne Grinovero、Sergey Beryozkin、Severin Gehwolf、shjones、sNiXx、staillebois、Stefan Oehme、Steve Hawkins、Stéphane Épardaud、Teymur Babayev、Thomas Segismont、Thorsten Meinl、Victor Dalosto、Wei Huang、Willem Jan Glerum、xstefank、およびYoann Rodièreに感謝いたします。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-31-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.30.8 - メンテナンスリリース</title>
            <link>
                https://quarkus.io/blog/quarkus-3-30-8-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;本日、Quarkus 3.30 ストリームの新しいメンテナンスリリースである Quarkus 3.30.8 をリリースしました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これは、3.30.7 で導入された OpenTelemetry および MDC データ伝播に影響を与えるリグレッションを修正します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.30 に更新するには、Quarkus CLI の最新バージョンに更新し、以下のコマンドを実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.30 へアプリケーションを更新できることに注意してください。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整の詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.30&quot;&gt;Quarkus 3.30 migration guide&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.30.8&quot;&gt;3.30.8&lt;/a&gt; の完全な変更ログは GitHub で確認できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Fri, 23 Jan 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-30-8-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Quarkus 用コミュニティ版 UBI 8 イメージの提供終了</title>
            <link>
                https://quarkus.io/blog/retiring-ubi8-images/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ご存知の通り、Quarkus はアプリケーションのビルドと実行の両方のために、Red Hat Universal Base Image (UBI) をベースにしたコンテナーイメージを提供しています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.19 以降、Quarkus はコンテナーイメージのデフォルトベースイメージとして UBI 9 を使用しています。コミュニティでメンテナンスしている最古のバージョンが 3.20 LTS であることを踏まえ、2026年3月に Quarkus 用コミュニティ版 UBI 8 イメージの提供を終了することを決定しました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;コミュニティの Quay リポジトリーからイメージを削除することはありませんが、それらのイメージは今後更新されません。これは、UBI 8 に影響を与える CVE の問題が、コミュニティ版 Quarkus UBI 8 イメージでは今後修正されないことを意味します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus アプリケーションのビルドまたは実行にまだ UBI 8 イメージを使用している場合は、できるだけ早く UBI 9 ベースのイメージに移行することを強くお勧めします。UBI 8 に留まる必要がある特定の理由がある場合は、お問い合わせください。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 21 Jan 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/retiring-ubi8-images/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.30.7 - メンテナンスリリース</title>
            <link>
                https://quarkus.io/blog/quarkus-3-30-7-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;本日、Quarkus 3.30.7 をリリースしました。これは 3.30 ストリームの新しいメンテナンスリリースで、いくつかの追加修正と Vert.x のマイクロアップデートが含まれています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.31 は来週リリースされます。2か月にわたる作業の成果ですので、多数の新機能と改善が期待されます！&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.30 に更新するには、Quarkus CLI の最新バージョンに更新してから、以下を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なお、&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.30 へとアプリケーションを更新できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整の詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.30&quot;&gt;Quarkus 3.30 移行ガイド&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.30.7&quot;&gt;3.30.7&lt;/a&gt; の完全な変更ログは GitHub で入手できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 21 Jan 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-30-7-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.27.2 がリリースされました - LTS メンテナンスリリース</title>
            <link>
                https://quarkus.io/blog/quarkus-3-27-2-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;本日、Quarkus 3.27.2 をリリースしました。これは 3.27 LTS ストリームの次のメンテナンスリリースです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このリリースには、バグ修正、ドキュメントの更新、および以下の CVE の修正が含まれています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2025-66560&quot;&gt;CVE-2025-66560&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2025-59432&quot;&gt;CVE-2025-59432&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2025-67735&quot;&gt;CVE-2025-67735&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2025-14969&quot;&gt;CVE-2025-14969&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;3.27 をすでに使用している方にとっては、安全にアップグレードできます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.27 に更新するには、Quarkus CLI の最新バージョンに更新してから、以下を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update --stream=3.27&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.27 にアプリケーションを更新できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.27.2&quot;&gt;3.27.2 の完全な変更履歴を GitHub で取得&lt;/a&gt; できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 21 Jan 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-27-2-released/
            </guid>
            
            
            
            <author>Jan Martiška (https://twitter.com/janmartiska)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.20.5 リリース - LTS メンテナンスリリース</title>
            <link>
                https://quarkus.io/blog/quarkus-3-20-5-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;本日、Quarkus 3.20.5 をリリースしました。これは 3.20 LTS ストリームの次期メンテナンスリリースです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このリリースには、バグ修正、ドキュメントの更新、および以下の CVE に対する修正が含まれています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2025-66560&quot;&gt;CVE-2025-66560&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2025-59432&quot;&gt;CVE-2025-59432&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2025-67735&quot;&gt;CVE-2025-67735&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;3.20 を既に使用している方にとっては、安全なアップグレードとなるはずです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.20 に更新するには、Quarkus CLI の最新バージョンに更新し、以下を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update --stream=3.20&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.20 へアプリケーションを更新できることに注意してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.20.5&quot;&gt;3.20.5 の完全な変更ログは GitHub で入手できます&lt;/a&gt;。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 21 Jan 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-20-5-released/
            </guid>
            
            
            
            <author>Jan Martiška (https://twitter.com/janmartiska)</author>
            
        </item>
        
        <item>
            <title>A2A Java SDK 1.0.0.Alpha1 - 1.0仕様への対応</title>
            <link>
                https://quarkus.io/blog/a2a-java-sdk-1-0-0-alpha1/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/a2aproject/a2a-java/releases/tag/v1.0.0.Alpha1&quot;&gt;A2A Java SDK 1.0.0.Alpha1&lt;/a&gt; のリリースを発表できることを嬉しく思います。このリリースは、今後の1.0バージョンの &lt;a href=&quot;https://github.com/a2aproject/A2A&quot;&gt;Agent2Agent (A2A) プロトコル仕様&lt;/a&gt; に対応する重要なマイルストーンとなります。なお、仕様自体はまだ最終決定段階にあるため、最終的な1.0バージョンまでにいくつかの微妙な変更がある可能性があります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A2Aプロトコルは、AIエージェント間の標準化された通信を可能にし、エージェントが機能を検出し、タスクを委任し、シームレスに連携できるようにします。このSDKは、A2Aエコシステムに参加するエージェントとクライアントの両方を構築するための堅牢なJava実装を提供します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-1-0-matters&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-1-0-matters&quot;&gt;&lt;/a&gt;1.0が重要である理由&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A2A仕様のバージョン1.0への移行は、実験段階から製品対応への移行を示します。仕様が成熟するにつれて、当社は技術的負債を整理し、実装を近代化し、将来にわたって役立つパターンを確立する機会を得ました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;このリリースには破壊的な変更が含まれています。&lt;/strong&gt; 1.0が仕様の最初の「正式な」リリースであるため、当社は0.3.xシリーズとの後方互換性を維持しないという意図的な決定をしました。これにより、レガシーパターンを引き継ぐことなく、強固な基盤の上に構築できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;major-changes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#major-changes&quot;&gt;&lt;/a&gt;主な変更点&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;1-specification-alignment&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1-specification-alignment&quot;&gt;&lt;/a&gt;1. 仕様への対応&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;SDKは現在、プロトコルバージョン &lt;code&gt;1.0&lt;/code&gt; を実装し、最新の &lt;a href=&quot;https://github.com/a2aproject/A2A/blob/main/specification/grpc/a2a.proto&quot;&gt;a2a.proto&lt;/a&gt; 定義に対応しています。主な仕様変更は以下のとおりです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AgentCardの進化&lt;/strong&gt;: &lt;code&gt;AgentCard&lt;/code&gt; は、個別の &lt;code&gt;url&lt;/code&gt;、&lt;code&gt;preferredTransport&lt;/code&gt;、&lt;code&gt;additionalInterfaces&lt;/code&gt; フィールドの代わりに、&lt;code&gt;supportedInterfaces&lt;/code&gt; リストを使用するようになりました。これにより、複数のプロトコルバインディングを宣伝するための、よりクリーンで柔軟な方法が提供されます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;種類識別子の削除&lt;/strong&gt;: 1.0仕様では、&lt;code&gt;kind&lt;/code&gt; フィールドを型識別子として廃止し、プロトコルを簡素化しました。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;エラーハンドリングの改善&lt;/strong&gt;: エラークラスは、1.0仕様のエラーモデルに合うように再設計されました。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;2-modern-java-standardized-on-records&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2-modern-java-standardized-on-records&quot;&gt;&lt;/a&gt;2. モダンJava: レコードへの標準化&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;spec&lt;/code&gt; モジュール全体が、Javaレコードを継続的に使用するように近代化されました。以前は、ドメインモデル全体で従来のクラスとレコードが混在していました。現在、すべてのドメインクラスは不変性と簡潔さのためにレコードを活用し、すべてのゲッターは同じ命名パターンに従います。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;// Before (0.3.x): Mix of classes and records with inconsistent patterns
public class AgentCard {  // Some were classes
    private final String name;
    public String getName() { return name; }  // JavaBean-style getters
}

public record AgentSkill(String id, String name, ...) { }  // Some were already records
// Accessor: skill.name() without &apos;get&apos; prefix

// After (1.0.x): Consistent records throughout
public record AgentCard(
    String name,
    String description,
    AgentProvider provider,
    String version,
    List&amp;lt;AgentInterface&amp;gt; supportedInterfaces,
    String protocolVersion) {

    public static final String CURRENT_PROTOCOL_VERSION = &quot;1.0&quot;;
}

public record AgentSkill(String id, String name, String description, ...) { }

// Uniform accessor pattern throughout: card.name(), skill.name()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;この標準化により、混乱が解消され、ボイラープレートが削減されるとともに、よりクリーンで保守しやすいAPIが提供されます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre&gt;A2A Java SDKは、過去数ヶ月にわたるJSpecifyアノテーションの段階的な採用を通じて、型安全性と **null安全** において大幅な改善がみられました。この取り組みは、コード品質に対するプロジェクトのコミットメントと、コンパイル時におけるNullPointerExceptionの防止を示しています。&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;builder-pattern-with-static-factory-methods&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#builder-pattern-with-static-factory-methods&quot;&gt;&lt;/a&gt;静的ファクトリーメソッドを使用したビルダーパターン&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;すべてのビルダーは、パブリックコンストラクターの代わりに静的ファクトリーメソッドを使用するようになりました。これにより、カプセル化が向上し、最新のJavaのベストプラクティスに従うことができます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;// Before (0.3.x): Public builder constructor
AgentCard card = new AgentCard.Builder()
    .name(&quot;My Agent&quot;)
    .description(&quot;Does things&quot;)
    .build();

// After (1.0.x): Static factory method
AgentCard card = AgentCard.builder()  &lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
    .name(&quot;My Agent&quot;)
    .description(&quot;Does things&quot;)
    .version(&quot;1.0.0&quot;)
    .capabilities(AgentCapabilities.builder()  &lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
        .streaming(true)
        .pushNotifications(false)
        .build())
    .defaultInputModes(List.of(&quot;text&quot;))
    .defaultOutputModes(List.of(&quot;text&quot;))
    .skills(List.of(
        AgentSkill.builder()  &lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
            .id(&quot;weather_query&quot;)
            .name(&quot;Weather Queries&quot;)
            .description(&quot;Get current weather&quot;)
            .build()
    ))
    .supportedInterfaces(List.of(
        new AgentInterface(&quot;JSONRPC&quot;, &quot;http://localhost:9999&quot;)
    ))
    .protocolVersion(AgentCard.CURRENT_PROTOCOL_VERSION)
    .build();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AgentCard.builder()&lt;/code&gt; がビルダーを作成します — コンストラクターは現在プライベートです&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;ネストされたビルダーも静的ファクトリーメソッドを使用します&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;すべての仕様クラスは、このパターンを一貫して踏襲しています&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ビルダーコンストラクターは、宣言クラスで現在プライベートであり、SDK全体で静的ファクトリーメソッドパターンの使用を強制しています。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;3-protocol-buffers-as-source-of-truth&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#3-protocol-buffers-as-source-of-truth&quot;&gt;&lt;/a&gt;3. Protocol Buffersを信頼できる唯一の情報源として&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jacksonへの依存を排除し、プロトコルバッファ (protobuf) をドメインモデルの信頼できる唯一の情報源として確立しました。アーキテクチャは次のとおりです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Protobuf定義&lt;/strong&gt; は &lt;code&gt;a2a.proto&lt;/code&gt; でワイヤーフォーマットを定義します&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Javaレコード&lt;/strong&gt; は &lt;code&gt;spec&lt;/code&gt; モジュールでSDKのAPIを提供します&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MapStructマッパー&lt;/strong&gt; は変換を処理し、protobufと仕様クラスの同期が外れた場合にコンパイルエラーを発生させます&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gson&lt;/strong&gt; はJSON-RPCトランスポートのJSONシリアライゼーションを処理します&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これにより、すべてのトランスポートで型安全性、プロトコルの信頼できる唯一の情報源、およびシリアライゼーションアノテーションでドメインクラスを煩雑にすることなく、ワイヤーフォーマットとAPIのクリーンな分離が提供されます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;4-bill-of-materials-boms&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#4-bill-of-materials-boms&quot;&gt;&lt;/a&gt;4. 部品表 (BOM)&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;依存関係管理を簡素化するためにMaven BOMを導入しました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-xml hljs&quot; data-lang=&quot;xml&quot;&gt;&amp;lt;dependencyManagement&amp;gt;
    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;io.github.a2asdk&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;a2a-java-sdk-bom&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;1.0.0.Alpha1&amp;lt;/version&amp;gt;
            &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;
            &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;
&amp;lt;/dependencyManagement&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;3つのBOMが利用可能です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;a2a-java-sdk-bom&lt;/code&gt;: コアSDKおよびクライアントライブラリ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;a2a-java-extras-bom&lt;/code&gt;: オプションの拡張機能 (JpaDatabaseTaskStore および -PushNotificationStore、レプリケートされたQueueManager、Vert.X HTTPクライアント)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;a2a-java-reference-bom&lt;/code&gt;: Quarkusリファレンス実装&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これにより、複数のSDKモジュールとその依存関係を使用する際のバージョン管理の悩みを解消します。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;5-enhanced-api-documentation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#5-enhanced-api-documentation&quot;&gt;&lt;/a&gt;5. APIドキュメントの強化&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;spec&lt;/code&gt; モジュール内のすべてのクラスには、その目的、使用法、およびA2A仕様との関係を説明する包括的なJavadocが含まれるようになりました。また、&lt;code&gt;server-common&lt;/code&gt; およびすべてのクライアントモジュールにおける統合ポイントの詳細なドキュメントも追加しました。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;6-additional-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#6-additional-improvements&quot;&gt;&lt;/a&gt;6. 追加の改善点&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ページネーションのサポート&lt;/strong&gt;: &lt;code&gt;ListTasks&lt;/code&gt; およびプッシュ通知設定エンドポイントは、適切な &lt;code&gt;Result&lt;/code&gt; ラッパーを使用したページネーションをサポートするようになりました&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;プラガブルHTTPクライアント&lt;/strong&gt;: 新しい &lt;code&gt;A2AHttpClient&lt;/code&gt; インターフェースはカスタムHTTP実装を可能にし、Vert.xベースの実装が提供されています&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;より良い検証&lt;/strong&gt;: すべてのトランスポートで入力検証を強化しました&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;TCKの進捗&lt;/strong&gt;: 1.0 Test Compatibility Kitへの完全な準拠に向けた継続的な取り組み。仕様が最終決定段階にある間、TCKも進行中です。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;breaking-changes-summary&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#breaking-changes-summary&quot;&gt;&lt;/a&gt;破壊的な変更の概要&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;0.3.xから移行する場合、主な破壊的な変更点は次のとおりです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AgentCard構造&lt;/strong&gt;: &lt;code&gt;url&lt;/code&gt; + &lt;code&gt;preferredTransport&lt;/code&gt; を &lt;code&gt;supportedInterfaces&lt;/code&gt; リストに置き換える&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ビルダーパターン&lt;/strong&gt;: &lt;code&gt;new AgentCard.Builder()&lt;/code&gt; の代わりに &lt;code&gt;AgentCard.builder()&lt;/code&gt; を使用する — すべての仕様クラスに適用されます&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;プロトコルバージョン&lt;/strong&gt;: &lt;code&gt;AgentCard.CURRENT_PROTOCOL_VERSION&lt;/code&gt; (現在 &lt;code&gt;&quot;1.0&quot;&lt;/code&gt;) に更新する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;フィールド名の変更&lt;/strong&gt;: &lt;code&gt;supportsAuthenticatedExtendedCard&lt;/code&gt; → &lt;code&gt;supportsExtendedAgentCard&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ゲッターの命名&lt;/strong&gt;: レコードは &lt;code&gt;card.getName()&lt;/code&gt; の代わりに &lt;code&gt;card.name()&lt;/code&gt; を使用します&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;パッケージのクリーンアップ&lt;/strong&gt;: &lt;code&gt;io.a2a.apec&lt;/code&gt; パッケージはトリミングされました&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;シリアル化&lt;/strong&gt;: Jackson のアノテーションに依存していた場合は、Gson パターンに移行してください&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;getting-started&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#getting-started&quot;&gt;&lt;/a&gt;はじめに&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Maven を使用して、BOM と依存関係を追加します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-xml hljs&quot; data-lang=&quot;xml&quot;&gt;&amp;lt;dependencyManagement&amp;gt;
    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;io.github.a2asdk&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;a2a-java-sdk-bom&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;1.0.0.Alpha1&amp;lt;/version&amp;gt;
            &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;
            &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;
&amp;lt;/dependencyManagement&amp;gt;

&amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;io.github.a2asdk&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;a2a-java-sdk-reference-jsonrpc&amp;lt;/artifactId&amp;gt;
    &amp;lt;/dependency&amp;gt;
&amp;lt;/dependencies&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;エージェントの作成には、&lt;code&gt;AgentCard&lt;/code&gt; と &lt;code&gt;AgentExecutor&lt;/code&gt; の生成が必要です。&lt;code&gt;@PublicAgentCard&lt;/code&gt; 修飾子は、検出のエントリポイントとして機能する公開エージェントカードをマークします。これは、クライアントがエージェントを検出する際に取得するものです。また、追加の認証情報を含む拡張エージェントカードを提供することもできます。以下に最小限の例を示します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;@ApplicationScoped
public class MyAgentCardProducer {
    @Produces @PublicAgentCard
    public AgentCard agentCard() {
        return AgentCard.builder()
            .name(&quot;Weather Agent&quot;)
            .description(&quot;Provides weather information&quot;)
            .version(&quot;1.0.0&quot;)
            .capabilities(AgentCapabilities.builder()
                .streaming(true)
                .pushNotifications(false)
                .build())
            .defaultInputModes(List.of(&quot;text&quot;))
            .defaultOutputModes(List.of(&quot;text&quot;))
            .skills(List.of(
                AgentSkill.builder()
                    .id(&quot;weather_query&quot;)
                    .name(&quot;Weather Queries&quot;)
                    .description(&quot;Get current weather for a location&quot;)
                    .build()
            ))
            .protocolVersion(AgentCard.CURRENT_PROTOCOL_VERSION)
            .supportedInterfaces(List.of(
                new AgentInterface(&quot;JSONRPC&quot;, &quot;http://localhost:9999&quot;)
            ))
            .build();
    }
}

@ApplicationScoped
public class MyAgentExecutorProducer {
    @Produces
    public AgentExecutor agentExecutor() {
        return new MyAgentExecutor();
    }

    private static class MyAgentExecutor implements AgentExecutor {
        @Override
        public void execute(RequestContext context, EventQueue eventQueue) {
            TaskUpdater updater = new TaskUpdater(context, eventQueue);
            updater.submit();
            updater.startWork();

            // Your agent logic here
            String response = &quot;Current weather: Sunny, 72°F&quot;;

            updater.addArtifact(List.of(new TextPart(response, null)));
            updater.complete();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;完全な例については、リポジトリ内の &lt;a href=&quot;https://github.com/a2aproject/a2a-java/tree/main/examples/helloworld&quot;&gt;Hello World の例&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;looking-forward&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#looking-forward&quot;&gt;&lt;/a&gt;今後の展望&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このアルファ版リリースにより、安定版の 1.0 SDK に大きく近づきました。今後のリリースにおける主要な焦点は以下のとおりです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1.0 TCK テストスイートへの完全な準拠&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;実世界の利用状況に基づいたパフォーマンスの最適化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;追加の例と統合ガイド&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;シームレスな Jakarta EE 統合のための WildFly Feature Pack&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A2A 仕様自体も 1.0 リリースに向けて進化を続けています。私たちは仕様策定プロセスに積極的に参加しており、仕様が最終化されるにつれて SDK の調整を継続していきます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;get-involved&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#get-involved&quot;&gt;&lt;/a&gt;参加する&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;貢献、フィードバック、実世界の利用状況レポートを歓迎します。AI エージェントを構築している方や、マルチエージェントアーキテクチャを検討している方にとって、A2A Java SDK は堅牢な基盤を提供します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;リポジトリ&lt;/strong&gt;: &lt;a href=&quot;https://github.com/a2aproject/a2a-java&quot; class=&quot;bare&quot;&gt;https://github.com/a2aproject/a2a-java&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;例&lt;/strong&gt;: &lt;a href=&quot;https://github.com/a2aproject/a2a-java/tree/main/examples&quot; class=&quot;bare&quot;&gt;https://github.com/a2aproject/a2a-java/tree/main/examples&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;仕様&lt;/strong&gt;: &lt;a href=&quot;https://github.com/a2aproject/A2A&quot; class=&quot;bare&quot;&gt;https://github.com/a2aproject/A2A&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;課題&lt;/strong&gt;: &lt;a href=&quot;https://github.com/a2aproject/a2a-java/issues&quot; class=&quot;bare&quot;&gt;https://github.com/a2aproject/a2a-java/issues&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;1.0.0.Alpha1 を試して、エージェントのユースケースにどのように機能するかをお知らせください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Mon, 19 Jan 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/a2a-java-sdk-1-0-0-alpha1/
            </guid>
            
            
            
            <author>Kabir Khan (https://twitter.com/kabirkhan)</author>
            
        </item>
        
        <item>
            <title>Quarkus ニュースレター #64 - 1月</title>
            <link>
                https://quarkus.io/blog/quarkus-newsletter-64/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Markus Eisele による素晴らしい記事「Why Quarkus Finally “Clicks”: The 10 Questions Java Developers Ask Most」をご覧ください。これは、カンファレンスやミートアップ、The Main Thread コミュニティでの実際の会話に基づいた優れたフィールドガイドです。Stéphane Épardaud による「Quarkus Hibernate with Panache Next」を読んで、Hibernate ORM with Panache と Hibernate Reactive with Panache の両方を統合する新しい Hibernate with Panache エクステンションについて学びましょう。モダンでデータ指向のアプリケーション設計に関する完全なハンズオンチュートリアルが必要ですか？Markus Eisele が「Build Event-Sourced Systems in Quarkus with Java Records and CQRS」でその方法を解説しています。Stéphane Philippart のブログ投稿をチェックして、Jekyll ブログを Quarkus Roq に移行する方法と理由を学びましょう。Markus Eisele による「Modern Java Meets Native Power: Image Processing with the FFM API in Quarkus」を読んで、Java 25 が ImageMagick とどのように統合され、高速で安全な、JNI を使用しないネイティブワークフローを実現するかを見てみましょう。設定プロパティーに基づいて Quarkus アプリケーション内のすべてのエンドポイントを無効にする簡単な方法が必要ですか？Damir Arh の投稿「Disable Quarkus endpoints with a request filter」をチェックして、素晴らしい指示を得ましょう。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;また、最新の Quarkus Insights エピソード、注目のツイート/ディスカッション、および今後の Quarkus 参加イベントもご覧いただけます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkus.io/newsletter/64/&quot;&gt;ニュースレター #64: 1月&lt;/a&gt; をチェックしてください！&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ニュースレターを受信してみませんか？ページ上のフォームを使って &lt;a href=&quot;https://quarkus.io/newsletter&quot;&gt;ニュースレターに登録&lt;/a&gt; してください。&lt;/p&gt;
&lt;/div&gt;
            </description>
            <pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-newsletter-64/
            </guid>
            
            
            
            <author>James Cobb (https://twitter.com/insectengine)</author>
            
        </item>
        
        <item>
            <title>より高速なビルドに向けて</title>
            <link>
                https://quarkus.io/blog/building-large-applications/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusを最初にリリースしたとき、業界はマイクロサービスに大きく焦点を当てており、それが私たちの主なターゲットでした。しかし、Quarkusは、既存のアプリケーションをよりモダンなランタイムに移行する場合でも、新しいアプリケーションをゼロから構築する場合でも、大規模なモノリスにも完全に適しています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusは常に大規模なアプリケーションを処理できましたが、特にビルド時間に関しては、この分野で最近大幅な改善を行いました。この記事では、これらの改善点の一部を詳しく説明します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-the-story-started&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-the-story-started&quot;&gt;&lt;/a&gt;物語の始まり&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;昔々、私は大規模なモノリスを構築するためのSpring BootとQuarkusを比較した記事 &lt;a href=&quot;https://zestedesavoir.com/billets/4876/quarkus-spring-boot-et-les-monolithes/&quot;&gt;（フランス語で書かれているため、フランス語を話さない方には申し訳ありませんが、結果はほぼ自明です）&lt;/a&gt; に出会いました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;その記事では、同じ機能を実装するSpring BootアプリケーションとQuarkusアプリケーションを比較し、両方のアプリケーションを作成するためのジェネレーターも含まれていました。生成されるアプリケーションはシンプルで、いくつかのエンティティ、RESTサービス、典型的なCRUDエンドポイントを備えています。非常に興味深かったのは、エンティティとサービスの数を簡単にスケールアップして、両方のフレームワークがより大規模なアプリケーションをどのように処理するかを確認できたことです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;この種​​のフィードバックは本当に貴重です。改善すべき領域を特定するのに役立つだけでなく、それらを探求するための再現可能な方法も提供してくれるからです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;予想どおり、Quarkusはメモリー消費と起動時間で優れていました。しかし、ビルド時間はSpring Bootよりも著しく高かったです。これもまた驚くことではありませんでした。結局のところ、Quarkusはより多くの作業をビルド時に移行します。しかし、その差はそれでも詳しく調べるに値するほど大きかったのです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;手短に言えば、私たちは調査し、大幅に改善しました。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;thanks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thanks&quot;&gt;&lt;/a&gt;謝辞&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;まず、元の記事の著者であるSpaceFox氏に、執筆とこのような有用なジェネレーターを提供していただいたことに対し、感謝いたします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusの世界ではよくあることですが、この道のりにおいて私は一人ではありませんでした。したがって、コード、議論、レビュー、洞察、フィードバックを通じて貢献してくださったすべての方々に感謝したいと思います。アルファベット順に、Tamás Cservenák、Sanne Grinovero、Martin Kouba、David Lloyd、Alexey Loubyansky、Matej Novotny、Yoann Rodière、Ladislav Thon (もし漏れがありましたら、お知らせください！) に感謝します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これは主要なQuarkusの作業を対象としていますが、後述するように、 &lt;a href=&quot;https://github.com/smallrye/smallrye-open-api&quot;&gt;SmallRye OpenAPIプロジェクト&lt;/a&gt; にもいくつかの改善が加えられました。これらの貢献に対して、Mike Edgar氏とMartin Panzer氏に感謝いたします。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;our-journey-to-faster-builds&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#our-journey-to-faster-builds&quot;&gt;&lt;/a&gt;より高速なビルドへの道のり&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;この種の道のりには、当然ながらプロファイリングやフレームグラフを見つめる作業がつきものです。ホットスポットを見つけるだけでなく、自分の変更が実際に状況を改善するのか (願わくば正しい方向に！) 評価することも重要です。Javaの世界では、 &lt;a href=&quot;https://github.com/async-profiler/async-profiler&quot;&gt;Async Profiler&lt;/a&gt; のような強力なツールをそばに持つ幸運に恵まれてきました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;他の最適化の取り組みと同様に、賢明に戦いを選択し、避けられないトレードオフを慎重に検討することが鍵となります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;code-optimizations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#code-optimizations&quot;&gt;&lt;/a&gt;コード最適化&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ビルドプロセスの様々な部分を最適化するために多大な努力が注がれました。メモリー割り当ての削減、アルゴリズムとデータ構造の最適化がその大きな部分を占めていました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;この作業により、Quarkus、Jandex、さらにはByteBuddyにわたる多数のプルリクエストが生まれました。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;parallelization&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#parallelization&quot;&gt;&lt;/a&gt;並列化&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私たちのビルドプロセスは既に大規模に並列化されていますが、Hibernate ORMプロキシの生成など、並列化されていなかったいくつかの領域を特定しました。私たちはそれを修正しました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;もう一つの改善点は、大規模なJARアーカイブの作成でした。これは、大量のリソースを読み取り、圧縮することを含むため、本質的に低速であり、I/OとCPUの両方を大量に消費します。これまで、私たちはZipFileSystemを使用して、シングルスレッドでリソースを一つずつ追加しながらJARを構築していました。それ以来、Commons Compressが提供する並列圧縮サポートを使用するように切り替えました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;この変更には、JARアセンブリコードのかなりの大規模なリファクタリングが必要でしたが、それだけの価値は十分にありました。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;doing-less&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#doing-less&quot;&gt;&lt;/a&gt;無駄をなくす&lt;/h3&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;他のすべての最適化はGradleビルドにも同様にメリットをもたらしますが、以下の変更はMavenのデフォルトライフサイクルに関連するため、Mavenに固有のものです。&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;これらすべての最適化により、&lt;code&gt;quarkus-maven-plugin&lt;/code&gt; の様々なゴールに費やされる時間は、参照バージョン3.25.1と比較して半分に短縮されました。&lt;/strong&gt; これは素晴らしいことですが、サンプルアプリケーションのビルドには依然として約2分かかり、これは望ましい時間よりも長いです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;一歩引いて、全体像を見る時が来ました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusアプリケーションの場合、主に次の2つの理由で独自のJARを構築します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;追加のリソースとメタデータを含める必要があります。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;起動時間を改善するために設計されたカスタムJARパッケージを導入しました。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これは、Commons Compressが提供する並列圧縮サポートを活用することで最適化したプロセスです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;しかし、Mavenを使用する場合、Quarkusアプリケーションは依然として従来の &lt;code&gt;jar&lt;/code&gt; Mavenプロジェクトです。これは &lt;code&gt;jar&lt;/code&gt; パッケージングの標準ライフサイクルに従うため、Mavenは &lt;code&gt;maven-jar-plugin&lt;/code&gt; を使用して従来のJARもビルドします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;一歩引いて考えると、実際にはこのJARは99%のケースで必要ありません。したがって、構築を避けるべきです（ただし、絶対に必要な場合はその柔軟性を維持します）。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.31では、独自のライフサイクルを持つ &lt;code&gt;quarkus&lt;/code&gt; パッケージングを導入しました。このパッケージングは、Quarkusアプリケーションモジュール自体にのみ使用されることを意図しています。これにより、&lt;code&gt;quarkus-maven-plugin&lt;/code&gt; のゴールが自動的にバインドされ、&lt;code&gt;pom.xml&lt;/code&gt; のボイラープレートが減り（新しいゴールが追加されても変更は不要）、さらに重要なことに、&lt;code&gt;maven-jar-plugin&lt;/code&gt; の実行も &lt;code&gt;maven-install-plugin&lt;/code&gt; もバインドされません。これにより、大規模なアプリケーションのビルドが大幅に高速化され、すべてのアプリケーションに全体的なメリットをもたらします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;新しく生成されるアプリケーションでは、この新しい &lt;code&gt;quarkus&lt;/code&gt; パッケージングがデフォルトになります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;3.31がリリースされたら、既存のアプリケーションを新しいパッケージングに切り替えるために、以下の変更を適用することもできます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-diff hljs&quot; data-lang=&quot;diff&quot;&gt;diff --git a/pom.xml b/pom.xml
index 98660b8..3c60220 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,6 +5,7 @@
     &amp;lt;groupId&amp;gt;fr.spacefox.perftests.quarkus&amp;lt;/groupId&amp;gt;
     &amp;lt;artifactId&amp;gt;perftests-quarkus&amp;lt;/artifactId&amp;gt;
     &amp;lt;version&amp;gt;1.0.0-SNAPSHOT&amp;lt;/version&amp;gt;
+    &amp;lt;packaging&amp;gt;quarkus&amp;lt;/packaging&amp;gt; &lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;

     &amp;lt;properties&amp;gt;
         &amp;lt;compiler-plugin.version&amp;gt;3.14.0&amp;lt;/compiler-plugin.version&amp;gt;
@@ -66,16 +67,6 @@
                 &amp;lt;artifactId&amp;gt;quarkus-maven-plugin&amp;lt;/artifactId&amp;gt;
                 &amp;lt;version&amp;gt;${quarkus.platform.version}&amp;lt;/version&amp;gt;
                 &amp;lt;extensions&amp;gt;true&amp;lt;/extensions&amp;gt; &lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
-                &amp;lt;executions&amp;gt; &lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
-                    &amp;lt;execution&amp;gt;
-                        &amp;lt;goals&amp;gt;
-                            &amp;lt;goal&amp;gt;build&amp;lt;/goal&amp;gt;
-                            &amp;lt;goal&amp;gt;generate-code&amp;lt;/goal&amp;gt;
-                            &amp;lt;goal&amp;gt;generate-code-tests&amp;lt;/goal&amp;gt;
-                            &amp;lt;goal&amp;gt;native-image-agent&amp;lt;/goal&amp;gt;
-                        &amp;lt;/goals&amp;gt;
-                    &amp;lt;/execution&amp;gt;
-                &amp;lt;/executions&amp;gt;
             &amp;lt;/plugin&amp;gt;
             &amp;lt;plugin&amp;gt;
                 &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;デフォルトの &lt;code&gt;jar&lt;/code&gt; パッケージングの代わりに &lt;code&gt;quarkus&lt;/code&gt; パッケージングを使用します。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;これは重要であり、生成されたプロジェクトにはかなり前から存在しています。まだ存在しない場合は追加してください。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;ゴールは削除してください。これらは自動的に処理されるため、二重に実行する必要はありません。&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;その影響のアイデアを示すと、私たちのサンプル大規模アプリケーションでは、&lt;strong&gt;この変更だけでビルド時間が2分から37秒に短縮されました&lt;/strong&gt;。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;follow-ups&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#follow-ups&quot;&gt;&lt;/a&gt;その後の展開&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;smallrye-openapi&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#smallrye-openapi&quot;&gt;&lt;/a&gt;SmallRye OpenAPI&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;2025年11月、私は最初のQuarkusコミュニティコールでこの作業の一部を発表しました（コミュニティコールの詳細については &lt;a href=&quot;https://github.com/quarkusio/quarkus/discussions/50682&quot;&gt;こちら&lt;/a&gt; を参照してください）。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このプレゼンテーションに続いて、私たちの常連コミュニティ貢献者の一人であるMartin Panzer氏が、大規模アプリケーションのビルドがいかに遅くなるかを示す &lt;a href=&quot;https://github.com/smallrye/smallrye-open-api/issues/2401&quot;&gt;SmallRye OpenAPIプロジェクトの課題&lt;/a&gt; を提起しました。彼は堅牢な再現手順を提供し、これによりMike Edgar氏が、SmallRye OpenAPIが全体のビルド時間にもたらす貢献を大幅に削減するいくつかの改善を実装することができました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;これらの変更はQuarkusのビルド時間に直接的な利益をもたらしますが、SmallRye OpenAPIは他のランタイムでも使用されているため、より広範なJavaエコシステムにも良い影響を与えるでしょう。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;要点はシンプルです。何かおかしいことに気づいたら報告してください。私たちはそれを改善できるかもしれません。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-infamous-classtoolargeexception&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-infamous-classtoolargeexception&quot;&gt;&lt;/a&gt;悪名高き ClassTooLargeException&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusでは、かなりの量のバイトコードを生成します。大規模なアプリケーションでは注意が必要で、規模が大きくなると、生成されたバイトコードが特定の制限（例えば、メソッドサイズやクラスサイズの制限）に達する可能性があります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;元のフランス語の記事では、特定の規模でこのような制限に達したことが述べられていました。公平に言えば、その規模はすでにかなり大きいものでしたが、あるクラスがたまたま限界を超えたというだけで、任意の制限に遭遇するのは理想的ではありません。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私たちは最近この制限を緩和し、Quarkusはより大規模なアプリケーションを扱えるようになりました。この改善もQuarkus 3.31で利用可能になります。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;java-25&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java-25&quot;&gt;&lt;/a&gt;Java 25&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;最近、私たちはバイトコード生成のほとんどを、Class-File API を基盤とする Gizmo 2 を使用するように書き換えました。この作業はまだ進行中ですが、当社の CDI 実装である ArC などの主要コンポーネントはすでにこれに依存しています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java 17 と 21 との互換性を維持するため、現在は Class-File API のバックポートを使用していますが、Class-File API は基盤となる JDK の一部のクラスに依存しています。これらのクラスのいくつかは Java 25 で大幅な最適化が施されており、その結果、Java 25 で実行するとバイトコード生成のパフォーマンスが著しく向上します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.31 は Java 25 の完全なサポートを提供する予定であるため、これらのパフォーマンス向上を活用し、アプリケーションのビルドにこれを使用することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot;&gt;&lt;/a&gt;まとめ&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus は常に開発者エクスペリエンスの限界を押し広げてきました。私たちは開発モードを導入し、Dev Services のコンセプトを開拓するなど、多くのことを実現してきました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;しかし、開発者エクスペリエンスを向上させることは、時には基本に立ち返ることを意味します。つまり、ビルド時間です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;まさにそこに私たちは注力しました。Quarkus アプリケーションをより速く（そしてより環境に優しく！）ビルドすることを楽しんでいただければ幸いです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;もしビルドプロセスの改善にさらなる機会を見つけられた場合は、遠慮なく課題をオープンしてください。私たちは常に新しいアイデアを歓迎しています。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Tue, 13 Jan 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/building-large-applications/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.30.6 - メンテナンスリリース</title>
            <link>
                https://quarkus.io/blog/quarkus-3-30-6-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;本日、Quarkus 3.30 ストリームの新しいメンテナンスリリースである Quarkus 3.30.6 をリリースしました。これは、2026 年最初のリリースとなります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.31 は今月末にリリースされる予定です。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.30 にアップデートするには、Quarkus CLI の最新バージョンにアップデートし、以下を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.30 にアプリケーションを更新できることに注意してください。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整の詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.30&quot;&gt;Quarkus 3.30 マイグレーションガイド&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.30.6&quot;&gt;3.30.6&lt;/a&gt; の完全な変更履歴は GitHub で確認できます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 07 Jan 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-30-6-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Dev Services のより優れた作成方法</title>
            <link>
                https://quarkus.io/blog/new-dev-services-api/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.25 では、 &lt;a href=&quot;https://quarkus.io/guides/dev-services&quot;&gt;Dev Services&lt;/a&gt; を作成するための新しい API が導入されました。この新しいモデルは、すべてのテストのためのすべての Dev Services が JUnit のディスカバリーフェーズで開始され、ポートの競合、設定の混信、および過剰なリソース消費を引き起こす可能性があるという問題を修正します。この問題は、Quarkus 3.22 における &lt;a href=&quot;/blog/test-classloading-rewrite&quot;&gt;テストクラスローディングの書き換え&lt;/a&gt; の副作用でした。リソース消費の削減に加え、この API がエクステンション開発者にとって Dev Services の作成をよりシンプルにし、ディスカバリーの管理やコンテナーの再利用といった重い処理の一部を Quarkus コアに移行させることも期待しています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-changes-for-users&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-changes-for-users&quot;&gt;&lt;/a&gt;ユーザーにとっての変更点&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ユーザー側で必要なアクションはありません。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;複数のプロファイルやテストリソースを使用するテストスイートがある場合、重複するコンテナーが同時にアクティブになることはなくなります。コンテナーは順番に起動するようになります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ただし、これは各エクステンションを新しいモデルに変換する必要があるため、エクステンションに依存します。これまでに Redis、Lambda、Narayana、Kafka のエクステンションが変換されました。変換の進捗状況は、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/issues/45785&quot;&gt;#45785&lt;/a&gt; のサブイシューで確認できます。回避策として、依存しているエクステンションがまだ変換されていない場合は、競合するテストを別々のプロジェクトに分割することで症状が解消されるはずです。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;いつものように、問題や奇妙な点に気づいた場合は、 &lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;zulip&lt;/a&gt; で知らせるか、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;イシューを起票&lt;/a&gt; してください。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;background&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#background&quot;&gt;&lt;/a&gt;背景&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;旧 API を使用するすべての Dev Services は、(Quarkus 3.22 以降) JUnit のディスカバリーフェーズで開始されます。これは、それらがバイトコード操作や他のアプリケーション初期化ステップとともに、 &lt;a href=&quot;https://quarkus.io/guides/reaugmentation#what-is-augmentation&quot;&gt;オーグメンテーションフェーズ&lt;/a&gt; 中に開始されるためです。テストの設計が変更された際、すべてのオーグメンテーションはテスト実行の開始時、つまり JUnit のディスカバリーフェーズ中に行われるようになりました。これは、すべての Dev Services もテスト実行の開始時に開始されることを意味します。異なる Dev Services 設定を持つ複数のテストクラスがテスト実行前にオーグメンテーションされると、設定の異なる複数の Dev Services が同時に実行される可能性があります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;新しいモデルでは、Dev Services はオーグメンテーションの後、アプリケーションの実際の起動の前に開始されます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-changes-for-extension-owners&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-changes-for-extension-owners&quot;&gt;&lt;/a&gt;エクステンション所有者にとっての変更点&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;新しい Dev Services モデルは古いモデルとの後方互換性を維持しているため、エクステンション所有者が何かを行う &lt;em&gt;必要&lt;/em&gt; はありません。実際、新しいモデルの最初の数リリースでは、API が安定するまでエクステンション所有者は何もしないことを推奨していました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;現在は、より簡潔なプログラミングモデルとリソース使用量の削減という利点を享受するために、エクステンションの移行を開始するのに良い時期です。これにより、古いモデルによって引き起こされるいくつかの非推奨警告も解決されます。新しい API に移行したエクステンションは、古いバージョンの Quarkus では動作しなくなることに注意してください。3.25 が可能な最小バージョンとなりますが、最小バージョンとして 3.27 または 3.28 を設定することをお勧めします (詳細は後述)。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;principles-of-the-new-design&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#principles-of-the-new-design&quot;&gt;&lt;/a&gt;新設計の原則&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dev Services はビルド時に準備されますが、実際の &lt;code&gt;start()&lt;/code&gt; 呼び出しはビルド後、ランタイム前に行われます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;エクステンションプロセッサーで静的変数を使用しないこと。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dev Service の作成はビルダーによって処理されます (外部管理インスタンスへの接続と新しいサービスの作成には、それぞれ異なるビルダーがあります)。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サービスの開始後にのみ判明する設定は、 &lt;code&gt;configProvider()&lt;/code&gt; を使用して渡すことができます。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;migration-checklist&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#migration-checklist&quot;&gt;&lt;/a&gt;移行チェックリスト&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;エクステンションのビルドファイルを更新し、 &lt;code&gt;quarkus-devservices&lt;/code&gt; ランタイムモジュールと &lt;code&gt;quarkus-devservices-deployment&lt;/code&gt; モジュールの両方に依存するようにします (ただし、これによる影響については &lt;a href=&quot;#version-dilemma&quot;&gt;Quarkus バージョンの選択に関する議論&lt;/a&gt; を参照してください)。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;新しいサービスの開始と停止のメソッドを持つ &lt;code&gt;io.quarkus.deployment.builditem.Startable&lt;/code&gt; の &lt;a href=&quot;#startable&quot;&gt;実装&lt;/a&gt; を提供します。コンテナーベースのサービスの場合、 &lt;code&gt;GenericContainer&lt;/code&gt; を継承して &lt;code&gt;Startable&lt;/code&gt; を実装するのが良いパターンです。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;DevServicesResultBuildItem&lt;/code&gt; を直接構築する代わりに、 &lt;code&gt;DevServicesResultBuildItem&lt;/code&gt; 上の &lt;code&gt;discovered()&lt;/code&gt; および &lt;code&gt;owned()&lt;/code&gt; &lt;a href=&quot;#the-builder&quot;&gt;ビルダー&lt;/a&gt; を使用するように切り替えます。&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ビルダーのすべてのメソッドを呼び出す必要はありませんが、所有(owned)サービスの場合は &lt;code&gt;startable()&lt;/code&gt; 、 &lt;code&gt;serviceName()&lt;/code&gt; 、 &lt;code&gt;configProvider()&lt;/code&gt; 、および &lt;a href=&quot;#eligibility-for-reuse&quot;&gt;&lt;code&gt;serviceConfig()&lt;/code&gt;&lt;/a&gt; がほぼ常に必要になります。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アンチパターンのコードチェック。&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;エクステンションのコードで Dev Service を停止または開始してはいけません。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;シャットダウンリスナーを削除します。クリーンアップはサービスの &lt;code&gt;Startable&lt;/code&gt; の &lt;code&gt;stop()&lt;/code&gt; メソッドで処理する必要があります。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;新しいモデルでは &lt;code&gt;RunningDevService&lt;/code&gt; 型を使用してはいけません。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;エクステンションプロセッサー内の &lt;a href=&quot;#static-fields&quot;&gt;静的変数&lt;/a&gt; (サービスインスタンスへのポインターなど) を削除します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;システムプロパティーやその他のオーバーライドを使用して、新しいサービスにアクセスするための設定を直接設定しようとしないでください。代わりに &lt;code&gt;configProvider()&lt;/code&gt; を使用してください。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;more-migration-details&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#more-migration-details&quot;&gt;&lt;/a&gt;移行の詳細&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;static-fields&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#static-fields&quot;&gt;&lt;/a&gt;エクステンションプロセッサーの静的フィールドの排除&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;エクステンション開発者は、インスタンス間の通信を静的変数に依存すべきではありません。プロセッサーの呼び出し順序がアプリケーションの実行順序と同じになると想定してはいけません。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkus.io/guides/writing-extensions#injection&quot;&gt;エクステンション作成ガイド&lt;/a&gt; には、「ビルドステップ間の状態の受け渡しは、たとえステップが同じクラス内にあっても、ビルドアイテムを介してのみ行うべきである」と記載されています。しかし、ほぼすべての Dev Service 実装がこのルールを破り、以前に作成されたサービスを追跡するために静的フィールドを使用していました。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;新しいモデルに移行する際の優れたヒューリスティックは、すべての静的フィールドをなくすことです。たとえば、次のようなフィールドをすべて削除します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;private static volatile RunningDevService devService;
private static volatile MyDevServicesConfig capturedDevServicesConfiguration;
private static volatile boolean first = true;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;サービスの再利用か交換かの判断は、設定の差分に基づいて &lt;a href=&quot;#eligibility-for-reuse&quot;&gt;一元的に処理&lt;/a&gt; されるようになりました。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;get-rid-of-shutdown-logic&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#get-rid-of-shutdown-logic&quot;&gt;&lt;/a&gt;シャットダウンロジックの排除&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;サービスのライフサイクルが一元的に管理されるため、シャットダウンリスナーやサービスを停止するためのその他のロジックも削除する必要があります。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;remove-any-references-to-runningdevservice&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#remove-any-references-to-runningdevservice&quot;&gt;&lt;/a&gt;&lt;code&gt;RunningDevService&lt;/code&gt; への参照の削除&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;プロセッサーはサービスの開始を処理しないため、 &lt;code&gt;RunningDevService&lt;/code&gt; を返してはいけません。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;the-builder&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-builder&quot;&gt;&lt;/a&gt;ビルダーの使用&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;直接構築する代わりに、新しいビルダー API を使用してください。作成されるサービスには &lt;code&gt;owned()&lt;/code&gt; を、検出された外部管理サービスを登録するには &lt;code&gt;discovered()&lt;/code&gt; を選択します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;例:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;    DevServicesResultBuildItem = DevServicesResultBuildItem.owned()
                    .feature(MY_FEATURE_NAME)
                    .serviceName(name)
                    .serviceConfig(myConfig)
                    .startable(() -&amp;gt; new MyContainer(
                            myImageName,
                            myConfig.port(),
                            useSharedNetwork)
                            .withEnv(myConfig.containerEnv())
                     .configProvider(
                            Map.of(someProp, s -&amp;gt; s.getConnectionInfo()))
                    .build());&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;eligibility-for-reuse&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#eligibility-for-reuse&quot;&gt;&lt;/a&gt;再利用の適格性&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;一元化されたライフサイクル管理は、サービスが再利用可能かどうかをどのように判断するのでしょうか。これは、比較の基準として使用するためにビルダーに渡される「同一性キー」(設定オブジェクト) に基づいています。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;主要なメソッドは &lt;code&gt;.serviceConfig(myConfig)&lt;/code&gt; です。現在の設定は、再起動ごとに実行中のサービスの設定とリフレクションによって比較されます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;startable&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#startable&quot;&gt;&lt;/a&gt;&lt;code&gt;Startable&lt;/code&gt; の役割&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;遅延開始をサポートするために、 &lt;code&gt;Startable&lt;/code&gt; の実装をビルダーに渡します。
(言うまでもないことですが、 &lt;code&gt;Startable&lt;/code&gt; で &lt;code&gt;start()&lt;/code&gt; を &lt;strong&gt;呼び出さないで&lt;/strong&gt; ください。 Quarkus インフラストラクチャーが適切なタイミングでサービスを開始します。)
(言うまでもないことですが、 &lt;code&gt;Startable&lt;/code&gt; で &lt;code&gt;start()&lt;/code&gt; を &lt;strong&gt;呼び出さないで&lt;/strong&gt; ください。 Quarkus インフラストラクチャーが適切なタイミングでサービスを開始します。)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;コンテナーベースのサービスの場合、通常は &lt;code&gt;GenericContainer&lt;/code&gt; を継承するのが便利です。その場合、 &lt;code&gt;start()&lt;/code&gt; を実装する必要さえありません。ほとんどの Dev Services 実装はすでに &lt;code&gt;GenericContainer&lt;/code&gt; のサブクラスを提供しているため、差分は &lt;code&gt;implements Startable&lt;/code&gt; を追加し、 &lt;code&gt;close()&lt;/code&gt; メソッドを追加するだけです。 &lt;code&gt;close&lt;/code&gt; メソッドはスーパークラスに委譲できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;例:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;private static class MyContainer extends GenericContainer&amp;lt;MyContainer&amp;gt; implements Startable {

        private final OptionalInt fixedExposedPort;

        private final String hostName;

        public MyContainer(String imageName, OptionalInt fixedExposedPort) {
            super(imageName);
            this.fixedExposedPort = fixedExposedPort;

            this.hostName =  ...

        }

        @Override
        protected void configure() {
            super.configure();

            if (fixedExposedPort.isPresent()) {
                addFixedExposedPort(fixedExposedPort.getAsInt(), DEFAULT_PORT);
            } else {
                addExposedPort(DEFAULT_PORT);
            }
        }

        public int getPort() {
            if (fixedExposedPort.isPresent()) {
                return fixedExposedPort.getAsInt();
            }
            return super.getFirstMappedPort();
        }

        // This looks strange, but is needed to satisfy the interface
        @Override
        public void close() {
            super.close();
        }

        @Override
        public String getConnectionInfo() {
            return getHost() + &quot;:&quot; + getPort();
        }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;version-dilemma&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#version-dilemma&quot;&gt;&lt;/a&gt;依存関係の変更と最小 Quarkus バージョンの設定&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;この部分は残念ながら少し厄介です。 Quarkus 3.28 では、新しい &lt;code&gt;devservices&lt;/code&gt; ランタイムモジュールが導入されました。ほとんどのエクステンションにはデプロイメントモジュールとランタイムモジュールの両方がありますが、歴史的に Dev Services にはデプロイメントモジュールしかありませんでした。関連するランタイムクラスは他のモジュールに存在していました。ランタイムモジュールは 3.28 で追加されました。破壊的な変更になる可能性があるため、LTS 後に行われました。それは良いアイデアのように思われましたが、予期せぬ結果をもたらしました。新しいモジュールの導入は後方互換性を維持する方法で行われましたが、前方互換性は維持されませんでした。つまり、3.27 に対してビルドされたエクステンションは 3.27 LTS で動作しますが、3.28 以降のバージョンでは動作しません。3.28 でビルドされたエクステンションは 3.27、および 3.28 以降のバージョンで動作します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;このため、エクステンションの 3.27 用と 3.28+ 用のブランチを作成するか、単に 3.28 に対してビルドする必要があります。 3.28 に対してビルドする場合は、Quarkus ツールがそのエクステンションを 3.27 と互換性があると認識できるように、エクステンションのメタデータで最小 Quarkus バージョンを手動で設定する必要があります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-yaml hljs&quot; data-lang=&quot;yaml&quot;&gt;  requires-quarkus-core: &quot;[3.27,)&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;3.28 に対してビルドすることを選択した場合は、ランタイムモジュールの &lt;code&gt;pom.xml&lt;/code&gt; に以下を追加してください。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-xml hljs&quot; data-lang=&quot;xml&quot;&gt;&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;io.quarkus&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;quarkus-devservices&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;faqs&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#faqs&quot;&gt;&lt;/a&gt;FAQ&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;how-can-i-have-a-build-step-do-something-after-a-dev-service-is-started&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-can-i-have-a-build-step-do-something-after-a-dev-service-is-started&quot;&gt;&lt;/a&gt;Dev Service の開始後にビルドステップで何かを実行するにはどうすればよいですか。&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Dev Service がビルドフェーズで開始されることはないため、これは不可能です。ただし、ビルダーの &lt;code&gt;postStartHook&lt;/code&gt; を使用すると、Dev Service が開始された後にアクションを実行できます。アプリケーションに設定を渡すには、 &lt;a href=&quot;https://quarkus.io/guides/writing-extensions#injecting-configuration-into-recorders&quot;&gt;レコーダーを使用&lt;/a&gt; できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;一般的に、Quarkus の哲学は作業をアプリケーションの開始時からビルド時に移行することであり、その逆ではありません。作業を &lt;code&gt;postStartHook&lt;/code&gt; やレコーダーに移動する必要がある場合は、パフォーマンスへの悪影響を避けるために、移動する量を最小限に抑えるようにしてください。多くの場合、コードは Dev Service が作成される &lt;strong&gt;こと&lt;/strong&gt; を知る必要がありますが、実際のアドレスを知る必要はありません。これは、マーカービルドアイテムを使用した通常のビルドフローの一部として処理し、フックの一部として実行するものを最小限に抑えることができます。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;how-can-i-publish-links-to-my-service-in-the-dev-ui&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-can-i-publish-links-to-my-service-in-the-dev-ui&quot;&gt;&lt;/a&gt;Dev UI でサービスへのリンクを公開するにはどうすればよいですか。&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;サービスに管理コンソールがある場合、Dev UI でそのリンクを公開するのは良いパターンです。旧 Dev Services モデルでは、次のようなコードでエクステンションのカードをカスタマイズしていたかもしれません。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;   @BuildStep(onlyIf = IsDevelopment.class)
   public CardPageBuildItem pages(List&amp;lt;SomeRelevantBuildItem&amp;gt; containers) {
      CardPageBuildItem cardPageBuildItem = new CardPageBuildItem();

      for (SomeRelevantBuildItem container : containers) {
         cardPageBuildItem.addPage(Page.externalPageBuilder(&quot;My Extension Name&quot;)
               .url(container.getTheUrl())
               .staticLabel(container.label());
      }

      return cardPageBuildItem;
   }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;URL はビルド時には不明であるため、これは機能しなくなります。代わりに、 &lt;code&gt;url&lt;/code&gt; メソッドを &lt;code&gt;dynamicUrlJsonRPCMethodName&lt;/code&gt; に置き換え、 &lt;a href=&quot;/guides/dev-ui#runtime-external-links&quot;&gt;RPC メソッド名を渡します&lt;/a&gt; 。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;     .dynamicUrlJsonRPCMethodName(&quot;getMyUrl&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;3.32 からは、メソッド呼び出しでパラメーターを渡すこともできます。たとえば、次のようになります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;     .dynamicUrlJsonRPCMethodName(&quot;getMyUrl&quot;, Map.of(&quot;name&quot;, &quot;service-name&quot;, &quot;configKey&quot;, &quot;some-key&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;提供クラスを登録するためのビルドステップを追加します。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;    @BuildStep(onlyIf = IsLocalDevelopment.class)
    public JsonRPCProvidersBuildItem createJsonRPCService() {
     return new JsonRPCProvidersBuildItem(MyJsonRPCService.class, BuiltinScope.SINGLETON.getName());
    }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;エクステンションのランタイムモジュールで、 &lt;code&gt;getMyUrl&lt;/code&gt; メソッドを持つ &lt;code&gt;MyJsonRPCService&lt;/code&gt; クラスを作成します。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;examples&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#examples&quot;&gt;&lt;/a&gt;例&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;差分を見ると、何をすべきかがわかりやすい場合があります。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;コンテナーベースではない Dev Service を使用した例については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/48753/files&quot;&gt;Lambda の変換&lt;/a&gt; を参照してください。 compose を使用し、既存の外部コンテナーを再利用し、開始後の設定を行う、より複雑な変換については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/48445/files#diff-77328c7968b5b6e5280c55994dd56cd1da637e84b1fecd751d6130e78840aefd&quot;&gt;Kafka の変換&lt;/a&gt; の &lt;code&gt;KafkaDevServicesProcessor&lt;/code&gt; 部分のみを参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/orgs/quarkusio/projects/49&quot;&gt;Dev Services ライフサイクルのワーキンググループ&lt;/a&gt; は現在も進行中であり、貢献を歓迎しています。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Mon, 05 Jan 2026 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/new-dev-services-api/
            </guid>
            
            
            
            <author>Holly Cummins (https://twitter.com/holly_cummins)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.30.5 - Maintenance release</title>
            <link>
                https://quarkus.io/blog/quarkus-3-30-5-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today, we released Quarkus 3.30.5, a new maintenance release for our 3.30 stream, and our last release for 2025.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See you all next year!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.30 に更新するには、Quarkus CLI の最新バージョンに更新してから、以下を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なお、&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.30 へとアプリケーションを更新できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整の詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.30&quot;&gt;Quarkus 3.30 移行ガイド&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can get the full changelog of &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.30.5&quot;&gt;3.30.5&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 24 Dec 2025 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-30-5-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Quarkus Hibernate with Panache Next</title>
            <link>
                https://quarkus.io/blog/hibernate-panache-next/
            </link>
            <description>
                &lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;introducing-a-new-version-of-panache&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introducing-a-new-version-of-panache&quot;&gt;&lt;/a&gt;Introducing a new version of Panache&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;…which was never called Panache, by the way, it was called Hibernate ORM with Panache,
or Hibernate Reactive with Panache, and this new version, is a new module, designed to
unify both, and is currently called &lt;a href=&quot;https://quarkus.io/version/main/guides/hibernate-panache-next&quot;&gt;Hibernate with Panache&lt;/a&gt;
(although the name could change).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Anyway, first a disclaimer: this is a new extension, which is experimental, which means everything
about it can (and probably will) change: the extension name, the package names, the class names
and even the API. We are releasing it because we feel it&amp;#8217;s in a good shape to be tested and discussed
by the community, and we hope to get better feedback before we commit to anything like names or
API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please report feedback either on &lt;a href=&quot;https://quarkusio.zulipchat.com/#narrow/channel/187038-dev/topic/WG.20-.20Panache.2ENext/with/562916276&quot;&gt;Zulip&lt;/a&gt;
or via &lt;a href=&quot;https://github.com/orgs/quarkusio/projects/50/views/1&quot;&gt;GitHub issues&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-was-wrong-with-the-old-panache-apis&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-was-wrong-with-the-old-panache-apis&quot;&gt;&lt;/a&gt;What was wrong with the old Panache APIs?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mostly it&amp;#8217;s fine, but it has a few drawbacks that are definitely annoying and dated:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We have two &lt;a href=&quot;https://quarkus.io/guides/hibernate-orm-panache&quot;&gt;competing&lt;/a&gt; and
&lt;a href=&quot;https://quarkus.io/guides/hibernate-reactive-panache&quot;&gt;incompatible&lt;/a&gt; APIs depending on whether we want to use blocking or non-blocking database
drivers. The recent support of mixing Hibernate ORM and Hibernate Reactive in Quarkus means people no longer want
to be blocked having to choose which entity type to extend, between the blocking &lt;code&gt;PanacheEntity&lt;/code&gt; and its non-blocking
counterpart.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Both Hibernate ORM with Panache and its Hibernate Reactive counterpart only support managed entities, and we want
to add support for stateless entities (using &lt;code&gt;StatelessSession&lt;/code&gt;), but we cannot do that with the current Panache API.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We want to add support for &lt;a href=&quot;https://jakarta.ee/specifications/data/1.0/jakarta-data-1.0&quot;&gt;Jakarta Data&lt;/a&gt;,
which allows defining type-safe queries using annotations, which are
checked at build time, but the current
&lt;a href=&quot;https://quarkus.io/guides/hibernate-orm-panache#solution-1-using-the-active-record-pattern&quot;&gt;&lt;em&gt;active record&lt;/em&gt;&lt;/a&gt;
version of Panache entities does not easily support this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We currently have a split between &lt;em&gt;active record&lt;/em&gt; and
&lt;a href=&quot;https://quarkus.io/guides/hibernate-orm-panache#solution-2-using-the-repository-pattern&quot;&gt;&lt;em&gt;repository&lt;/em&gt;&lt;/a&gt; modes of
operations, which is not satisfactory, and can be confusing to new users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The static methods of &lt;em&gt;active record&lt;/em&gt; entities have a hole in their types which require they be either assigned to
known types (not &lt;code&gt;var&lt;/code&gt;) or have their type arguments explicitly specified.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Method pointers cannot be used on the static methods of &lt;em&gt;active record&lt;/em&gt; entities, causing confusion.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I could spend a long time explaining each of these issues, and the many things we experimented on to fix them, but
you&amp;#8217;re probably more interested in what we came up with.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;so-whats-this-new-api&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#so-whats-this-new-api&quot;&gt;&lt;/a&gt;So, what&amp;#8217;s this new API?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It&amp;#8217;s a new Quarkus extension, and it lets you specify your entity in a way which allows you to use it using a blocking
JDBC driver, or a Reactive driver, as a managed entity, or as a stateless entity, with type-safe queries, or non-type-safe
queries. It&amp;#8217;s very flexible and it&amp;#8217;s still clearly a continuation of the old Panache APIs, with a dash of
&lt;a href=&quot;https://jakarta.ee/specifications/data/1.0/jakarta-data-1.0&quot;&gt;Jakarta Data&lt;/a&gt;
and all mixed in a way that we hope you will like.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkus.io/version/main/guides/hibernate-panache-next&quot;&gt;The documentation&lt;/a&gt; has a lot of
information as to how to set it up, and all the options, so I will focus on some
bite-sized samples for this blog post. Here&amp;#8217;s your first entity with type-safe queries:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;@Entity
public class Cat extends PanacheEntity {
    public String name;
    public LocalDate birth;
    public Breed breed;

    public enum Breed {
        CUTE, HAIRLESS;
    }

    public interface Repo extends PanacheRepository&amp;lt;Cat&amp;gt; {
        @Find
        Cat findByName(String name);

        @HQL(&quot;where breed = CUTE&quot;)
        List&amp;lt;Cat&amp;gt; findCute();

        @HQL(&quot;delete from Cat where name = :name&quot;)
        long deleteByName(String name);

        @HQL(&quot;delete from Cat where breed = HAIRLESS&quot;)
        long deleteHairless();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here&amp;#8217;s what you can notice right away:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Your entity extends &lt;code&gt;PanacheEntity&lt;/code&gt; (a familiar type, but in a new package), which means: by default it&amp;#8217;s blocking and
managed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Its operations are defined in a repository that is conveniently nested in the entity. No more mixing instance
entity methods and &lt;code&gt;static&lt;/code&gt; methods, and yet you retain the close proximity of these operations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can define type-safe operations with &lt;code&gt;@Find&lt;/code&gt; and &lt;code&gt;@HQL&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You still have all the Panache type-unsafe operations in the &lt;code&gt;PanacheRepository&lt;/code&gt; supertype.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You could use it like this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;    @Inject
    Cat.Repo repo;

    @Transactional
    public void method() {
        Cat cat = new Cat();
        cat.name = &quot;Lucky&quot;;
        cat.birth = LocalDate.of(2015, 01, 12);
        cat.breed = Cat.Breed.CUTE;

        // Persist the cat
        cat.persist();

        // Make a change, no need to update it
        cat.name = &quot;Luckynou&quot;;

        // Find our cat
        cat = repo.findByName(&quot;Luckynou&quot;);

        // Find cute cats
        List&amp;lt;Cat&amp;gt; cuteCats = repo.findCute();

        // Delete our cat
        cat.delete();

        // Delete queries
        repo.deleteByName(&quot;Lucky&quot;);
        repo.deleteHairless();
    }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But if you find injecting the repository disruptive, you can also access it using the generated metamodel accessor
&lt;code&gt;Cat_.repo()&lt;/code&gt;, which is super handy for completion and API discovery.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;heres-where-it-gets-better&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#heres-where-it-gets-better&quot;&gt;&lt;/a&gt;Here&amp;#8217;s where it gets better&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Want a reactive version of your entity for stateless sessions?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;@Entity
public class Cat extends WithId.AutoLong implements PanacheEntity.Reactive.Stateless {
    public String name;
    public LocalDate birth;
    public Breed breed;

    public enum Breed {
        CUTE, HAIRLESS;
    }

    public interface Repo extends PanacheRepository.Reactive.Stateless&amp;lt;Cat, Long&amp;gt; {
        @Find
        Uni&amp;lt;Cat&amp;gt; findByName(String name);

        @HQL(&quot;where breed = CUTE&quot;)
        Uni&amp;lt;List&amp;lt;Cat&amp;gt;&amp;gt; findCute();

        @HQL(&quot;delete from Cat where name = :name&quot;)
        Uni&amp;lt;Integer&amp;gt; deleteByName(String name);

        @HQL(&quot;delete from Cat where breed = HAIRLESS&quot;)
        Uni&amp;lt;Integer&amp;gt; deleteHairless();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It&amp;#8217;s a bit longer, at the moment, but bear with us. Here&amp;#8217;s the run-down:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You extend &lt;code&gt;WithId.AutoLong&lt;/code&gt; if you want a generated &lt;code&gt;Long&lt;/code&gt; identifier.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You implement &lt;code&gt;PanacheEntity.Reactive.Stateless&lt;/code&gt; to get reactive stateless operations by default.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your repository implements &lt;code&gt;PanacheRepository.Reactive.Stateless&lt;/code&gt; to get reactive stateless operations by default.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your queries return &lt;code&gt;Uni&lt;/code&gt; for non-blocking operation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Otherwise, it&amp;#8217;s the same API. Pick which mode of operation you want your entities to be based on by default. Mix and
match modes for different entities if you want.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;heres-where-it-gets-really-better&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#heres-where-it-gets-really-better&quot;&gt;&lt;/a&gt;Here&amp;#8217;s where it gets really better&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let&amp;#8217;s say you declared your entity to be blocking and managed, but you want to also access it for a reactive and
stateless part of your API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can always access every mode of operation on your entity or repository using supertype methods:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;public class Code {

    // By default, the Cat is blocking and managed
    @Transactional
    public void blockingManagedMethod() {
        Cat cat = new Cat();
        cat.name = &quot;Lucky&quot;;
        cat.birth = LocalDate.of(2015, 01, 12);
        cat.breed = Cat.Breed.CUTE;

        // Persist the cat
        cat.persist();

        // Make a change, no need to update it
        cat.name = &quot;Luckynou&quot;;
    }

    // But we can always call statelessReactive() and use reactive and stateless operations
    @WithTransaction
    public Uni&amp;lt;Void&amp;gt; reactiveStatelessMethod(Long catId) {
        Cat cat = new Cat();
        cat.name = &quot;Lucky&quot;;
        cat.birth = LocalDate.of(2015, 01, 12);
        cat.breed = Cat.Breed.CUTE;

        // Insert the cat
        return cat.statelessReactive().insert()
                .chain(() -&amp;gt; {
                    // Make a change, we need to update it
                    cat.name = &quot;Luckynou&quot;;
                    return cat.statelessReactive().update();
                });

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can even define multiple repositories for your different modes of operations:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;@Entity
public class Cat extends PanacheEntity {
    public String name;
    public LocalDate birth;
    public Breed breed;

    public enum Breed {
        CUTE, HAIRLESS;
    }

    public interface Repo extends PanacheRepository&amp;lt;Cat&amp;gt; {
        @Find
        Cat findByName(String name);
    }

    public interface TheOtherRepo extends PanacheRepository.Reactive.Stateless&amp;lt;Cat, Long&amp;gt; {
        @Find
        Uni&amp;lt;Cat&amp;gt; findByName(String name);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;merry-christmas&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#merry-christmas&quot;&gt;&lt;/a&gt;Merry Christmas&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just in time for the holidays, we&amp;#8217;re merging this to &lt;code&gt;main&lt;/code&gt; so it will be in a release near you very soon.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Give it a try, &lt;a href=&quot;https://quarkus.io/version/main/guides/hibernate-panache-next&quot;&gt;read the documentation&lt;/a&gt;, and give us feedback either on
&lt;a href=&quot;https://quarkusio.zulipchat.com/#narrow/channel/187038-dev/topic/WG.20-.20Panache.2ENext/with/562916276&quot;&gt;Zulip&lt;/a&gt;
or via &lt;a href=&quot;https://github.com/orgs/quarkusio/projects/50/views/1&quot;&gt;GitHub issues&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 24 Dec 2025 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/hibernate-panache-next/
            </guid>
            
            
            
            <author>Stéphane Épardaud (https://twitter.com/UnFroMage)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.30.4 - Maintenance release</title>
            <link>
                https://quarkus.io/blog/quarkus-3-30-4-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today, we released Quarkus 3.30.4, a new maintenance release for our 3.30 stream.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.30 に更新するには、Quarkus CLI の最新バージョンに更新してから、以下を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なお、&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.30 へとアプリケーションを更新できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整の詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.30&quot;&gt;Quarkus 3.30 移行ガイド&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can get the full changelog of &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.30.4&quot;&gt;3.30.4&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 17 Dec 2025 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-30-4-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Quarkus feature flags</title>
            <link>
                https://quarkus.io/blog/quarkus-feature-flags/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Feature flags are a proven and popular technique.
In essence, a feature flag makes it possible to turn on-off and/or configure a specific functionality in your application.
It is also referred to as toggles or switches.
There are many types of feature flags.
You may have heard of a &quot;killer switch&quot; that simply disables a problematic feature instantly.
Feature flags can be used to implement &quot;gradual rollout&quot; to deliver new features gradually to small groups of users (aka beta testers).
Permission flags are used to control access for different users.
And so on.
However, that&amp;#8217;s not the subject of this blogpost.
We would like to introduce &lt;a href=&quot;https://github.com/quarkiverse/quarkus-flags/&quot;&gt;Quarkus Feature Flags&lt;/a&gt; - a Quarkiverse project that aims to provide a &lt;em&gt;lightweight&lt;/em&gt; and &lt;em&gt;extensible&lt;/em&gt; feature flags Quarkus extension.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More specifically, it provides:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A blocking/non-blocking API to access feature flags.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A non-blocking SPI to provide flags and externalize the computation of a flag value.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Several built-in flag providers:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quarkus config can be used to define feature flags,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An in-memory flag repository which is useful for testing and dynamic registration of flags.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hibernate ORM&lt;/strong&gt; module, where feature flags are mapped from an annotated entity and are automatically loaded from the database.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt; module, so that it&amp;#8217;s possible to evaluate flags based on the current &lt;code&gt;SecurityIdentity&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Qute&lt;/strong&gt; module, so that it&amp;#8217;s possible to use the flags directly in templates.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CRON&lt;/strong&gt; module with a flag evaluator that matches a specific CRON expression.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note that the goal of this extension is not to replace robust solutions such as &lt;a href=&quot;https://openfeature.dev/&quot;&gt;OpenFeature&lt;/a&gt; and &lt;a href=&quot;https://www.getunleash.io/&quot;&gt;Unleash&lt;/a&gt;.
Instead, we would like to offer a flexible option that integrates well with other parts of the Quarkus ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;flag&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#flag&quot;&gt;&lt;/a&gt;Flag&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this extension, a feature flag is represented by the &lt;code&gt;io.quarkiverse.flags.Flag&lt;/code&gt; interface.
It refers to a specific feature with a string identifier and provides several convenient methods to compute the &lt;em&gt;current value&lt;/em&gt;.
The value of a feature flag can be represented as &lt;code&gt;boolean&lt;/code&gt;, &lt;code&gt;string&lt;/code&gt; or &lt;code&gt;integer&lt;/code&gt;.
There can be only one flag for a given feature at a given time.
A flag can also expose metadata which that can be leveraged in the SPI.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;simple-example&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#simple-example&quot;&gt;&lt;/a&gt;Simple example&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let&amp;#8217;s start simple.
We will create a flag for a feature called &lt;code&gt;my-feature-alpha&lt;/code&gt; in the &lt;code&gt;application.properties&lt;/code&gt; file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-properties hljs&quot; data-lang=&quot;properties&quot;&gt;quarkus.flags.runtime.&quot;my-feature-alpha&quot;.value=true &lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Define a &lt;em&gt;runtime&lt;/em&gt; flag for feature &lt;code&gt;my-feature-alpha&lt;/code&gt; with initial value &lt;code&gt;true&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
A &lt;code&gt;runtime&lt;/code&gt; feature flag can be overriden at runtime, e.g. using a system property or an environment variable. You can also define a flag fixed at build time, i.e. &lt;code&gt;quarkus.flags.build.&quot;my-feature-alpha&quot;.value=true&lt;/code&gt;. However, its values ​​cannot be modified at runtime.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;io.quarkiverse.flags.Flags&lt;/code&gt; interface represents the central point to access feature flags.
The container registers a CDI bean that implements &lt;code&gt;Flags&lt;/code&gt; automatically.
Therefore, we will simply inject &lt;code&gt;Flags&lt;/code&gt; and use one of its convenient methods.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;package org.example;

import io.quarkiverse.flags.Flags;
import jakarta.inject.Inject;

@ApplicanScoped
public class MyService {

    @Inject
    Flags flags;

    void call() {
        if (flags.isEnabled(&quot;my-feature-alpha&quot;)) {
            // This business logic is executed only if &quot;my-feature-alpha&quot; value evaluates to true
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also access the flag in your UI built with Qute:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-html hljs&quot; data-lang=&quot;html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
   &amp;lt;title&amp;gt;Flags&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
   &amp;lt;h1&amp;gt;Hello - Quarkus Club 2025&amp;lt;/h1&amp;gt;
   {#if flag:enabled(&apos;my-feature-alpha&apos;)} &lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
   &amp;lt;p&amp;gt;Feature alpha is enabled!
   {/if}
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;flag:&lt;/code&gt; namespace provides other useful properties and methods.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
If you want to use the Qute integration in your application then you&amp;#8217;ll need to add the &lt;code&gt;io.quarkiverse.flags:quarkus-flags-qute&lt;/code&gt; extension to your build file first.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;flag-providers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#flag-providers&quot;&gt;&lt;/a&gt;Flag providers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So far we defined the flag in the Quarkus config.
This is not very flexible.
Let&amp;#8217;s try some other built-in flag providers.
We can use the &lt;code&gt;io.quarkiverse.flags.InMemoryFlagProvider&lt;/code&gt; - an in-memory repository that can be useful for testing and dynamic registration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;import io.quarkiverse.flags.BooleanValue;
import io.quarkiverse.flags.Flag;
import io.quarkiverse.flags.InMemoryFlagProvider;
import io.quarkus.runtime.Startup;
import jakarta.inject.Inject;

@ApplicationScoped
public class MyInitService {

   AtomicBoolean alpha = new AtomicBoolean();

   @Inject
   InMemoryFlagProvider provider; &lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;

   @Startup &lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
   void addFlags() {
      provider.addFlag(Flag.builder(&quot;my-feature-alpha&quot;) &lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
            .setCompute(ctx -&amp;gt; BooleanValue.from(alpha.get())) &lt;i class=&quot;conum&quot; data-value=&quot;4&quot;&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;
            .build());
   }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Inject &lt;code&gt;InMemoryFlagProvider&lt;/code&gt; to add/remove flags.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This method is automatically executed at application startup.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;InMemoryFlagProvider&lt;/code&gt; has higher priority and overrides the flag provided in config.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;4&quot;&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The current value of &lt;code&gt;my-feature-alpha&lt;/code&gt; is calculated from &lt;code&gt;MyInitService#alpha&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This way we can control the current value of &lt;code&gt;my-feature-alpha&lt;/code&gt; easily.
However, in real use cases we will probably need to persist the feature flags in an external system.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://docs.quarkiverse.io/quarkus-flags/dev/hibernate-orm.html&quot;&gt;&lt;code&gt;quarkus-flags-hibernate-orm&lt;/code&gt; extension&lt;/a&gt; provides integration with Hibernate ORM.
It discovers all JPA entities annotated with &lt;code&gt;@io.quarkiverse.flags.hibernate.common.FlagDefinition&lt;/code&gt; and generates a flag provider automatically.
The generated provider simply loads all flags from the database.
A mapping looks like:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-java hljs&quot; data-lang=&quot;java&quot;&gt;import jakarta.persistence.Entity;

import io.quarkiverse.flags.hibernate.common.FlagDefinition;
import io.quarkiverse.flags.hibernate.common.FlagFeature;
import io.quarkiverse.flags.hibernate.common.FlagValue;
import io.quarkus.hibernate.orm.panache.PanacheEntity;

@FlagDefinition &lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
@Entity
public class MyFlag extends PanacheEntity {

    @FlagFeature &lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
    public String feature;

    @FlagValue &lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
    public String value;

}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Marks a flag definition entity.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Defines the feature name of a feature flag.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Defines the value of a feature flag.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
The feature flags are collected at runtime. More specifically, the extension injects all CDI beans that implement &lt;code&gt;io.quarkiverse.flags.spi.FlagProvider&lt;/code&gt; and calls the &lt;code&gt;FlagProvider#getFlags()&lt;/code&gt; method. You can easily implement your own provider.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;flag-evaluators&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#flag-evaluators&quot;&gt;&lt;/a&gt;Flag evaluators&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In real applications, you will very likely need some dynamic evaluation logic based on some application state, such as the current user or current time.
There is the &lt;code&gt;io.quarkiverse.flags.spi.FlagEvaluator&lt;/code&gt; SPI which makes it possible to externalize the computation of the current value of a feature flag.
Flag evaluators must be CDI beans.
By default, a flag can reference one &lt;code&gt;FlagEvaluator&lt;/code&gt; in its &lt;em&gt;metadata&lt;/em&gt; with a key &lt;code&gt;evaluator&lt;/code&gt;. This evaluator is automatically used to compute the current value for any flag produced by means of &lt;code&gt;Flag.Builder&lt;/code&gt; (i.e. created by &lt;code&gt;Flag#builder(String)&lt;/code&gt;).
There are also several built-in evaluators available.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;current-time&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#current-time&quot;&gt;&lt;/a&gt;Current time&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;io.quarkiverse.flags.TimeSpanFlagEvaluator&lt;/code&gt; evaluates a flag based on the current date-time obtained from the system clock in the default time-zone.
The current time must be after the &lt;code&gt;start-time&lt;/code&gt; (exclusive) and before the &lt;code&gt;end-time&lt;/code&gt; (exclusive).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-properties hljs&quot; data-lang=&quot;properties&quot;&gt;quarkus.flags.runtime.&quot;my-feature-alpha&quot;.meta.evaluator=quarkus.time-span &lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
quarkus.flags.runtime.&quot;my-feature-alpha&quot;.meta.start-time=2001-01-01T10:15:30+01:00[Europe/Prague] &lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt; &lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Assign the evaluator to the flag. Note that we do not specify the initial value for &lt;code&gt;my-feature-alpha&lt;/code&gt; - it is &lt;code&gt;true&lt;/code&gt; by default.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The current date-time must be &lt;strong&gt;after&lt;/strong&gt; the specified &lt;code&gt;start-time&lt;/code&gt;. The &lt;code&gt;java.time.format.DateTimeFormatter.ISO_ZONED_DATE_TIME&lt;/code&gt; is used to parse the &lt;code&gt;start-time&lt;/code&gt; value.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;We do not specify the &lt;code&gt;end-time&lt;/code&gt; metadata value, so there is no upper bound for the time inverval.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;current-user&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#current-user&quot;&gt;&lt;/a&gt;Current user&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;SecurityIdentityFlagEvaluator&lt;/code&gt; from the &lt;a href=&quot;https://docs.quarkiverse.io/quarkus-flags/dev/security.html&quot;&gt;&lt;code&gt;quarkus-flags-security&lt;/code&gt; extension&lt;/a&gt; can be used to compute the current value of a feature flag based on the current &lt;code&gt;SecurityIdentity&lt;/code&gt;.
A typical feature flag configuration looks like:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-properties hljs&quot; data-lang=&quot;properties&quot;&gt;quarkus.flags.runtime.&quot;my-feature-alpha&quot;.meta.evaluator=quarkus.security.identity &lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
quarkus.flags.runtime.&quot;my-feature-alpha&quot;.meta.authenticated=true &lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
quarkus.flags.runtime.&quot;my-feature-alpha&quot;.meta.roles-allowed=foo,bar &lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Assign the evaluator to the flag. Note that we do not specify the initial value for &lt;code&gt;my-feature-alpha&lt;/code&gt; - it is &lt;code&gt;true&lt;/code&gt; by default.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The current user must be authenticated.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The current user must have one of the defined roles.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;UsernameRolloutFlagEvaluator&lt;/code&gt;, on the other hand, is an evaluator using a simple percentage-based rollout strategy, based on a consistent numerical representation of the current user name.
It can be used to implement gradual rollout.
A typical feature flag configuration may look like:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-properties hljs&quot; data-lang=&quot;properties&quot;&gt;quarkus.flags.runtime.&quot;my-feature-alpha&quot;.meta.evaluator=quarkus.security.username-rollout &lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
quarkus.flags.runtime.&quot;my-feature-alpha&quot;.meta.rollout-percentage=20 &lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Assign the evaluator to the flag. Note that we do not specify the initial value for &lt;code&gt;my-feature-alpha&lt;/code&gt; - it is &lt;code&gt;true&lt;/code&gt; by default.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Enable the flag for the given percentage of users.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;cron&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cron&quot;&gt;&lt;/a&gt;CRON&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://docs.quarkiverse.io/quarkus-flags/dev/cron.html&quot;&gt;quarkus-flags-cron&lt;/a&gt; extension provides the &lt;code&gt;CronFlagEvaluator&lt;/code&gt; that can be used to compute the current value of a feature flag based on the current date-time obtained from the system clock in the default time-zone and the configured CRON expression.
A typical feature flag configuration may look like:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-properties hljs&quot; data-lang=&quot;properties&quot;&gt;quarkus.flags.runtime.&quot;my-feature-alpha&quot;.meta.evaluator=quarkus.cron &lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
quarkus.flags.runtime.&quot;my-feature-alpha&quot;.meta.authenticated=* * * * mon &lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Assign the evaluator to the flag. Note that we do not specify the initial value for &lt;code&gt;my-feature-alpha&lt;/code&gt; - it is &lt;code&gt;true&lt;/code&gt; by default.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The current date-time must match the given CRON expression. In this particular case, the flag will be enabled &lt;strong&gt;every Monday&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
By default, the Unix/crontab syntax is used. However, it is also possible to use the syntax from Cron4j, Quartz and Spring. For more information, see &lt;a href=&quot;https://docs.quarkiverse.io/quarkus-flags/dev/cron.html&quot;&gt;the documentation&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-case-for-multiple-evaluators&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-case-for-multiple-evaluators&quot;&gt;&lt;/a&gt;The case for multiple evaluators&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sometimes it might be useful to combine several evaluators to compute the value of a flag.
The core extension provides &lt;code&gt;io.quarkiverse.flags.CompositeFlagEvaluator&lt;/code&gt; that evaluates a flag with the specified sub-evaluators.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-properties hljs&quot; data-lang=&quot;properties&quot;&gt;quarkus.flags.runtime.&quot;my-feature-alpha&quot;.meta.evaluator=quarkus.composite &lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
quarkus.flags.runtime.&quot;my-feature-alpha&quot;.meta.sub-evaluators=quarkus.time-span, quarkus.security.identity &lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
quarkus.flags.runtime.&quot;my-feature-alpha&quot;.meta.start-time=2026-01-01T12:00:00+01:00[Europe/Prague] &lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
quarkus.flags.runtime.&quot;my-feature-alpha&quot;.meta.roles-allowed=admin &lt;i class=&quot;conum&quot; data-value=&quot;4&quot;&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Assign the evaluator to the flag. Note that we do not specify the initial value for &lt;code&gt;my-feature-alpha&lt;/code&gt; - it is &lt;code&gt;true&lt;/code&gt; by default.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The value of &lt;code&gt;sub-evaluators&lt;/code&gt; represents a comma-separated list of sub-evaluator identifiers. They are executed in the specified order. In this particular case, the &lt;code&gt;TimeSpanFlagEvaluator&lt;/code&gt; is executed first and then the &lt;code&gt;SecurityIdentityFlagEvaluator&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The current date-time must be after the specified start-time.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;4&quot;&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The current user must have the role &lt;code&gt;admin&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;extensibility&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#extensibility&quot;&gt;&lt;/a&gt;Extensibility&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Flag providers and flag evaluators are CDI beans.
So all you have to do is add a bean that implements &lt;code&gt;FlagProvider&lt;/code&gt; or &lt;code&gt;FlagEvaluator&lt;/code&gt; in your application.
You can use CDI interceptors and even decorate these components.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot;&gt;&lt;/a&gt;まとめ&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus Feature Flags is a lightweight and extensible extension that can help you build more flexible applications.
Feedback, feature requests and contributions are welcome.
Feel free to create questions and issues on GitHub repository: &lt;a href=&quot;https://github.com/quarkiverse/quarkus-flags/issues&quot; class=&quot;bare&quot;&gt;https://github.com/quarkiverse/quarkus-flags/issues&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Mon, 15 Dec 2025 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-feature-flags/
            </guid>
            
            
            
            <author>Martin Kouba (https://twitter.com/martunek)</author>
            
        </item>
        
        <item>
            <title>Quarkus Newsletter #63 - December</title>
            <link>
                https://quarkus.io/blog/quarkus-newsletter-63/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Check out &quot;Java Meets the Future: How Quarkus Seamlessly Combines Architecture, Performance, and Cloud-Native&quot; by Holger Tiemeyer to see how Quarkus impressively demonstrates that even an aging ecosystem like Java can always be reinvented to meet the demands of the next technological era. Learn how to build Quarkus application images using Cloud Native Buildpacks and OpenShift Builds with Piotr Minkowski&amp;#8217;s article; &quot;Quarkus with Buildpacks and OpenShift Builds&quot;. Learn how to generate, extend, and optimize a Quarkus actuator-style endpoint with build-time processing, runtime beans, and native support by reading &quot;How to Build a Custom Quarkus Actuator Extension: A Complete Java Developer’s Guide&quot; by Markus Eisele. Did you know about Roq? A powerful new tool that combines Java and Quarkus. Ok, prep a warm drink and put on some soft music and let&amp;#8217;s find out why Roq is so cool with the comfort of Quarkus Dev Mode and all its eco-system. Bonus: a touch of TailwindCss to make it look great! Learn more by reading Andy Damevin&amp;#8217;s article &quot;Discover Roq, the Quarkus Way for Static Site Generation in Java&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;最新のQuarkus Insightsエピソード、トップツイート/ディスカッション、今後開催されるQuarkus参加イベントもご覧いただけます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://quarkus.io/newsletter/63/&quot;&gt;Newsletter #63: December&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ニュースレターを受信してみませんか？ページ上のフォームを使って &lt;a href=&quot;https://quarkus.io/newsletter&quot;&gt;ニュースレターに登録&lt;/a&gt;してください。&lt;/p&gt;
&lt;/div&gt;
            </description>
            <pubDate>Thu, 11 Dec 2025 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-newsletter-63/
            </guid>
            
            
            
            <author>James Cobb (https://twitter.com/insectengine)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.30.3 - Maintenance release</title>
            <link>
                https://quarkus.io/blog/quarkus-3-30-3-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today, we released Quarkus 3.30.3, a new maintenance release for our 3.30 stream.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.30 に更新するには、Quarkus CLI の最新バージョンに更新してから、以下を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なお、&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.30 へとアプリケーションを更新できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整の詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.30&quot;&gt;Quarkus 3.30 移行ガイド&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can get the full changelog of &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.30.3&quot;&gt;3.30.3&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 10 Dec 2025 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-30-3-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.30.2 - Maintenance release</title>
            <link>
                https://quarkus.io/blog/quarkus-3-30-2-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today, we released Quarkus 3.30.2, a new maintenance release for our 3.30 stream.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.30 に更新するには、Quarkus CLI の最新バージョンに更新してから、以下を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なお、&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.30 へとアプリケーションを更新できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整の詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.30&quot;&gt;Quarkus 3.30 移行ガイド&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can get the full changelog of &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.30.2&quot;&gt;3.30.2&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 03 Dec 2025 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-30-2-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
        <item>
            <title>Quarkus: A Runtime and Framework for Cloud-Native Java</title>
            <link>
                https://quarkus.io/blog/mmaler-blogpost-2-quarkus-runtime-and-framework-for-cloud-native-java/
            </link>
            <description>
                &lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/mmaler-blog-posts/quarkus-as-a-powerful-runtime.jpeg&quot; alt=&quot;Quarkus: Runtime and Framework for Cloud-Native Java&quot; width=&quot;100%&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Public clouds such as AWS, Microsoft Azure, and Google Cloud, and platforms like Red Hat OpenShift, favor services that start fast and stay lean.
Quarkus is engineered for exactly that.
Build time processing reduces runtime overhead and results in rapid startup, a small memory footprint, and frictionless deployment across Kubernetes, OpenShift, serverless, and managed container services in any cloud.
If your Java services need to start in milliseconds, run dense on shared nodes, and still feel great to build, Quarkus was made for that job.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus is a Java runtime that seamlessly integrates popular frameworks and libraries, shaping both the structure of modern applications and the developer experience behind them.
In this post, “runtime” means the full execution stack in production: JVM or native, plus Quarkus and the integrated frameworks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus itself can also work as a framework, as it constitutes a higher-level layer that provides structure and APIs.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-quarkus-stands-out&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-quarkus-stands-out&quot;&gt;&lt;/a&gt;Why Quarkus stands out?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In modern software development, runtimes and frameworks form the foundation of productivity and consistency.
Frameworks promote uniformity, simplify infrastructure, and enable automation at scale.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/mmaler-blog-posts/2-Quarkus-as-a-powerful-runtime/1-history.png&quot; alt=&quot;A brief timeline leading to modern Java and Quarkus&quot; width=&quot;100%&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus is a cloud-native Java runtime that integrates multiple frameworks and optimizes them for fast startup, low memory use, and smooth deployment across any cloud.
It runs well on Kubernetes and Red Hat OpenShift, and it also integrates with native cloud services, from compute platforms such as AWS EC2 and Google Cloud Run to serverless offerings and managed container platforms.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then, during development, Quarkus live reload provides instant feedback by applying code changes without a rebuild or restart.
This shortens the inner loop and helps teams iterate faster than traditional redeploy cycles.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But beyond speed and live reload, Quarkus integrates established Java specifications such as CDI-Lite, JAX-RS, and JPA, with implementations provided by Arc (CDI-Lite), RESTEasy (JAX-RS), and Hibernate ORM (JPA).
It also enforces its own conventions, drives behavior with annotations, and defines how applications are structured.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this sense, Quarkus is a development framework and runtime for cloud-native Java applications.
It adheres to industry standards and offers compatibility with technologies such as Spring, Apache Kafka, and Apache Camel to support familiar, flexible development models.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;quarkus-as-a-versatile-framework&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#quarkus-as-a-versatile-framework&quot;&gt;&lt;/a&gt;Quarkus as a versatile framework&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beyond staple traits of modern frameworks, Quarkus introduces two platform-defining features: buildtime optimization and deep extensibility.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Buildtime optimization&lt;/strong&gt;: Quarkus shifts work from runtime to build time wherever possible.
This approach reduces startup overhead and memory usage, resulting in a lean, fast, and efficient application tailored for production.&lt;/p&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/mmaler-blog-posts/2-Quarkus-as-a-powerful-runtime/2-build-time-principle.png&quot; alt=&quot;Buildtime principle in Quarkus: being fast by doing less at runtime&quot; width=&quot;100%&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 1. Quarkus performs at build time what traditional frameworks do at runtime: reading configuration files, scanning annotations, and building a model of the application.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/mmaler-blog-posts/2-Quarkus-as-a-powerful-runtime/3-BuildTimeP-Benefits-JVM.png&quot; alt=&quot;Benefits of Quarkus buildtime processing on the JVM&quot; width=&quot;100%&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 2. Thanks to buildtime initialization, the resulting application starts faster and consumes less memory.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/mmaler-blog-posts/2-Quarkus-as-a-powerful-runtime/4-BuildTimeP-Benefits-native.png&quot; alt=&quot;Benefits of Quarkus native image compared to JVM&quot; width=&quot;100%&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 3. All the benefits of buildtime initialization also apply when compiling to a native binary.&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Extensibility&lt;/strong&gt;: Quarkus exposes extension points for everything from startup hooks to request filters.
Over 800 &lt;a href=&quot;https://extensions.quarkus.io&quot;&gt;extensions&lt;/a&gt; allow seamless integration with modern technologies such as Kafka, OpenTelemetry, and OpenID Connect.&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These extensions integrate with Quarkus and participate in its buildtime and runtime lifecycle, making them first-class components of Quarkus.&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;simplified-developer-experience&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#simplified-developer-experience&quot;&gt;&lt;/a&gt;Simplified developer experience&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Frameworks succeed when they reduce complexity without sacrificing flexibility.
Quarkus does exactly that:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Preconfigures popular libraries with sensible defaults.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Offers unified configuration and developer tooling.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provides instant feedback with live reload and continuous testing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dev Services for automatic provisioning of databases, brokers, and other services in dev mode.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Continuous testing to run tests in the background and surface results immediately.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This makes Quarkus both powerful and approachable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can start with a simple REST endpoint and scale it into a production-grade service without changing your development model.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/mmaler-blog-posts/2-Quarkus-as-a-powerful-runtime/6-Frictionless.png&quot; alt=&quot;Frictionless developer experience: live reload, dev services, continuous testing&quot; width=&quot;100%&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 4. Frictionless developer experience: Vastly improved development feedback loop, unified approach to producing different package types, and using proven APIs that Java developers already know.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These features give developers structure, sensible defaults, and clear conventions during development, and they deliver fast startup, low memory use, and operational consistency in production.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;performance-that-matters&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#performance-that-matters&quot;&gt;&lt;/a&gt;Performance that matters&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Teams optimize for different goals, such as startup latency, sustained throughput, memory footprint, elasticity, and cost.
Quarkus addresses these needs by shifting work from run time to build time, keeping one development model across JVM and native, and exposing production signals such as health checks, metrics, and tracing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Start with &lt;strong&gt;JVM mode&lt;/strong&gt; for most services.
On the JVM, Quarkus often starts faster and uses less memory than traditional JVM-based runtimes because it performs more work at build time.
Just-in-time compilation raises steady-state throughput, scales well across cores, and offers mature garbage collectors and tuning options.
The JVM also provides rich observability and diagnostics, which help you understand and tune live systems.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Use &lt;strong&gt;native mode&lt;/strong&gt; when startup latency and memory footprint are strict constraints.
Native executables start in milliseconds and can use less memory, which supports scale-to-zero workflows and lowers idle costs on small instances.
Trade-offs include lower peak throughput, limited multi-core scaling, a single-threaded garbage collector in current native images, longer build times, and a slower inner loop for developers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If your system needs both profiles, split by workload.
Run bursty or event-driven endpoints in native mode, and run long-lived high-throughput services on the JVM.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Observability note.&lt;/strong&gt;
JVM mode exposes richer diagnostics and metrics, including GC, heap, and thread telemetry, JFR, and profiler support, which makes issue triage and performance tuning easier.
Native mode still exports application-level metrics and traces with Micrometer and OpenTelemetry, but it offers fewer VM-level signals.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Always measure your workload:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For native, reduce reflection and dynamic class loading, trim resources, and consider profile-guided optimizations (PGO) where supported. PGO is not available in Mandrel and currently requires an Oracle GraalVM distribution that provides PGO.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For the JVM, choose a garbage collector that matches your latency and heap goals, budget for warmup, and test steady-state throughput under realistic load.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Taken together, these in production choices provide measurable wins:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/mmaler-blog-posts/2-Quarkus-as-a-powerful-runtime/7-success-stories.png&quot; alt=&quot;Real-world success stories using Quarkus&quot; width=&quot;100%&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkus.io/blog/vodafone-greece-replaces-spring-boot/&quot;&gt;Vodafone Greece replaces Spring Boot with Quarkus&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.logicmonitor.com/blog/quarkus-vs-spring&quot;&gt;Quarkus vs. Spring Boot&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;security&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#security&quot;&gt;&lt;/a&gt;セキュリティー&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus uses a standards-first composable security model.
You enable what you need and configure it for your environment:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Transport:&lt;/strong&gt; Enable HTTPS in the application by configuring TLS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Authentication:&lt;/strong&gt; Choose Basic, form-based, mTLS, OpenID Connect (OIDC), or WebAuthN.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Authorization:&lt;/strong&gt; Enforce RBAC on web endpoints with &lt;code&gt;@RolesAllowed&lt;/code&gt;, &lt;code&gt;@DenyAll&lt;/code&gt;, and &lt;code&gt;@PermitAll&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This lets you apply the right security controls for each deployment.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;observability-and-control-surfaces&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#observability-and-control-surfaces&quot;&gt;&lt;/a&gt;Observability and control surfaces&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Common control surfaces, such as metrics, logging, tracing, and configuration, are essential for site reliability engineers (SREs) and platform teams.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus exposes:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Unified logging with &lt;a href=&quot;https://quarkus.io/guides/logging&quot;&gt;&lt;code&gt;quarkus-logging&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Centralized logging with OpenTelemetry (OTLP logs) with &lt;a href=&quot;https://quarkus.io/guides/opentelemetry&quot;&gt;OpenTelemetry&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Metrics and tracing with &lt;a href=&quot;https://quarkus.io/guides/telemetry-micrometer-to-opentelemetry&quot;&gt;Micrometer and OpenTelemetry&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Unified configuration of all the application&amp;#8217;s aspects by using &lt;code&gt;application.properties&lt;/code&gt; or environment variables.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This standardization enables automation and scalable monitoring.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;modular-and-production-ready&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#modular-and-production-ready&quot;&gt;&lt;/a&gt;Modular and production-ready&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Following a lean-core, modular-at-the-edge approach, Quarkus delivers:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A minimal core for fast startup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pluggable extensions for authentication, tracing, messaging, and more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Built-in production primitives, including health checks, readiness and liveness probes, and graceful shutdown.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fault tolerance with standard annotations, for example, retries, circuit breakers, bulkheads, and timeouts.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Whether you are building a prototype or deploying to OpenShift, Quarkus adapts.
This modularity spans both the framework-level APIs developers work with and the runtime behaviors that execute beneath them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Because Quarkus modularity is declarative and unified across extensions, it supports a platform-like developer experience without the rigidity of traditional frameworks.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;building-your-stack-with-quarkus&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#building-your-stack-with-quarkus&quot;&gt;&lt;/a&gt;Building your stack with Quarkus&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will explore this topic in depth in part 3 of this series.
For now, here is how Quarkus fits into the picture.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Frameworks can serve as a foundation for creating higher-level abstractions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus fits this model by enabling teams to build customized stacks and internal frameworks on top of it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unlike many traditional frameworks, Quarkus provides a unified extension architecture that supports deep customization.
Organizations can tailor Quarkus to fit specific domains, technologies, or compliance needs.
This enables the creation of organization-specific developer experiences, including internal stacks built on a unified Quarkus extension architecture.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By encouraging consistency, offering buildtime integration, and exposing clean extension points, Quarkus supports the creation of opinionated, scalable internal frameworks without forking or reinventing the core.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By packaging Quarkus extensions, curated defaults, and service templates into an internal Quarkus stack, teams focus on business logic.
At the same time, your framework layer standardizes infrastructure, security, and operational integrations across services.
This has been proven by Logicdrop, who refactored their entire Spring Boot stack with Quarkus, reducing container size by ~75%, achieving sub-second startup times, and significantly improving developer productivity.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information, see the &lt;a href=&quot;https://quarkus.io/blog/logicdrop-customer-story/&quot;&gt;Logicdrop customer story&lt;/a&gt; and their &lt;a href=&quot;https://quarkus.io/blog/logicdrop-automating-quarkus-with-gitlab/?utm_source=chatgpt.com&quot;&gt;GitLab automation write-up&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot;&gt;&lt;/a&gt;まとめ&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus unifies the strengths of a development framework and a runtime.
As a framework, it provides structure, conventions, and a cohesive developer experience.
As a runtime, it delivers fast startup, low memory use, and operational consistency in the cloud.
This dual role helps teams standardize practices, reduce costs, and ship resilient cloud-native services.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus is built in the open under the Apache License 2.0, governed with the Commonhaus model, and developed end-to-end on GitHub.
Beyond the core project, the ecosystem includes the &lt;a href=&quot;https://hub.quarkiverse.io/&quot;&gt;Quarkiverse Hub&lt;/a&gt;, a community-run collection of &lt;a href=&quot;https://quarkus.io/extensions/&quot;&gt;Quarkus extensions&lt;/a&gt; and related projects.
The Quarkiverse Hub provides repository hosting with build, CI, and release publishing, so features land as versioned, testable modules you can adopt, fork, or extend.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/posts/mmaler-blog-posts/2-Quarkus-as-a-powerful-runtime/8-expectations.png&quot; alt=&quot;Setting expectations for performance and developer experience with Quarkus&quot; width=&quot;100%&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, that’s all for now, thank you for reading, and let’s meet again in the third article of this series, which will cover building your own stack with Quarkus.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For a closer look at how Quarkus makes Java cloud-native, see the &lt;a href=&quot;https://quarkus.io/blog/mmaler-blogpost-1-intro/&quot;&gt;introductory blog post&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Thu, 27 Nov 2025 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/mmaler-blogpost-2-quarkus-runtime-and-framework-for-cloud-native-java/
            </guid>
            
            
            
            <author>Michal Mickey Maléř (https://twitter.com/mickeymaler)</author>
            
        </item>
        
        <item>
            <title>Quarkus 3.30 - JsonView on REST Client, Hibernate Validator 9.1, CLI decrypt command, and more</title>
            <link>
                https://quarkus.io/blog/quarkus-3-30-released/
            </link>
            <description>
                &lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today, we released Quarkus 3.30.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.30 introduces the following notable changes:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/51043&quot;&gt;#51043&lt;/a&gt; - Introduce support for &lt;code&gt;@JsonView&lt;/code&gt; on the REST Client&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/50196&quot;&gt;#50196&lt;/a&gt; - Update to Hibernate Validator 9.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/50332&quot;&gt;#50332&lt;/a&gt; - Add a CLI command to decrypt secrets&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/50723&quot;&gt;#50723&lt;/a&gt; - OIDC token propagation - allow users to select REST Client methods for which token should be propagated&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/50806&quot;&gt;#50806&lt;/a&gt; - Support method-level &lt;code&gt;@OidcClientFilter&lt;/code&gt; bindings&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/pull/50952&quot;&gt;#50952&lt;/a&gt; - Use &lt;code&gt;@QuarkusIntegrationTest&lt;/code&gt; tests as a test run for AOT file generation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As usual, this release also includes many bug fixes and improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update&quot;&gt;&lt;/a&gt;Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkus 3.30 に更新するには、Quarkus CLI の最新バージョンに更新してから、以下を実行することをお勧めします。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;highlightjs highlight&quot;&gt;&lt;code class=&quot;language-bash hljs&quot; data-lang=&quot;bash&quot;&gt;quarkus update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;なお、&lt;code&gt;quarkus update&lt;/code&gt; は、Quarkus の任意のバージョン (2.x を含む) から Quarkus 3.30 へとアプリケーションを更新できます。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;アプリケーションに必要な調整の詳細については、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.30&quot;&gt;Quarkus 3.30 移行ガイド&lt;/a&gt; を参照してください。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;whats-new&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-new&quot;&gt;&lt;/a&gt;変更点&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;rest-client&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#rest-client&quot;&gt;&lt;/a&gt;RESTクライアント&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;@JsonView&lt;/code&gt; support has been added to the REST Client.
You can now use this annotation on your REST Client interfaces to control the serialization and deserialization of JSON data based on different views.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This feature used to be only supported on the server side.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;hibernate-validator&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hibernate-validator&quot;&gt;&lt;/a&gt;Hibernate Validator&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hibernate Validator has been updated to version 9.1, which comes with some significant performance improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;cli&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cli&quot;&gt;&lt;/a&gt;コマンドラインインタフェース&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A new &lt;code&gt;config decrypt&lt;/code&gt; command has been added to the Quarkus CLI to decrypt secrets that were encrypted using the &lt;code&gt;quarkus config encrypt&lt;/code&gt; command.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;oidc&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#oidc&quot;&gt;&lt;/a&gt;OIDC&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;OIDC token propagation has been enhanced to allow users to select specific REST Client methods for which the token should be propagated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, method-level &lt;code&gt;@OidcClientFilter&lt;/code&gt; bindings are now supported, allowing for more granular control over OIDC client behavior.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;aot-cache&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#aot-cache&quot;&gt;&lt;/a&gt;AOT cache&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;@QuarkusIntegrationTest&lt;/code&gt; tests are now used as a test run for AOT file generation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;full-changelog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-changelog&quot;&gt;&lt;/a&gt;完全な変更履歴&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can get the full changelog of &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.30.0.CR1&quot;&gt;3.30.0.CR1&lt;/a&gt;, &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.30.0&quot;&gt;3.30.0&lt;/a&gt;, and &lt;a href=&quot;https://github.com/quarkusio/quarkus/releases/tag/3.30.1&quot;&gt;3.30.1&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot;&gt;&lt;/a&gt;コントリビューター&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Quarkus community is growing and has now &lt;a href=&quot;https://github.com/quarkusio/quarkus/graphs/contributors&quot;&gt;1136 contributors&lt;/a&gt;.
Many many thanks to each and everyone of them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In particular for the 3.30 release, thanks to Ales Justin, Alexey Loubyansky, Andreas Repp, Andy Damevin, Antonio Musarra, Aurea Munoz, azerr, Bruno Baptista, Christian Pieczewski, Clement Escoffier, David M. Lloyd, Eric Deandrea, eschcam, Foivos Zakkak, Fouad Almalki, Galder Zamarreño, George Gastaldi, Georgios Andrianakis, Greg Stewart, Guillaume Smet, Holly Cummins, Jakub Pietrzak, James Netherton, Jan Martiska, jcarranzan, jcjveraa, Johannes Schleger, Jonas Rutishauser, Juan Antonio Breña Moral, Julien Ponge, Junior DUSSOUILLEZ, Karm Michal Babacek, Kevin Ferrare, Ladislav Thon, Loïc Hermann, Luca Molteni, Lucas Reeh, Maciej Swiderski, Manuel Müller, Marco Belladelli, mariofusco, marko-bekhta, Martin Kouba, Matej Novotny, Matej Vašek, Matheus Cruz, Melloware, Michael Edgar, Michal Vavřík, Nicolo Pietro Belcastro, Ozan Gunalp, Peter Palaga, Phillip Krüger, Pierre Beitz, Robert Stupp, Roberto Cortez, Rolfe Dlugy-Hegwer, Rostislav Svoboda, Sanne Grinovero, Sergey Beryozkin, staillebois, Stéphane Épardaud, Teymur Babayev, Thomas Segismont, Tomas Hofman, Willem Jan Glerum, xstefank, and Yoann Rodière.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;come-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#come-join-us&quot;&gt;&lt;/a&gt;参加のお誘い&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;私達は皆様からのフィードバックに重きを置いています。バグ報告、改善要望を是非お願いします。一緒に素晴らしいものを作り上げていきましょう!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quarkusユーザーの場合でも、単に興味を持っているだけの場合でも、恥ずかしがらずにコミュニティに参加して下さい!:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/quarkusio/quarkus/issues&quot;&gt;GitHub&lt;/a&gt; でフィードバック&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コードを作成し、 &lt;a href=&quot;https://github.com/quarkusio/quarkus/pulls&quot;&gt;プルリクエスト&lt;/a&gt; を送信&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://quarkusio.zulipchat.com/&quot;&gt;Zulip&lt;/a&gt; や &lt;a href=&quot;https://groups.google.com/d/forum/quarkus-dev&quot;&gt;メーリングリスト&lt;/a&gt; でディスカッションに参加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/quarkus&quot;&gt;Stack Overflow&lt;/a&gt; で質問&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
            </description>
            <pubDate>Wed, 26 Nov 2025 00:00:00 +0000</pubDate>
            <guid>
                https://quarkus.io/blog/quarkus-3-30-released/
            </guid>
            
            
            
            <author>Guillaume Smet (https://twitter.com/gsmet_)</author>
            
        </item>
        
    </channel>
</rss>
