Backend Development 9 min read

Dynamic Loading of JAR Files in Spring Boot Applications

This article explains the concepts and step-by-step implementation of dynamically loading JAR packages in Spring Boot applications, covering built‑in classloader usage, creating JARs, and leveraging third‑party libraries to enhance flexibility and extensibility.

Code Ape Tech Column
Code Ape Tech Column
Code Ape Tech Column
Dynamic Loading of JAR Files in Spring Boot Applications

1. Introduction

In modern web applications, dynamic loading of components is a common technique for modularity and runtime extensibility. JAR files are the basic building blocks of Java applications, and loading them dynamically can improve system flexibility and scalability.

Spring Boot provides a convenient way to integrate dynamic JAR loading through its classloader and third‑party libraries. This article describes how to achieve dynamic JAR loading in a Spring Boot application.

2. Basic Concepts of Dynamic JAR Loading

2.1 What Is Dynamic JAR Loading?

Dynamic JAR loading refers to loading and unloading classes and resources from a JAR file at runtime, without restarting the application. This mechanism enhances flexibility and allows components to be added, updated, or removed on the fly.

2.2 Benefits of Dynamic JAR Loading

Improved system flexibility: Modules can be separated into distinct JARs, simplifying management and extension.

Hot‑plug capability: Components can be added, updated, or removed while the application is running.

Increased development efficiency: Developers can iterate and test new features without restarting the application.

3. Implementing Dynamic JAR Loading in Spring Boot

3.1 Using Spring Boot’s Classloader

Spring Boot provides the SpringBootClassLoader class, which extends URLClassLoader and supports dynamic JAR loading.

3.2 Creating a Dynamic JAR

Create a JAR that contains the required classes. Example command:

jar cfm example.jar com/example/demo/MainClass.class -C src/main/java .

The command produces example.jar containing a MainClass entry point.

3.3 Loading the JAR Dynamically

Use SpringBootClassLoader to load the JAR at runtime. Sample code:

import org.springframework.boot.loader.JarLauncher;
import org.springframework.boot.loader.Launcher;

public class DynamicLoading {
    public static void main(String[] args) throws Exception {
        Launcher launcher = new JarLauncher();
        launcher.launch(args, new String[]{"com.example.demo.MainClass"});
    }
}

This class creates a DynamicLoading entry point that uses JarLauncher to start the JAR and invoke MainClass .

4. Using Third‑Party Libraries for Dynamic JAR Loading

4.1 Adding Dependencies

Include a third‑party library such as osgi-resource-locator in pom.xml :

<dependencies>
    <!-- osgi-resource-locator dependency -->
    <dependency>
        <groupId>org.osgi</groupId>
        <artifactId>org.osgi.resource.locator</artifactId>
        <version>1.0.1</version>
    </dependency>
</dependencies>

4.2 Creating the JAR with OSGi Service File

Build a JAR that includes the file META-INF/services/org.osgi.resource.locator.ResourceLocator . The same jar cfm command can be used.

4.3 Loading the JAR via OSGi ResourceLocator

Implement the ResourceLocator interface to obtain JAR content and load classes:

import org.osgi.resource.locator.Resource;
import org.osgi.resource.locator.ResourceContent;
import org.osgi.resource.locator.ResourceException;
import org.osgi.resource.locator.ResourceLocator;

public class DynamicLoading {
    public static void main(String[] args) throws Exception {
        ResourceLocator resourceLocator = new ResourceLocator() {
            @Override
            public ResourceContent getResourceContent(Resource resource) throws ResourceException {
                // Implement logic to read JAR content, e.g., using Java NIO
                return new ResourceContent() {
                    @Override
                    public InputStream getInputStream() throws IOException {
                        return new FileInputStream("example.jar");
                    }
                    @Override
                    public String getURI() {
                        return "jar:file:/path/to/example.jar!/";
                    }
                };
            }
        };
            // Locate and load the JAR
            Resource resource = resourceLocator.locate("org.osgi.resource.locator", "()");
            if (resource != null) {
                Class
clazz = resource.loadClass("com.example.demo.MainClass");
                clazz.newInstance();
            }
    }
}

The above code creates a DynamicLoading class that implements a custom ResourceLocator to locate and load the JAR’s classes at runtime.

5. Conclusion

This article detailed how to implement dynamic JAR loading in Spring Boot, covering basic concepts, using Spring Boot’s built‑in classloader, creating JARs, and leveraging third‑party libraries such as OSGi Resource Locator. By following the examples, developers can enhance the flexibility and extensibility of their Spring Boot applications.

With these techniques, you should now be able to dynamically load JAR files to extend the functionality of your Spring Boot projects.

backendJavaSpring BootClassLoaderdynamic loadingJar
Code Ape Tech Column
Written by

Code Ape Tech Column

Former Ant Group P8 engineer, pure technologist, sharing full‑stack Java, job interview and career advice through a column. Site: java-family.cn

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.