Tools for generating executable JAR/WAR files with embedded containers for Spring Boot applications
npx @tessl/cli install tessl/maven-org-springframework-boot--spring-boot-loader-tools@3.5.0A comprehensive Java library that provides essential tools and utilities for packaging Spring Boot applications into executable JAR and WAR files. The library includes classes for JAR writing, entry management, layout configuration, library handling, and loader implementation that enable the creation of self-contained, executable archives with embedded containers.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-loader-tools</artifactId>
<version>3.5.3</version>
</dependency>Gradle:
implementation 'org.springframework.boot:spring-boot-loader-tools:3.5.3'import org.springframework.boot.loader.tools.Repackager;
import org.springframework.boot.loader.tools.Libraries;
import org.springframework.boot.loader.tools.Library;
import org.springframework.boot.loader.tools.LibraryScope;For specific functionality:
import org.springframework.boot.loader.tools.MainClassFinder;
import org.springframework.boot.loader.tools.Layout;
import org.springframework.boot.loader.tools.Layouts;
import org.springframework.boot.loader.tools.JarWriter;
import org.springframework.boot.loader.tools.ImagePackager;
import org.springframework.boot.loader.tools.BuildPropertiesWriter;
import java.nio.file.attribute.FileTime;
import java.time.Instant;import org.springframework.boot.loader.tools.Repackager;
import org.springframework.boot.loader.tools.Libraries;
import org.springframework.boot.loader.tools.Library;
import org.springframework.boot.loader.tools.LibraryScope;
import java.io.File;
import java.io.IOException;
// Basic repackaging of a JAR file
File sourceJar = new File("myapp.jar");
Repackager repackager = new Repackager(sourceJar);
// Define libraries to include
Libraries libraries = new Libraries() {
@Override
public void doWithLibraries(LibraryCallback callback) throws IOException {
// Add runtime dependencies
callback.library(new Library(new File("lib/spring-core.jar"), LibraryScope.COMPILE));
callback.library(new Library(new File("lib/logback-classic.jar"), LibraryScope.RUNTIME));
}
};
// Repackage into executable JAR
repackager.repackage(libraries);The Spring Boot Loader Tools library is built around several key architectural components:
This design supports Spring Boot's "fat JAR" packaging model, allowing applications to run with java -jar while maintaining all necessary dependencies and configuration within a single executable file.
Core functionality for transforming regular JAR/WAR files into executable Spring Boot archives. Handles main class detection, library inclusion, manifest generation, and loader class integration.
public class Repackager {
public Repackager(File source);
public void repackage(Libraries libraries) throws IOException;
public void repackage(File destination, Libraries libraries) throws IOException;
public void repackage(File destination, Libraries libraries, LaunchScript launchScript) throws IOException;
public void repackage(File destination, Libraries libraries, LaunchScript launchScript, FileTime lastModifiedTime) throws IOException;
public void setBackupSource(boolean backupSource);
}Automatic discovery of classes with public static main methods using breadth-first search. Supports both directory and JAR file analysis with annotation-based filtering.
public abstract class MainClassFinder {
public static String findMainClass(File rootDirectory) throws IOException;
public static String findSingleMainClass(File rootDirectory) throws IOException;
public static String findSingleMainClass(File rootDirectory, String annotationName) throws IOException;
public static String findMainClass(JarFile jarFile, String classesLocation) throws IOException;
public static String findSingleMainClass(JarFile jarFile, String classesLocation) throws IOException;
public static String findSingleMainClass(JarFile jarFile, String classesLocation, String annotationName) throws IOException;
}Strategy-based system for determining how classes and libraries are organized within different archive types. Supports JAR, WAR, and expanded directory layouts with customization options.
public interface Layout {
String getLauncherClassName();
String getLibraryLocation(String libraryName, LibraryScope scope);
String getClassesLocation();
boolean isExecutable();
}
public final class Layouts {
public static Layout forFile(File file);
public static class Jar implements RepackagingLayout { }
public static class War implements Layout { }
}Comprehensive system for handling dependency libraries including scope classification, coordinate tracking, and inclusion/exclusion logic. Integrates with build tools and dependency resolution.
public class Library {
public Library(File file, LibraryScope scope);
public String getName();
public LibraryScope getScope();
public LibraryCoordinates getCoordinates();
}
public interface Libraries {
void doWithLibraries(LibraryCallback callback) throws IOException;
}Low-level utilities for writing JAR files with proper directory structure, duplicate handling, manifest generation, and nested library support.
public class JarWriter implements AutoCloseable {
public JarWriter(File file) throws FileNotFoundException, IOException;
public JarWriter(File file, LaunchScript launchScript) throws FileNotFoundException, IOException;
public JarWriter(File file, LaunchScript launchScript, FileTime lastModifiedTime) throws FileNotFoundException, IOException;
public void close() throws IOException;
}
public abstract class AbstractJarWriter implements LoaderClassesWriter {
public void writeManifest(Manifest manifest) throws IOException;
public void writeEntry(String entryName, InputStream inputStream) throws IOException;
public void writeNestedLibrary(String location, Library library) throws IOException;
}Advanced layering system for optimizing Docker image builds by strategically separating application code, dependencies, and Spring Boot loader components into distinct layers.
public class Layer {
public Layer(String name);
}
public interface Layers extends Iterable<Layer> {
Layer getLayer(String applicationResource);
Layer getLayer(Library library);
}
public abstract class StandardLayers implements Layers {
public static final Layer DEPENDENCIES;
public static final Layer SPRING_BOOT_LOADER;
public static final Layer SNAPSHOT_DEPENDENCIES;
public static final Layer APPLICATION;
}Tools for creating launch scripts that make JAR files directly executable on Unix-like systems, supporting customizable script templates and property substitution.
public interface LaunchScript {
byte[] toByteArray();
}
public class DefaultLaunchScript implements LaunchScript {
public DefaultLaunchScript(File file, Map<?, ?> properties) throws IOException;
}Utilities for integrating with build tools and generating build metadata for Spring Boot Actuator endpoints, including project details and build information.
public final class BuildPropertiesWriter {
public BuildPropertiesWriter(File outputFile);
public void writeBuildProperties(ProjectDetails projectDetails) throws IOException;
public static final class ProjectDetails {
public ProjectDetails(String group, String artifact, String version, String name, Instant time, Map<String, String> additionalProperties);
public String getGroup();
public String getArtifact();
public String getName();
public String getVersion();
public Instant getTime();
public Map<String, String> getAdditionalProperties();
}
public static class NullAdditionalPropertyValueException extends IllegalArgumentException {
public NullAdditionalPropertyValueException(String name);
}
}Specialized packager for exporting fully packaged archives to OCI (Open Container Initiative) images. Designed for Docker integration and container deployment workflows.
public class ImagePackager extends Packager {
public ImagePackager(File source, File backupFile);
public void packageImage(Libraries libraries, BiConsumer<ZipEntry, EntryWriter> exporter) throws IOException;
}public interface LibraryScope {
LibraryScope COMPILE = /* ... */;
LibraryScope RUNTIME = /* ... */;
LibraryScope PROVIDED = /* ... */;
LibraryScope CUSTOM = /* ... */;
}
public interface LibraryCoordinates {
String getGroupId();
String getArtifactId();
String getVersion();
static LibraryCoordinates of(String groupId, String artifactId, String version);
}
public interface LibraryCallback {
void library(Library library) throws IOException;
}
public enum LoaderImplementation {
DEFAULT, CLASSIC;
String getJarResourceName();
}
public interface EntryWriter {
void write(OutputStream outputStream) throws IOException;
default int size() { return -1; }
}