First I want to share a bit of context for this blog post. This is essentially my pure thoughts, unedited and as they come. This helps me to have a clear mind. So I advise not reading this blog post unless you understand that it is not intended for a public audience in general, and is more tuned for cleaning my own head about a few things. In the future, a revised version of this might be suitable for the public but maybe not now.
Secondly, I hate ‘build tools’.
I hate maven.
Maven is really awesome. I need just two things, a
src folder and a
pom.xml and I am done. That is really neat. Maven really is ubiquitous. It is industry standard. I really love what maven does for me. I even have a — proud maven user batch on Twitter.
What I really hate:
- It (Maven) is slow — it is really slow. It is irritating. I have a super-charged gaming laptop with heavy RAM and CPU. I don’t care. I want things to be snappy really snappy. Maven you are torture.
- Then I thought of moving to Scala. I just love Scala. The way people think in scala. I am happy. I tried Mill, a custom build tool by Li Haoyi. I hate it. It downloads so much. It is slow to start. Man, what is the point! Seriously. I had hopes of replacing maven with Mill. Forget it. I need JavaFX to work. I need Quarkus to work. I need JSweet to work. All of these work, and will work flawlessly with Maven. BTW, I forgot to mention, I want GraalVM native builds to work. I am not leaving maven, sorry, whatever build tool you guys make should be backward compatible with maven, and probably even generate POM files. Otherwise, nobody has the time to support it. People are sufficiently selfish. I think making Netbeans or Intellij is easier than creating a replacement for Maven. We might send people and robots to distant planets, but we are still stuck with the need for better build tools. Let it be known.
- Release to maven central — I really really really hate you the most. You are a mess. Really. If you were incarnated as a person, you would die alone in misery. Nobody will even come to cremate you when you die. Why do I need to write so much for a simple thing like a release to maven central? It is great that Javadocs and source packaging are compulsory to release to maven, but it just adds so much to the build cycle. The pom becomes so complex. Especially given the fact I like to have small, really small projects, sometimes to the extreme of one class, one function in just one project. Although theoretically possible, it is practically impossible. Why should I have to write big multi-utility classes just to do simple things like getting the extension of a file from a Path object? I am not interested in importing Apache commons-io for this one simple need, and I don’t think I want to write the same code several times. What about maven Profiles? Nice, I never tried, I understand how it would help. But the POM just become more complex.
I even thought I would write a tool that generates POM. Probably inspired by Mill and it would be pure Java (earlier thought Scala, but the build time is painful). It would be a Java DSL which would look like some kind of pseudo XML.
I am thinking of the following
- Have a pom.java file alongside pom.xml
- Execute the builds using JBang and this pom.java file.
- There will be a simple, default pom.xml during peace times, again — autogenerated as an innocent fallback.
- Because the entire thing will work as an XML DSL it doesn’t matter what wizardry evolves in the maven world. We will somehow just generate the POM files somehow and let maven do the rest of the magic.
- I am even thinking, maybe have a virtual filesystem emulation OR a symlinked folder, where the custom generated POM just appears, the build happens, and after all this, the entire thing is cleaned up and destroyed. Or cached — whatever makes sense.
This sounds like a Utopia.
For this precise reason I know I might never actually do it.
Until then what is reasonable? To continue the status quo. That might be less painful than building all these tools. Who has the time for all this really?
I wonder if something intermediate would be possible?
Any thoughts, anybody? Please share below.
Thanks for reading.
( this is draft one — dated 2 May 2021)
(Apologies to all build tools and their developers I have ignored in this rant. You guys are awesome. This rant is an essential catharsis process. )