<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>User blog: Tamas on Maveniverse</title><link>https://maveniverse.eu/blog/cstamas/</link><description>Recent content in User blog: Tamas on Maveniverse</description><generator>Hugo</generator><language>en</language><atom:link href="https://maveniverse.eu/blog/cstamas/index.xml" rel="self" type="application/rss+xml"/><item><title>DOMTrip</title><link>https://maveniverse.eu/blog/2026/02/05/domtrip/</link><pubDate>Thu, 05 Feb 2026 15:07:53 +0100</pubDate><guid>https://maveniverse.eu/blog/2026/02/05/domtrip/</guid><description>&lt;div class="pageinfo pageinfo-primary"&gt;
&lt;p&gt;Round-trip editing is a programmatic changing/editing of an existing XML document, like for example a Maven POM is, while
preserving all the formatting, comments and all properties of the original document.&lt;/p&gt;

&lt;/div&gt;

&lt;p&gt;Programmatic &amp;ldquo;editing&amp;rdquo; of POMs and other Maven related (mostly XML) files was long time requirement. Just think about
Maven Release Plugin that &amp;ldquo;rewrites&amp;rdquo; the version of project during release process.&lt;/p&gt;
&lt;p&gt;Moreover, as Maven 4 is coming, the good old Xpp3Dom parser was out of the question, as Maven 4 model contains
substantial changes, and moreover, is not using anymore the Xpp3Dom parser, but the Woodstox XML parser instead.
Still, Maven universe, and especially legacy Maven universe was not always &amp;ldquo;good citizen&amp;rdquo; when it comes to XML, many
POMs have to be &amp;ldquo;lax parsed&amp;rdquo;, as they had (known or unknown) issues.&lt;/p&gt;</description></item><item><title>Maven @ IPFS (II)</title><link>https://maveniverse.eu/blog/2026/02/03/maven-@-ipfs-ii/</link><pubDate>Tue, 03 Feb 2026 11:55:53 +0100</pubDate><guid>https://maveniverse.eu/blog/2026/02/03/maven-@-ipfs-ii/</guid><description>&lt;div class="pageinfo pageinfo-info"&gt;
&lt;p&gt;Lately has been toying with IPFS to achieve content sharing without centralized infrastructure. In other words, instead
to free-ride on some (centralized) infrastructure that may be a public good, or some commercial offering, solve the publishing
(and also &amp;ldquo;owning&amp;rdquo; and &amp;ldquo;hosting&amp;rdquo; the data) by my self.&lt;/p&gt;
&lt;p&gt;This entry explains the simplest use case: &amp;ldquo;small scale publishing&amp;rdquo;. Other use cases are &amp;ldquo;global caching&amp;rdquo; and will
work them out later.&lt;/p&gt;
&lt;p&gt;Related previous &lt;a href="https://maveniverse.eu/blog/2026/01/22/maven-@-ipfs-i/"&gt;blog article is here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Goal go-offline must go</title><link>https://maveniverse.eu/blog/2026/02/03/goal-go-offline-must-go/</link><pubDate>Tue, 03 Feb 2026 10:55:53 +0100</pubDate><guid>https://maveniverse.eu/blog/2026/02/03/goal-go-offline-must-go/</guid><description>&lt;p&gt;The Maven &lt;a href="https://maven.apache.org/plugins/maven-dependency-plugin/go-offline-mojo.html"&gt;&lt;code&gt;go-offline&lt;/code&gt;&lt;/a&gt; goal is inherently bad, and will try explain it why.
For related discussion, see &lt;a href="https://github.com/apache/maven-dependency-plugin/issues/1405"&gt;this issue&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="maven-4-is-not-maven-2"&gt;Maven 4 is not Maven 2&lt;/h2&gt;
&lt;p&gt;The history of this goal predates many Maven version, and it appeared around Maven 1 or Maven 2. People simply wanted
to &amp;ldquo;go offline&amp;rdquo; (fx while traveling, those were the 2000s!) and pre-populate their local repository with required
artifacts cached.&lt;/p&gt;
&lt;p&gt;But, as I tried to explain my several previous articles (see &lt;a href="https://maveniverse.eu/blog/2025/11/09/maven-local-repository/"&gt;Local repository&lt;/a&gt;),
in Maven 2 and before, local repository was really just a &amp;ldquo;bunch of files&amp;rdquo;. This is not true since Maven 3.0 released in
2010!&lt;/p&gt;</description></item><item><title>Maven @ IPFS (I)</title><link>https://maveniverse.eu/blog/2026/01/22/maven-@-ipfs-i/</link><pubDate>Thu, 22 Jan 2026 10:55:53 +0100</pubDate><guid>https://maveniverse.eu/blog/2026/01/22/maven-@-ipfs-i/</guid><description>&lt;p&gt;Lately has been toying with IPFS to achieve content sharing without centralized infrastructure. In other words, instead
to free-ride on some (centralized) infrastructure that may be a public good, or some commercial offering, solve the publishing
(and also &amp;ldquo;owning&amp;rdquo; and &amp;ldquo;hosting&amp;rdquo; the data) by my self. Kinda reminded me this to early 2000s, when many ran
Maven repositories in their own basements, making access to their repositories fragile, with longevity accessibility
and uptimes totally unpredictable. That was before Central, which consolidated but also promoted itself as single point of
failure. And hence, ended up as over- and misused, see &lt;a href="https://www.sonatype.com/blog/maven-central-and-the-tragedy-of-the-commons"&gt;Maven Central and the Tragedy of the Commons&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Finding own footsteps</title><link>https://maveniverse.eu/blog/2026/01/16/finding-own-footsteps/</link><pubDate>Fri, 16 Jan 2026 18:48:53 +0100</pubDate><guid>https://maveniverse.eu/blog/2026/01/16/finding-own-footsteps/</guid><description>&lt;p&gt;I bet many of us faced a problem, spent almost whole day on chasing it, just to discover their own footsteps around&amp;hellip;&lt;/p&gt;
&lt;p&gt;My case was that I had a strange issue with Njord ITs: one PR was &amp;ldquo;fine&amp;rdquo;, except the ITs failed only on single combo: Maven 4-rc-5
on Java 17. Matrix had 21 and even 25, and they were fine.&lt;/p&gt;
&lt;p&gt;It all started by adding this &amp;ldquo;mostly harmless&amp;rdquo; repository stanza to the POM:&lt;/p&gt;</description></item><item><title>Maven Components and (maximum) Java bytecode</title><link>https://maveniverse.eu/blog/2026/01/15/maven-components-and-maximum-java-bytecode/</link><pubDate>Thu, 15 Jan 2026 15:31:23 +0100</pubDate><guid>https://maveniverse.eu/blog/2026/01/15/maven-components-and-maximum-java-bytecode/</guid><description>&lt;p&gt;Multiple times I see people confused about &amp;ldquo;what is the java bytecode version Maven supports&amp;rdquo;?&lt;/p&gt;
&lt;p&gt;It depends very much on which version of Maven you want to support:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maven 3.8.9-3.9.5 uses Sisu 0.3.5 that &lt;strong&gt;shades ASM 5.0.2&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Maven 3.9.6-3.9.7 uses Sisu 0.9.0.M2 that &lt;strong&gt;shades ASM 9.4&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Maven 3.9.8-3.9.9 uses Sisu 0.9.0.M3 that &lt;strong&gt;shades ASM 9.6&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Maven 3.9.10-3.9.11 uses Sisu 0.9.0.M4 that &lt;strong&gt;depend on ASM 9.8&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Maven 3.9.12+ uses Sisu 0.9.0.M4 that &lt;strong&gt;depend on ASM 9.9&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The ASM library is used by Sisu to &amp;ldquo;lightly introspect&amp;rdquo; classes enumerated on sisu-index for annotations. Hence,
it depends on used ASM version, what bytecode versions can Sisu inspect, and in essence, what maximum bytecode level
components may be, to have them picked up by Maven. Components not recognized (not being able to introspect) are
silently skipped. Your friend is &lt;code&gt;-Dsisu.debug&lt;/code&gt; that will tell you about all the issues it finds.&lt;/p&gt;</description></item><item><title>Lockfiles</title><link>https://maveniverse.eu/blog/2025/12/06/lockfiles/</link><pubDate>Sat, 06 Dec 2025 15:31:23 +0100</pubDate><guid>https://maveniverse.eu/blog/2025/12/06/lockfiles/</guid><description>&lt;div class="pageinfo pageinfo-info"&gt;
&lt;p&gt;A short attempt to explain why Maven does not have &amp;ldquo;lockfile&amp;rdquo;, at least not in a sense many other build tools
and ecosystems have. Next, will try to point out features that somewhat supplement various aspects
of lock files. Finally, will throw in some bait and markers where we plan to go from here.&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id="what-are-lock-files"&gt;What are lock files?&lt;/h2&gt;
&lt;p&gt;For context would like to point to ML discussion &lt;a href="https://lists.apache.org/thread/ofmy316jk9z0y6dwcjybvrwbv71993fh"&gt;ongoing here&lt;/a&gt;.
In general, lock files usually carry following information or aspects:&lt;/p&gt;</description></item><item><title>Why are MRM group repositories bad?</title><link>https://maveniverse.eu/blog/2025/11/09/why-are-mrm-group-repositories-bad/</link><pubDate>Sun, 09 Nov 2025 21:34:23 +0100</pubDate><guid>https://maveniverse.eu/blog/2025/11/09/why-are-mrm-group-repositories-bad/</guid><description>&lt;div class="pageinfo pageinfo-info"&gt;
&lt;p&gt;The notion of &amp;ldquo;group repository&amp;rdquo; was introduced by first Maven Repository Manager-like solution (then called &amp;ldquo;caching proxy&amp;rdquo;, today simply MRM):
Proximity, &lt;a href="https://lists.apache.org/thread/vp9ghlncvvnozcs3mqh9ghsmmrksyoh5"&gt;announced on Maven devlist in 2005&lt;/a&gt;. Since
then, almost all major MRM implementations implemented it. Some called it &amp;ldquo;group repository&amp;rdquo;, others &amp;ldquo;virtual repository&amp;rdquo;,
but the fundamental idea remained the same: publish (and aggregate) multiple repositories over same URL. For brevity’s
sake, I will use the term &amp;ldquo;group repository&amp;rdquo; (GR) along with &amp;ldquo;hosted repository&amp;rdquo; (HR) and &amp;ldquo;proxy repository&amp;rdquo; (PR), while
some solutions out there may use slightly different (but fundamentally equivalent) terms.&lt;/p&gt;</description></item><item><title>Maven Local Repository (II)</title><link>https://maveniverse.eu/blog/2025/11/09/maven-local-repository-ii/</link><pubDate>Sun, 09 Nov 2025 12:34:23 +0100</pubDate><guid>https://maveniverse.eu/blog/2025/11/09/maven-local-repository-ii/</guid><description>&lt;h2 id="the-problems"&gt;The Problems&lt;/h2&gt;
&lt;p&gt;The problem with Maven local repository is manifold: it is &lt;strong&gt;global&lt;/strong&gt; and is &lt;strong&gt;mutable&lt;/strong&gt;. To solve these issues
we chased things like &amp;ldquo;repository locking&amp;rdquo; in Maven 3.9 that proved futile, somewhat.&lt;/p&gt;
&lt;h2 id="first-problem"&gt;First problem&lt;/h2&gt;
&lt;p&gt;Originally, in Maven2 (hence the &lt;code&gt;~/.m2&lt;/code&gt; directory) the local repository (by default located in &lt;code&gt;~/.m2/repository&lt;/code&gt;)
was a &amp;ldquo;bunch of files&amp;rdquo;: it contained cached artifacts from remotes, and also installed (locally built) artifacts
as well. Basically, a file was present or absent, hence it got used if present, or downloaded if absent. On the
other hand, this behaviour introduced several problems too, most of them resulting in &amp;ldquo;works for me&amp;rdquo; mysterious issues,
usually revealed once user nuked local repository (ie build passed on one but failed on other workstation; most often
due a dependency artifact present in local repository on one workstation but absent other; while the initial issue was
build POM lacking a repository declaration, from where the artifact in question should come. Basically, build
depend on &amp;ldquo;state&amp;rdquo; of workstation, or more precisely, on &amp;ldquo;state&amp;rdquo; of local repository on it).&lt;/p&gt;</description></item><item><title>POM proliferation, part 2</title><link>https://maveniverse.eu/blog/2025/09/16/pom-proliferation-part-2/</link><pubDate>Tue, 16 Sep 2025 14:34:23 +0100</pubDate><guid>https://maveniverse.eu/blog/2025/09/16/pom-proliferation-part-2/</guid><description>&lt;div class="pageinfo pageinfo-info"&gt;
&lt;p&gt;This blog entry was done as a response to &lt;a href="https://www.liutikas.net/2025/06/12/Pom-Pom-Pom.html"&gt;Pom-Pom-Pom&lt;/a&gt;.
Note: this entry does not want to be hurting, personal or anything like that; still my native language is not
english, so bear with me (and feel free to create updates to it).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note: I talk (and reason) about Java and JARs in general, and not about C or any other language than Java.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You may want to check out &lt;a href="https://maveniverse.eu/blog/2025/07/02/pom-proliferation-part-1"&gt;part 1&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Maven Local Repository (I)</title><link>https://maveniverse.eu/blog/2025/09/16/maven-local-repository-i/</link><pubDate>Tue, 16 Sep 2025 12:34:23 +0100</pubDate><guid>https://maveniverse.eu/blog/2025/09/16/maven-local-repository-i/</guid><description>&lt;div class="pageinfo pageinfo-info"&gt;
&lt;p&gt;The topic is about Maven Local Repository. You know, that thing that some people insist on protecting from &amp;ldquo;pollution&amp;rdquo;.&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id="where-to-start"&gt;Where to start?&lt;/h2&gt;
&lt;p&gt;Maven Local Repository, as we know it, is a mish-mash of cache and staging (locally built and installed) artifacts.
Hence, no matter how much you dislike it, it &lt;strong&gt;is part of your &amp;ldquo;build context&amp;rdquo;&lt;/strong&gt;, as without it, you would have no build.&lt;/p&gt;
&lt;p&gt;Then a logical followup would be something along this: maybe we should tinker about stop using &lt;strong&gt;global&lt;/strong&gt; local
repository, and make it &lt;strong&gt;per-project&lt;/strong&gt; instead?&lt;/p&gt;</description></item><item><title>POM proliferation, part 1</title><link>https://maveniverse.eu/blog/2025/07/02/pom-proliferation-part-1/</link><pubDate>Wed, 02 Jul 2025 12:34:23 +0100</pubDate><guid>https://maveniverse.eu/blog/2025/07/02/pom-proliferation-part-1/</guid><description>&lt;div class="pageinfo pageinfo-info"&gt;
&lt;p&gt;This blog entry was done as a response to &lt;a href="https://www.liutikas.net/2025/06/12/Pom-Pom-Pom.html"&gt;Pom-Pom-Pom&lt;/a&gt;.
Note: this entry does not want to be hurting, personal or anything like that; still my native language is not
english, so bear with me (and feel free to create updates to it).&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id="where-to-start"&gt;Where to start?&lt;/h2&gt;
&lt;p&gt;By reading that article, I frankly have no idea where to start. Take the title for example: &amp;ldquo;Brief history of
POM proliferation&amp;rdquo;, and the article has nothing about it at all. So let me fill in, as history is important.&lt;/p&gt;</description></item><item><title>Mimir and RRF</title><link>https://maveniverse.eu/blog/2025/06/12/mimir-and-rrf/</link><pubDate>Thu, 12 Jun 2025 12:25:23 +0100</pubDate><guid>https://maveniverse.eu/blog/2025/06/12/mimir-and-rrf/</guid><description>&lt;p&gt;Just to remind people about Mimir, and why they want to use it: if you remember the &lt;a href="https://maveniverse.eu/blog/2025/03/17/never-say-never"&gt;Never Say Never&lt;/a&gt; blog entry
diagram:&lt;/p&gt;
&lt;pre class="mermaid"&gt;sequenceDiagram
 autoNumber
 Session-&amp;gt;&amp;gt;Session: lookup
 Session-&amp;gt;&amp;gt;Local Repositories: lookup
 Session-&amp;gt;&amp;gt;Remote Repositories: lookup&lt;/pre&gt;
