A flexible Java ClassLoader that can load classes from both local and remote locations (HTTP/HTTPS/FTP/FTPS) with built-in caching support and authentication.
- Local Class Loading: Load classes from local file system directories
- Remote Class Loading: Load classes from HTTP/HTTPS URLs
- FTP/FTPS Support: Load classes from FTP and FTPS servers
- Nexus Repository Support: Load classes from Sonatype Nexus repositories (both raw and Maven repositories)
- Maven Artifact Resolution: Automatically extract classes from Maven JARs hosted in Nexus
- Caching: Optional file-system based caching to avoid repeated downloads
- Authentication: Support for HTTP Basic and Bearer token authentication
- Builder Pattern: Fluent API for easy configuration
- Extensible: Add custom class sources by implementing the
ClassSourceinterface
- Java 11 or higher
- Maven 3.6 or higher (for building)
<dependency>
<groupId>org.flossware</groupId>
<artifactId>jclassloader</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>git clone https://github.com/FlossWare/jclassloader.git
cd jclassloader
mvn clean installimport org.flossware.jclassloader.JClassLoader;
JClassLoader loader = JClassLoader.builder()
.addLocalSource("/path/to/classes")
.useCache(false)
.build();
Class<?> myClass = loader.loadClass("com.example.MyClass");
Object instance = myClass.getDeclaredConstructor().newInstance();JClassLoader loader = JClassLoader.builder()
.addRemoteSource("https://example.com/classes/")
.build();
Class<?> myClass = loader.loadClass("com.example.MyClass");import org.flossware.jclassloader.AuthConfig;
// Basic Authentication
AuthConfig basicAuth = AuthConfig.basic("username", "password");
JClassLoader loader = JClassLoader.builder()
.addRemoteSource("https://secure.example.com/classes/", basicAuth)
.build();
// Bearer Token Authentication
AuthConfig bearerAuth = AuthConfig.bearer("your-token-here");
JClassLoader loader2 = JClassLoader.builder()
.addRemoteSource("https://api.example.com/classes/", bearerAuth)
.build();// Anonymous FTP
JClassLoader ftpLoader = JClassLoader.builder()
.addClassSource(new FtpClassSource("ftp://ftp.example.com/classes/"))
.build();
// Authenticated FTP
JClassLoader ftpAuthLoader = JClassLoader.builder()
.addClassSource(new FtpClassSource("ftp://ftp.example.com/classes/", "username", "password"))
.build();
// FTPS (FTP over SSL/TLS)
JClassLoader ftpsLoader = JClassLoader.builder()
.addClassSource(new FtpClassSource("ftps://secure-ftp.example.com/classes/", "username", "password"))
.build();import org.flossware.jclassloader.AuthConfig;
// Public Nexus raw repository
JClassLoader loader = JClassLoader.builder()
.addNexusRawSource("https://nexus.example.com", "raw-classes")
.build();
// Authenticated Nexus raw repository
AuthConfig auth = AuthConfig.basic("username", "password");
JClassLoader authLoader = JClassLoader.builder()
.addNexusRawSource("https://nexus.example.com", "private-raw", auth)
.build();Load classes from JAR files stored as Maven artifacts:
import org.flossware.jclassloader.MavenNexusClassSource;
import org.flossware.jclassloader.MavenArtifact;
// Create a Maven Nexus source with specific artifacts
MavenNexusClassSource nexusSource = MavenNexusClassSource.builder()
.nexusUrl("https://nexus.example.com")
.repository("maven-releases")
.addArtifact("org.apache.commons:commons-lang3:3.12.0")
.addArtifact("com.google.guava:guava:32.1.0-jre")
.build();
JClassLoader loader = JClassLoader.builder()
.addNexusMavenSource(nexusSource)
.build();
// Load a class from one of the configured artifacts
Class<?> stringUtils = loader.loadClass("org.apache.commons.lang3.StringUtils");// Using Basic Authentication
AuthConfig basicAuth = AuthConfig.basic("nexus-user", "nexus-password");
MavenNexusClassSource nexusSource = MavenNexusClassSource.builder()
.nexusUrl("https://private-nexus.example.com")
.repository("private-releases")
.addArtifact("com.company:internal-lib:1.0.0")
.auth(basicAuth)
.build();
// Using Bearer Token (for Nexus 3 with token authentication)
AuthConfig tokenAuth = AuthConfig.bearer("NexusToken12345");
MavenNexusClassSource tokenSource = MavenNexusClassSource.builder()
.nexusUrl("https://nexus.example.com")
.repository("releases")
.addArtifact("com.company:api-client:2.0.0")
.auth(tokenAuth)
.build();import org.flossware.jclassloader.MavenArtifact;
// Parse Maven coordinates
MavenArtifact artifact = MavenArtifact.parse("org.example:my-lib:1.0.0");
System.out.println(artifact.getGroupId()); // org.example
System.out.println(artifact.getArtifactId()); // my-lib
System.out.println(artifact.getVersion()); // 1.0.0
// With classifier and packaging
MavenArtifact sources = MavenArtifact.parse("org.example:my-lib:1.0.0:sources:jar");
// Convert to repository path
String path = artifact.toPath(); // org/example/my-lib/1.0.0/my-lib-1.0.0.jarimport org.flossware.jclassloader.cache.FileSystemCache;
FileSystemCache cache = new FileSystemCache("/tmp/jclassloader-cache");
JClassLoader loader = JClassLoader.builder()
.addRemoteSource("https://example.com/classes/")
.cache(cache)
.useCache(true)
.build();
// First load: downloads from remote and caches
Class<?> myClass = loader.loadClass("com.example.MyClass");
// Subsequent loads: uses cached version
Class<?> myCachedClass = loader.loadClass("com.example.MyClass");Classes are searched in the order sources are added:
JClassLoader loader = JClassLoader.builder()
.addLocalSource("/opt/app/classes") // Searched first
.addRemoteSource("https://cdn.example.com/") // Searched second
.addClassSource(new FtpClassSource("ftp://backup.example.com/classes/")) // Searched third
.cache(new FileSystemCache("/tmp/cache"))
.build();ClassLoader parentLoader = Thread.currentThread().getContextClassLoader();
JClassLoader loader = JClassLoader.builder()
.parent(parentLoader)
.addLocalSource("/path/to/classes")
.build();JClassLoader: Main classloader implementation extendingjava.lang.ClassLoaderClassSource: Interface for class loading sourcesLocalClassSource: Loads classes from local file systemRemoteClassSource: Loads classes from HTTP/HTTPS URLsFtpClassSource: Loads classes from FTP/FTPS serversNexusClassSource: Loads classes from Nexus raw or Maven repositoriesMavenNexusClassSource: Specialized source for loading classes from Maven artifacts in NexusMavenArtifact: Represents Maven coordinates and handles path resolutionClassCache: Interface for caching implementationsFileSystemCache: File-based cache implementationAuthConfig: Configuration for authentication
- When
loadClass()is called, JClassLoader first delegates to its parent classloader - If the parent can't find the class, it checks the cache (if enabled)
- If not in cache, it iterates through configured class sources in order
- The first source that can load the class provides the bytecode
- The class is defined and optionally cached for future use
Important: Loading classes from remote sources can be a security risk. Only load classes from trusted sources.
- Always use HTTPS instead of HTTP when possible
- Validate the source of remote classes
- Consider implementing checksum verification
- Use authentication for protected resources
- Be aware that cached classes persist between runs
Run the test suite:
mvn testContributions are welcome! Please feel free to submit a Pull Request.
[Add your license here]
- Scot P. Floess
- JAR file support for remote sources
- Class signature verification
- Checksum validation
- More cache implementations (in-memory, Redis, etc.)
- Performance metrics and monitoring
- Class version conflict detection