Ethan's Personal Website
Java Build Systems

Java build systems suck.

Java isn't known for being a language without boilerplate. It doesn't try to be Python. But build systems are way too complex, way too verbose, even by Java standards.

To illustrate my point, let's take the pom.xml from Maven's quickstart tutorial.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>Maven Quick Start Archetype</name>
  <url>http://maven.apache.org</url>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.8.2</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

To Maven people, all of that will make perfect sense. We need to do the standard XML stuff of declaring our schema, which requires a reference to a URL. Then, we need to declare our group ID, version, and packaging method. We then declare our name, and URL. Finally, we declare our dependencies, for which we need to specify the group ID, artifact ID, version, and scope.

But all I wanted was to say declare a project, called "My App", that depends on JUnit and is packaged into a jar.

We can do better

Let's look at Rust's build system, Cargo. Let's say we want to depend on the Iron HTTP framework, and our project is called "quickstart". Here's our build system configuration file (called by Rust people your Cargo.toml)

[package]
name = "quickstart"
version = "0.1.0"

[dependencies.iron]
version = "\*"

That's so much simpler. And Cargo does basically the same thing as Maven, except for Rust as opposed to Java.

My proposal

Essentially, I want a build system that's as clean as Cargo. I don't care about being able to emulate the kitchen sink; I just want to have simple dependency management. And that's what Cargo provides. I would propose exactly what Cargo does, except for Java, instead of Rust. Come on, Java community; we can do this. It's not that hard.