# mustache.java **Repository Path**: mirrors_addons/mustache.java ## Basic Information - **Project Name**: mustache.java - **Description**: Implementation of mustache.js for Java - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-27 - **Last Updated**: 2025-08-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README Mustache.java [Build Status](https://github.com/spullara/mustache.java/actions/workflows/maven.yml) ============= **Mustache.java is not designed to allow untrusted parties to provide templates. It may be possible to lock it down to provide that safely, but by default it is UNSAFE. Use the SafeMustacheFactory and whitelist all templates and partials.** As of release 0.9.0 mustache.java is now Java 8 only. For Java 6/7 support use 0.8.x. There are no external dependencies and the compiler library is ~100k. **Mustache.java** is a derivative of [mustache.js](http://mustache.github.io/mustache.5.html). There is a Google Group for support and questions: Github CI: https://github.com/spullara/mustache.java/actions/workflows/maven.yml API documentation: http://spullara.github.io/mustache/apidocs/ Largest production deployment of Mustache.java: - Twitter (the web site, email, syndicated widgets, etc) Thanks to YourKit for many performance improvements: YourKit is kindly supporting the mustache.java open source project with its full-featured Java Profiler. YourKit, LLC is the creator of innovative and intelligent tools for profiling Java and .NET applications. Take a look at YourKit's leading software products: - [YourKit Java Profiler](http://www.yourkit.com/java/profiler/index.jsp) - [YourKit .NET Profiler](http://www.yourkit.com/.net/profiler/index.jsp) Request for contributions: - Real world benchmarks that matter - currently benchmarking based on Twitter templates - Documentation - Bug reports / fixes - API feedback - Optimizations Documentation: - [Javadocs](http://spullara.github.io/mustache/apidocs/) - [Mustache.js manual](http://mustache.github.io/mustache.5.html) - Passes all of the `mustache` [specification tests](https://github.com/mustache/spec) modulo whitespace differences - Biggest difference between mustache.js and mustache.java is optional concurrent evaluation - Data is provided by objects in an array of scopes and are accessed via non-private fields, methods or maps - Any `Iterable` can be used for list-like behaviors - Returning a `Callable` allows for concurrent evaluation if an `ExecutorService` is configured - Template inheritance is supported by this implementation, see (eg. `{{ com.github.spullara.mustache.java compiler 0.9.10 ``` Java 6/7: ```xml com.github.spullara.mustache.java compiler 0.8.18 ``` Example template file: {{#items}} Name: {{name}} Price: {{price}} {{#features}} Feature: {{description}} {{/features}} {{/items}} Might be powered by some backing code: ```java public class Context { List items() { return Arrays.asList( new Item("Item 1", "$19.99", Arrays.asList(new Feature("New!"), new Feature("Awesome!"))), new Item("Item 2", "$29.99", Arrays.asList(new Feature("Old."), new Feature("Ugly."))) ); } static class Item { Item(String name, String price, List features) { this.name = name; this.price = price; this.features = features; } String name, price; List features; } static class Feature { Feature(String description) { this.description = description; } String description; } } ``` And would result in: Name: Item 1 Price: $19.99 Feature: New! Feature: Awesome! Name: Item 2 Price: $29.99 Feature: Old. Feature: Ugly. Evaluation of the template proceeds serially. For instance, if you have blocking code within one of your callbacks, the system will pause while executing them: ```java static class Feature { Feature(String description) { this.description = description; } String description() throws InterruptedException { Thread.sleep(1000); return description; } } ``` If you change description to return a `Callable` instead it will automatically be executed in a separate thread if you have provided an `ExecutorService` when you created your `MustacheFactory`. ```java Callable description() throws InterruptedException { return new Callable() { @Override public String call() throws Exception { Thread.sleep(1000); return description; } }; } ``` This enables scheduled tasks, streaming behavior and asynchronous i/o. Check out the `example` module in order to see a complete end-to-end example: ```java package mustachejava; import com.github.mustachejava.DefaultMustacheFactory; import com.github.mustachejava.Mustache; import com.github.mustachejava.MustacheFactory; import java.io.IOException; import java.io.PrintWriter; import java.io.Writer; import java.util.Arrays; import java.util.List; public class Example { List items() { return Arrays.asList( new Item("Item 1", "$19.99", Arrays.asList(new Feature("New!"), new Feature("Awesome!"))), new Item("Item 2", "$29.99", Arrays.asList(new Feature("Old."), new Feature("Ugly."))) ); } static class Item { Item(String name, String price, List features) { this.name = name; this.price = price; this.features = features; } String name, price; List features; } static class Feature { Feature(String description) { this.description = description; } String description; } public static void main(String[] args) throws IOException { MustacheFactory mf = new DefaultMustacheFactory(); Mustache mustache = mf.compile("template.mustache"); mustache.execute(new PrintWriter(System.out), new Example()).flush(); } } ``` An alternative approach for providing variables would be to use a Map object, like: ```java public static void main(String[] args) throws IOException { HashMap scopes = new HashMap(); scopes.put("name", "Mustache"); scopes.put("feature", new Feature("Perfect!")); Writer writer = new OutputStreamWriter(System.out); MustacheFactory mf = new DefaultMustacheFactory(); Mustache mustache = mf.compile(new StringReader("{{name}}, {{feature.description}}!"), "example"); mustache.execute(writer, scopes); writer.flush(); } ``` ## License [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fspullara%2Fmustache.java.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fspullara%2Fmustache.java?ref=badge_large)