Krizaka
All building blocks

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 every com.krizaka artifact, 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.

The duck's rule

Decisions and trade-offs

  1. We chose

    A BOM that carries only com.krizaka artifacts; the parent has no dependencyManagement of its own.

    We refused

    Importing spring-boot-dependencies in our BOM.

    Because

    Importing krizaka-bom must 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.

  2. 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.

  3. 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

javaNotificationRequestContractTest.java
// 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

In 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

xmlpom.xml
<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