&lt;p&gt;With Mimir on board, it changes to this:&lt;/p&gt;
&lt;pre class="mermaid"&gt;sequenceDiagram
 autoNumber
 Session-&amp;gt;&amp;gt;Session: lookup
 Session-&amp;gt;&amp;gt;Local Repositories: lookup
 Session-&amp;gt;&amp;gt;Mimir Cache: lookup
 Mimir Cache-&amp;gt;&amp;gt;Remote Repositories: lookup and cache&lt;/pre&gt;
&lt;p&gt;This means, that &lt;strong&gt;nuking local repository&lt;/strong&gt; is not an impediment anymore, as you still have everything in your
Mimir cache, and building is as fast as with populated local repository.&lt;/p&gt;</description></item><item><title>Keep Central first!</title><link>https://maveniverse.eu/blog/2025/06/12/keep-central-first/</link><pubDate>Thu, 12 Jun 2025 12:20:23 +0100</pubDate><guid>https://maveniverse.eu/blog/2025/06/12/keep-central-first/</guid><description>&lt;p&gt;Just an advice: when using Maven 3 (and 4) you do want to make sure Central is always first remote repository
Maven would &amp;ldquo;consult&amp;rdquo;. Just add following snippet(s) to your user-wide &lt;code&gt;settings.xml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;profiles&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;profile&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;oss-development&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;repositories&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;repository&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;central&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://repo.maven.apache.org/maven2/&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;releases&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;enabled&amp;gt;&lt;/span&gt;true&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/enabled&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;updatePolicy&amp;gt;&lt;/span&gt;never&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/updatePolicy&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/releases&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;snapshots&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;enabled&amp;gt;&lt;/span&gt;false&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/enabled&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/snapshots&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/repository&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/repositories&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;pluginRepositories&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;pluginRepository&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;central&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://repo.maven.apache.org/maven2/&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;releases&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;enabled&amp;gt;&lt;/span&gt;true&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/enabled&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;updatePolicy&amp;gt;&lt;/span&gt;never&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/updatePolicy&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/releases&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;snapshots&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;enabled&amp;gt;&lt;/span&gt;false&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/enabled&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/snapshots&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/pluginRepository&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/pluginRepositories&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/profile&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/profiles&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;activeProfiles&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;activeProfile&amp;gt;&lt;/span&gt;oss-development&lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/activeProfile&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#204a87;font-weight:bold"&gt;&amp;lt;/activeProfiles&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With this in your user with Maven settings, Maven will take care to keep Central first.&lt;/p&gt;</description></item><item><title>build != testing != publishing</title><link>https://maveniverse.eu/blog/2025/06/01/build-testing-publishing/</link><pubDate>Sun, 01 Jun 2025 12:15:23 +0100</pubDate><guid>https://maveniverse.eu/blog/2025/06/01/build-testing-publishing/</guid><description>&lt;div class="pageinfo pageinfo-info"&gt;
&lt;p&gt;This article represents my own stance, and should not be taken as any kind of &amp;ldquo;rule&amp;rdquo;.&lt;/p&gt;

