I created Jam because I wanted to write build scripts in the same languages (Java and Kotlin) I'm developing in, have the same IDE tooling, and be able to do anything that regular code can do without having to write custom plugins.
Jam makes use of: * Java and Kotlin support for runnable scripts. * 'default' methods introduced in Java 8 which allow dynamic proxies to perform deep interception of method calls. Jam uses this to memoize method call results and track dependencies on source files.
Jam is currently self-building and includes the library of build functions it uses to compile its own Java code, download Maven packages, run units tests etc. And because Jam scripts are just code, they can include any build logic and call any libraries you want.