Integration von JBake in Maven – Statische Websites

JBake ist ein „Java-basierter, open source Generator für statische Seiten“ (http://jbake.org/, auf github https://github.com/jbake-org/jbake). Bestens geeignet, um statische HTML-Seiten zu erstellen. Das langsame Laden von dynamischen Inhalten entfällt. Ebenso Probleme, die bei der Indexierung und Suchmaschinenoptimierung/SEO auftreten können, wenn die Seite erst beim Laden per JavaScript zusammengesetzt wird. Gleichzeitig bieten verschiedene Template Engines, wie bspw. FreeMarker (http://freemarker.org/) den Vorteil der Modularisierung. Menü und Footer müssen nur einmalig definiert werden und können durch verschiedene Vorlagen automatisch eingefügt werden.

Für unsere Micro-Site mit ca. 15 Unterseiten mit vielen wiederkehrenden Elementen bietet sich JBake hervorragend an. Wir haben JBake in Maven integriert und damit einen komfortablen Release-Prozess erstellt. Dafür haben wir das Plug-in jbake-maven-plugin verwendet (https://github.com/ingenieux/jbake-maven-plugin). Dieses Beispielprojekt auf github zeigt die grundlegende Integration: https://github.com/ingenieux/jbake-sample.

Dabei sind einige Dinge zu beachten, damit alles reibungslos läuft. Für unsere Seite haben wir Maven-3.0.5 und JDK-1.7.0-71 und jbake-maven-plugin-0.0.3 verwendet, nachdem einige Versionskonflikte aufgetreten waren (Neuere Versionen von jbake-maven-plugin benötigen Maven-3.1.1).

Hier ist die Plug-in-Konfiguration der pom.xml.

<plugin>
    <groupId>br.com.ingenieux</groupId>
    <artifactId>jbake-maven-plugin</artifactId>
    <version>0.0.3</version>
    <executions>
        <execution>
            <id>default-generate</id>
            <phase>generate-resources</phase>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <inputDirectory>${project.basedir}/src/main/resources</inputDirectory>
        <outputDirectory>${project.build.directory}/classes</outputDirectory>
    </configuration>
    <dependencies>
        <!-- for freemarker templates (.ftl) -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.20</version>
        </dependency>
    </dependencies>
</plugin>

Im Detail:

Die Dependencies müssen die verwendete Template Engine enthalten, in diesem Fall FreeMarker.

<dependencies>
    <!-- for freemarker templates (.ftl) -->
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.20</version>
    </dependency>
</dependencies>

Besonders wichtig ist die Konfiguration der Directories. Per Default verwendet das jbake-maven-plugin den Pfad src/main/jbake. Das verträgt sich nicht mit dem Standard-Pfad src/main/resources, der von vielen andere Plug-ins verwendet wird. Außerdem soll alles, was gebacken wurde im /classes Verzeichnis landen.

<configuration>
    <inputDirectory>${project.basedir}/src/main/resources</inputDirectory>
    <outputDirectory>${project.build.directory}/classes</outputDirectory>
</configuration>

Beim Packen können dann alle nicht mehr benötigten Dateien ignoriert werden. Dazu haben wir einfach beim jar-Plug-in (oder zip, je nachdem, was verwendet wird) die Quelldateien in /assets, /content und /templates auf exclude gesetzt (die .less Dateien stammen von der LESS-Integration und nicht von JBake. Die template-draft.html ist eine interne Vorlage, die nicht auf dem Server landen soll).

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <excludes>
            <exclude>**/less</exclude>
            <exclude>**/*.less</exclude>
            <exclude>**/assets</exclude>
            <exclude>**/assets/**</exclude>
            <exclude>**/content</exclude>
            <exclude>**/content/**</exclude>
            <exclude>**/templates</exclude>
            <exclude>**/templates/**</exclude>
            <exclude>**/template-draft.html</exclude>
        </excludes>
    </configuration>
</plugin>

Das war es dann auch schon. Mit einem mvn clean install werden dann automatisch die Inhalte zusammengebacken und das Ergebnis ist eine statische Seite.

Happy Baking!