krizaka-build
Build, BOM & test kit
The parent POM, the BOM and the governance tests behind every com.krizaka artifact.
The problem it removes
Parent POMs drift — and a Spring BOM silently overrides the Boot version you chose.
Every multi-repository Java organisation ends up with parent POMs that drift: a module on another Java, unpinned plugins, a POM that Maven Central rejects for a missing licence block. And a BOM that imports Spring's silently overrides the Spring Boot version you chose.
- Conventions in a wiki: true on the day they are written.
- One Testcontainers setup per repository, each starting its own database per test class.
- A minor release that breaks binary compatibility, discovered by the people who upgraded.
What it does
krizaka-parent: Java 21, pinned plugins, Central metadata, a signed release in one command.krizaka-bom: the compatible set of everycom.krizakaartifact, and nothing else.krizaka-test-support: architecture rules, real PostgreSQL + RabbitMQ, event contract tests.
krizaka-parent (Central metadata, Java 21, formatting checked, unit and integration tests, coverage, a signed release in one command), krizaka-bom (the compatible set of every com.krizaka artifact) and krizaka-test-support (architecture rules, one PostgreSQL + RabbitMQ per test run, event contract tests).
A rule that judges nothing passes nothing. Every rule of the test kit fails on an empty population — a typo in a package name cannot turn a check into a green tick.
Decisions and trade-offs
We chose
A BOM that carries only com.krizaka artifacts; the parent has no
dependencyManagementof its own.We refused
Importing
spring-boot-dependenciesin our BOM.Because
Importing
krizaka-bommust never pin a version you chose. Your Spring Boot BOM stays yours; ours sits beside it.What it costs you
You import Spring Boot's BOM (or parent) yourself.
We chose
Architecture rules as tests (
CodeRules,SourceRules,ConfigBindingRules: layering, constructor injection, private state, no Environment injection…).We refused
A review checklist.
Because
A rule that runs on every build is the only kind still true six months later.
What it costs you
Rules are opinionated: take the ones that fit, call them from your own test.
We chose
japicmp in the release profile: a binary break in a minor fails the release; publication on Central confirmed by hand.
We refused
SemVer by good intentions, and automatic publication.
Because
A release on Central can never be deleted: a break shipped is a break forever.
What it costs you
A deliberate break is declared in the repository for that release.
In code
// krizaka-test-support: the producer proves its event matches the JSON Schema its -api publishes
// (events/evt.notification.requested.v1.json, draft 2020-12). A consumer checks its own copy
// against the same file with assertReadable — no shared DTO jar between services.
class NotificationRequestContractTest extends EventContractTest {
@Test
void anEmailRequestConforms() {
assertConforms(NotificationRouting.NOTIFICATION_REQUESTED, 1,
new NotificationRequest(Channel.EMAIL, "ada@example.com", "welcome", "fr-FR",
Map.of("name", "Ada")));
}
}Don't use it when
- You do not publish to Maven Central and don't want our conventions (google-java-format, Java 21) on your build: import the BOM, skip the parent.
- You are on Java 17 or earlier.
Where it stands
0.2.0 on Maven Central: krizaka-parent, krizaka-bom, krizaka-test-support (with EventContractTest).
Published
com.krizaka:krizaka-bom · krizaka-parent 0.2.0 · Maven Centralcom.krizaka:krizaka-test-support 0.2.0 · Maven CentralIn progress
- BOM 0.2.0 names users, notifications and billing at a 0.2.0 that is not published yet. Decided: a BOM release resolves every artifact it manages before it is signed; BOM 0.3.0 waits for the three.krizaka-build#11
Adopt it
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.krizaka</groupId>
<artifactId>krizaka-bom</artifactId>
<version>0.2.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>com.krizaka</groupId>
<artifactId>krizaka-test-support</artifactId>
<scope>test</scope>
</dependency>Tell us where it hurts.
A block is right when it survives your code base, not ours. Ask in the block's thread, propose a change as an idea, or report a bug on its repository — every decision on this page is open to a better argument.
The other blocks
- Platform kitAn event published after the commit is lost on the next crash.
- UsersSign-up looks like a weekend. Reset tokens, OAuth and JWTs make it a quarter.
- NotificationsAn e-mail sent inside a transaction that rolls back can't be unsent.
- Billing & creditsDebit after and the work ran on credit nobody had. Debit before and failures get billed.
- Krizaka UIThree products, three token vocabularies, 1,153
light:overrides in one app.