&lt;/div&gt;

&lt;h1 id="build--testing--publishing"&gt;build != testing != publishing&lt;/h1&gt;
&lt;p&gt;People tend to go for simplest solutions, and that is okay. Still, that is many times not quite feasible.&lt;/p&gt;
&lt;p&gt;As an awkward example, that is completely viable: you may want to use Maven 4.0.x to build a Maven 3 plugin (why not?). But this is raising several questions, one of them is how to test the built plugin? Assuming you want to support Maven 3 with built plugin, it has to be Java 8 level. Using Maven 4 to run directly ITs for Java 8 is not doable, as Maven 4 requires Java 17 at runtime.&lt;/p&gt;</description></item><item><title>Never Say Never</title><link>https://maveniverse.eu/blog/2025/03/17/never-say-never/</link><pubDate>Mon, 17 Mar 2025 21:55:22 +0100</pubDate><guid>https://maveniverse.eu/blog/2025/03/17/never-say-never/</guid><description>&lt;div class="pageinfo pageinfo-info"&gt;
&lt;p&gt;This article assumes reader has basic knowledge about Maven, POM and related things. The main point is to offer high
level conceptualization and explain things &amp;ldquo;why&amp;rsquo;s&amp;rdquo; and &amp;ldquo;why not&amp;rdquo;, and finally explain why you don&amp;rsquo;t want to listen to
folks that tells you &amp;ldquo;never do&amp;hellip;&amp;rdquo; (unless they are your parents).&lt;/p&gt;
&lt;p&gt;This article is mostly about Maven 3, but mentions Maven 4 as well.&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id="the-pieces"&gt;The pieces&lt;/h2&gt;
&lt;p&gt;In Maven you will read about following very important things:&lt;/p&gt;</description></item><item><title>Maven4 ante portas! (Part 1)</title><link>https://maveniverse.eu/blog/2024/12/07/maven4-ante-portas-part-1/</link><pubDate>Sat, 07 Dec 2024 13:00:00 +0100</pubDate><guid>https://maveniverse.eu/blog/2024/12/07/maven4-ante-portas-part-1/</guid><description>&lt;p&gt;Maven4 is coming, so it may be time to explain some of the changes it will bring on.
I&amp;rsquo;d like to start from &amp;ldquo;user facing&amp;rdquo; end, the &lt;code&gt;mvn&lt;/code&gt; command and what has changed
(visible and invisible changes).&lt;/p&gt;
&lt;h2 id="how-it-was-maven3"&gt;How it was: Maven3&lt;/h2&gt;
&lt;p&gt;In short, Maven3 has a well known &lt;code&gt;mvn&lt;/code&gt; (and &lt;code&gt;mvn.cmd&lt;/code&gt; Windows counterpart) script in place
that users invoke. This script observed some of the environment variables (think &lt;code&gt;MAVEN_OPTS&lt;/code&gt;
and others), observed &lt;code&gt;mavenrc&lt;/code&gt; file, tried to find &lt;code&gt;.mvn&lt;/code&gt; directory and also load &lt;code&gt;.mvn/jvm.config&lt;/code&gt;
from it, if existed, and finally, it fired up Java calling
&lt;a href="https://codehaus-plexus.github.io/plexus-classworlds/launcher.html"&gt;ClassWorlds launcher&lt;/a&gt;
class and setting the launcher configuration to &lt;code&gt;conf/m2.conf&lt;/code&gt; file.&lt;/p&gt;</description></item><item><title>Handling sensitive data in Maven</title><link>https://maveniverse.eu/blog/2024/12/07/handling-sensitive-data-in-maven/</link><pubDate>Sat, 07 Dec 2024 12:56:00 +0100</pubDate><guid>https://maveniverse.eu/blog/2024/12/07/handling-sensitive-data-in-maven/</guid><description>&lt;p&gt;Maven is well known for flexible configurability. Many times, those configuration and setting
files can contain sensitive data (like passwords). Long time ago, it was even common practice
to put &lt;code&gt;gpg.passphrase&lt;/code&gt; in POM properties! The latest GPG plugin releases introduced
&lt;code&gt;bestPractice&lt;/code&gt; parameter, that when enabled, prevents getting the GPG passphrase in
&amp;ldquo;insecure&amp;rdquo; ways. Furthermore, new versions of GPG plugin will flip the default value
and finally remove all the related parameters (see &lt;a href="https://issues.apache.org/jira/browse/MGPG-146"&gt;MGPG-146&lt;/a&gt;
for details).&lt;/p&gt;</description></item><item><title>Migrating to Maven 3, part 3</title><link>https://maveniverse.eu/blog/2024/09/09/migrating-to-maven-3-part-3/</link><pubDate>Mon, 09 Sep 2024 19:16:22 +0200</pubDate><guid>https://maveniverse.eu/blog/2024/09/09/migrating-to-maven-3-part-3/</guid><description>&lt;p&gt;From Maven perspective, whether a component is defined as Plexus component (via Plexus XML, crafted manually or during build
with &lt;code&gt;plexus-component-metadata&lt;/code&gt; Maven Plugin) or JSR330 component, does not matter.&lt;/p&gt;
&lt;p&gt;But there is a subtle difference.&lt;/p&gt;
&lt;p&gt;Plexus components store their &amp;ldquo;definition&amp;rdquo; in XML that is usually embedded in JAR, so Plexus DI has not much to do
aside to parse the XML and use Java usual means to instantiate it, populates/wires up requirements and publish it.&lt;/p&gt;</description></item><item><title>What is MIMA (and what is not)?</title><link>https://maveniverse.eu/blog/2024/09/07/what-is-mima-and-what-is-not/</link><pubDate>Sat, 07 Sep 2024 21:55:22 +0100</pubDate><guid>https://maveniverse.eu/blog/2024/09/07/what-is-mima-and-what-is-not/</guid><description>&lt;p&gt;Here am trying to explain what is &lt;a href="https://github.com/maveniverse/mima"&gt;Maveniverse/MIMA&lt;/a&gt;, but also to explain
what it is not.&lt;/p&gt;
&lt;p&gt;There is Maven, as we know it, and there are libraries that Maven uses to be &amp;ldquo;Maven as we know it&amp;rdquo;, like
&lt;a href="https://github.com/apache/maven-resolver"&gt;Resolver&lt;/a&gt; is. Many times, use case requires use of &amp;ldquo;Resolver only&amp;rdquo;
without all the fuss and fluff of Maven. Historically, there was the &lt;code&gt;ServiceLocator&lt;/code&gt;, that made Resolver
&lt;strong&gt;somewhat reusable&lt;/strong&gt; outside of Maven, but then &lt;a href="https://issues.apache.org/jira/browse/MRESOLVER-157"&gt;MRESOLVER-157&lt;/a&gt;
came in, so what now?&lt;/p&gt;</description></item><item><title>Migrating to Maven 3, part 2</title><link>https://maveniverse.eu/blog/2024/09/07/migrating-to-maven-3-part-2/</link><pubDate>Sat, 07 Sep 2024 20:55:22 +0100</pubDate><guid>https://maveniverse.eu/blog/2024/09/07/migrating-to-maven-3-part-2/</guid><description>&lt;p&gt;A small fable for myself and others&amp;hellip;&lt;/p&gt;
&lt;p&gt;The Takari &lt;a href="https://github.com/takari/polyglot-maven/releases/tag/polyglot-0.7.1"&gt;Polyglot Maven 0.7.1&lt;/a&gt; was released not
so long ago, and it contained one trivial change, this &lt;a href="https://github.com/takari/polyglot-maven/pull/319"&gt;pull request&lt;/a&gt;.
The goal was to fix following issue: JRuby folks had some problem, that could be solved among other ways, by creating a
&amp;ldquo;custom JRuby Polyglot Maven distribution&amp;rdquo; (see related &lt;a href="https://github.com/takari/polyglot-maven/pull/323"&gt;pull request&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;But, while testing this, I came to strange conclusion: the Polyglot extension &lt;strong&gt;did work&lt;/strong&gt; when loaded up through
&lt;code&gt;.mvn/extensions.xml&lt;/code&gt;, but &lt;strong&gt;did not work&lt;/strong&gt; when loaded up from core (when it was added to &lt;code&gt;lib/ext&lt;/code&gt; of custom
Maven distribution). &lt;a href="https://github.com/takari/polyglot-maven/pull/319"&gt;Fix&lt;/a&gt; seemed simple, raised the priority of &lt;code&gt;TeslaModelProcessor&lt;/code&gt; and done. Polyglot started
working when in &lt;code&gt;lib/ext&lt;/code&gt;, so I released 0.7.1.&lt;/p&gt;</description></item><item><title>Migrating to Maven 3, part 1</title><link>https://maveniverse.eu/blog/2024/09/07/migrating-to-maven-3-part-1/</link><pubDate>Sat, 07 Sep 2024 17:55:22 +0100</pubDate><guid>https://maveniverse.eu/blog/2024/09/07/migrating-to-maven-3-part-1/</guid><description>&lt;p&gt;As weird as title sounds, given Maven 4 is &amp;ldquo;around the corner&amp;rdquo;, the sad reality is that there are still way too many libraries and
plugins in &amp;ldquo;Maven ecosystem&amp;rdquo; that rely on some sort of &amp;ldquo;compatibility&amp;rdquo; layers (and deprecated things) in Maven 3. For example
&lt;a href="https://github.com/eclipse-sisu/sisu-project"&gt;Eclipse Sisu&lt;/a&gt; is fully functional and in charge since
Maven 3.1.0 (released in 2013, when last missing piece, support for &amp;ldquo;sisu index&amp;rdquo; was added). Maven project during it&amp;rsquo;s
existence did pile up some of the debts, or in other words, &amp;ldquo;moved past&amp;rdquo; some well known libraries.
Plexus DI Container and Wagon being the most notable examples.&lt;/p&gt;</description></item><item><title>Very simple CI setup</title><link>https://maveniverse.eu/blog/2024/09/07/very-simple-ci-setup/</link><pubDate>Sat, 07 Sep 2024 15:55:22 +0100</pubDate><guid>https://maveniverse.eu/blog/2024/09/07/very-simple-ci-setup/</guid><description>&lt;p&gt;I&amp;rsquo;d just like to throw in a short explanation how (IMHO) should organize CI jobs for simple Maven projects for
better and faster turnaround.&lt;/p&gt;
&lt;p&gt;People usually &amp;ldquo;throw up a matrix&amp;rdquo; and just run &lt;code&gt;mvn verify -P run-its&lt;/code&gt;. Sure, that is really the simplest.&lt;/p&gt;
&lt;p&gt;But what if, our matrix is big? Or what if we want to utilize one of the Maven basics, the Local repository?&lt;/p&gt;
&lt;p&gt;I wanted to mimic what I do locally: I usually build/install with &lt;strong&gt;latest stable Maven&lt;/strong&gt; (3.9.9 currently) and
&lt;strong&gt;latest LTS Java&lt;/strong&gt; (21.0.4 currently), and then perform a series of ITs/test/assessments, to ensure the thing
I build covers all combos of Maven/Java/whatever.&lt;/p&gt;</description></item><item><title>How to add new Maven lifecycle mapping</title><link>https://maveniverse.eu/blog/2024/09/07/how-to-add-new-maven-lifecycle-mapping/</link><pubDate>Sat, 07 Sep 2024 14:55:22 +0100</pubDate><guid>https://maveniverse.eu/blog/2024/09/07/how-to-add-new-maven-lifecycle-mapping/</guid><description>&lt;p&gt;Ever repeating question from plugin/extension developers is &amp;ldquo;how to add new packaging&amp;rdquo; (in a &amp;ldquo;modern way&amp;rdquo;).
For ages we did it by manually crafting &lt;code&gt;plexus.xml&lt;/code&gt; in the plugin or extension JAR, that was not only error-prone
but also tedious. But, indeed it had a great value as one could easily filter the XML (ie filtering plugin versions).
But, plexus XML is plexus XML&amp;hellip; yuck. So what now?&lt;/p&gt;
&lt;p&gt;Here is an example from Eclipse Tycho: The &lt;code&gt;tycho-maven-plugin&lt;/code&gt; originally defined this Plexus XML (and yes, it did
filter for versions as well):&lt;/p&gt;</description></item></channel></rss>