Search

Dark theme | Light theme

January 19, 2016

Ratpacked: Different Base Directory With Marker File

To set the base directory for serving static files in a Ratpack application we can use the baseDir method of the ServerConfigBuilder class. We must provide a Path or File to this method. If we want to serve files from the class path, for example a JAR file or directory, we can use the find method of the class BaseDir. The find method will search the class path for a marker file with the name .ratpack. If the file is found then the directory or JAR file it is found in is used as the root of the file system. Normally the root of the class path is searched, but we can change the search path with an argument for the find method.

In the following sample Ratpack application we use the value web-resources/.ratpack.base.dir for the BaseDir.find method. So in our class path we must have a web-resources directory with the file .ratpack.base.dir that will serve as the root file system for serving static files.

// File: src/main/java/com/mrhaki/ratpack/Application.java
package com.mrhaki.ratpack;

import com.google.common.collect.ImmutableMap;
import ratpack.groovy.Groovy;
import ratpack.groovy.template.MarkupTemplateModule;
import ratpack.guice.Guice;
import ratpack.server.BaseDir;
import ratpack.server.RatpackServer;

public class Application {

    public static void main(String[] args) throws Exception {
        RatpackServer.start(server ->
            server
                .serverConfig(builder ->
                    builder.baseDir(
                        // Instruct Ratpack to search
                        // class path for file
                        // .ratpack.base.dir in the 
                        // directory web-resources.
                        BaseDir.find("web-resources/.ratpack.base.dir"))
                )
                    
                .registry(Guice.registry(bindings -> 
                    bindings.module(MarkupTemplateModule.class))
                )
                    
                .handlers(chain ->
                    chain
                        .get(context -> 
                            context.render(
                                Groovy.groovyMarkupTemplate(
                                    ImmutableMap.of("title", "My Ratpack App"),
                                    "index.gtpl"))
                        )
                        .files(files ->
                            // The public director is resolved from
                            // the base directory web-resources.    
                            files.dir("public")
                        )
                )
        );    
    }
 
}

Of course we use Gradle as build system. The Ratpack Gradle plugin automatically adds the directory src/ratpack to the main source set as a resources directory. Files in this directory will automatically be added to the class path. So for our example application we create the directory src/ratpack/web-resources and create an empty file .ratpack.base.dir in this directory. Any files and directory we now add to this directory will be accessible from the Ratpack application. Suppose we have the following contents:

$ tree -a src/ratpack
src/ratpack
└── web-resources
    ├── .ratpack.base.dir
    ├── public
    │   ├── images
    │   │   └── favicon.ico
    │   ├── lib
    │   ├── scripts
    │   └── styles
    └── templates
        └── index.gtpl

7 directories, 3 files

Written with Ratpack 1.1.1.