# A JBake project template

## About JBake

JBake is a static site generator, it's inspired from jekyll and written
in java.  The basic idea is to have templates for the structure of the
page, and the body generated from asciidoc content.

## Pre requisites

- Maven
- JDK11+

Deploying to Github will require password less authentication.

This is done by exporting your SSH public key into your Github account.

## Build the site locally

The site is generated under target/staging.

Open file:///PATH_TO_PROJECT_DIR/target/staging in a browser to view the site.

```
mvn generate-resources
```

Or you can invoke the JBake plugin directly.

```
mvn jbake:build
```

### Rebuild the site on changes

```
mvn jbake:watch
```

If you keep this command running, changes to the sources will be
detected and the site will be rendered incrementally.

This is convenient when writing content.

### Serve the site locally

```
mvn jbake:serve
```

If a webserver is required (e.g. absolute path are used), this command
will start a webserver (jetty) at http://localhost:8820.  It will also
watch for changes and rebuild incrementally.

## Deploy the site to Github Pages

```
mvn deploy
```

## Produce a zip file for download

To produce a zip file containing the generated html files, use:

```
mvn package
```

When making a release on GitHub, this zip file should be added to the release.

## Links

- [JBake maven plugin documentation](https://github.com/Blazebit/jbake-maven-plugin)
- [JBake documentation](http://jbake.org/docs/2.5.1)
- [Freemarker documentation](http://freemarker.org/docs)
- [AsciiDoc User Guide](http://asciidoc.org/userguide.html)
- [Asciidoctor quick reference](http://asciidoctor.org/docs/asciidoc-syntax-quick-reference)
