A Java ClassLoader that loads classes from local directories, HTTP/HTTPS servers, Maven repositories, databases, object stores, and more. Supports caching, authentication, bytecode verification, configurable delegation, and lifecycle listeners.
Java 11+ | GPLv3 | Maven Central: org.flossware:classloader-java:2.0
<dependency>
<groupId>org.flossware</groupId>
<artifactId>classloader-java</artifactId>
<version>2.0</version>
</dependency>try (ApplicationClassLoaderloader = ApplicationClassLoader.builder()
.addLocalSource("/opt/app/classes")
.addRemoteSource("https://cdn.example.com/classes")
.addMavenCentral("com.google.guava:guava:32.1.0-jre")
.build()) {
Class<?> clazz = loader.loadClass("com.example.MyClass");
}| Source | Class | Use Case |
|---|---|---|
| Local filesystem | LocalClassSource | Load .class files from a directory |
| HTTP/HTTPS | RemoteClassSource | Download classes from a web server |
| Remote JAR | RemoteJarClassSource | Download and extract a JAR |
| Maven repository | MavenRepositoryClassSource | Load from Maven Central or private repos |
| Nexus repository | NexusClassSource | Load from Sonatype Nexus (RAW or Maven) |
| JDBC database | DatabaseClassSource | Load bytecode stored in a database table |
| REST API | RestApiClassSource | Load from a custom REST endpoint |
| MinIO / S3 | MinioClassSource | Load from S3-compatible object storage |
| HDFS | HdfsClassSource | Load from Hadoop Distributed File System |
| Custom protocol | CustomProtocolClassSource | Load via registered protocol handlers |
| Custom | Implement ClassSource | Any source you need |
These require the FlossWare extension libraries. Build with -Pflossware-extensions when these artifacts are in your local Maven repository.
| Source | Class | Dependency |
|---|---|---|
| Cloud storage | CloudStorageClassSource | org.flossware:cloudstorage-java |
| File transfer (SFTP/FTP) | FileTransferClassSource | org.flossware:filetransfer-java |
| Message queue | MessageClientClassSource | org.flossware:messaging-java |
| Container registry | ContainerClientClassSource | org.flossware:container-java |
| VCS (Git) | VcsClientClassSource | org.flossware:vcs-java |
ApplicationClassLoaderloader = ApplicationClassLoader.builder()
// Local
.addLocalSource("/path/to/classes")
// Remote with auth
.addRemoteSource("https://secure.example.com/classes",
AuthConfig.bearer("my-token"))
// Remote JAR
.addRemoteJar("https://cdn.example.com/lib-1.0.jar")
// Maven Central
.addMavenCentral("org.apache.commons:commons-lang3:3.12.0")
// Custom Maven repo
.addMavenRepository("https://nexus.example.com/repository/releases/",
"com.internal:my-lib:2.0")
// Nexus RAW
.addNexusRawSource("https://nexus.example.com", "my-repo",
AuthConfig.basic("user", "pass"))
// Database
.addDatabaseSource(dataSource, "class_files", "class_name", "bytecode")
// Any ClassSource implementation
.addClassSource(myCustomSource)
.build();MinioClassSourcesource = MinioClassSource.builder()
.endpoint("minio.example.com")
.accessKey("minioadmin")
.secretKey("minioadmin")
.bucket("classes")
.prefix("production/v2")
.build();Works with any S3-compatible service (AWS S3, Backblaze B2, Cloudflare R2, DigitalOcean Spaces).
Controls whether the parent ClassLoader or custom sources are checked first.
// Standard Java behavior (default)builder.parentFirst()
// Check custom sources first (for class isolation / overriding)builder.parentLast()
// Per-class controlbuilder.customDelegation(className ->
className.startsWith("com.example.shared."))parentLast() always delegates java.*, javax.*, sun.*, and jdk.* to the parent.
Caching is enabled by default (in-memory). Use FileSystemCache for persistence across JVM restarts:
builder.cache(newFileSystemCache(Paths.get("/tmp/class-cache")))Disable caching:
builder.useCache(false)Validate loaded classes against known checksums:
Map<String, String> checksums = Map.of(
"com.example.MyClass", "sha256:abc123..."
);
builder.bytecodeVerifier(newChecksumValidator(checksums))Monitor class loading events:
builder.addLoggingListener(true) // Log load, cache, resource events
.trackResources() // Track loaded classes and bytes// Custom listenerbuilder.addListener(newClassLoaderLifecycleListener() {
@OverridepublicvoidonClassLoaded(ClassLoadEventevent) { /* ... */ }
})AuthConfig.none() // No authAuthConfig.basic("username", "password") // HTTP BasicAuthConfig.bearer("token") // Bearer tokenApplicationClassLoader is thread-safe. It uses a ReentrantReadWriteLock (fair) to protect findClass() and findResource(), and prevents class loading after close().
Generate Javadoc:
mvn javadoc:javadocOutput: target/site/apidocs/index.html
mvn clean installOptional FlossWare extensions (cloud storage, file transfer, messaging, container, VCS):
mvn clean install -Pflossware-extensions