1- # JClassLoader
1+ # ApplicationClassLoader
22
33A flexible Java ClassLoader that can load classes from 34+ transport protocols with built-in caching support and authentication.
44
@@ -59,9 +59,9 @@ mvn clean install
5959### Basic Local Class Loading
6060
6161``` java
62- import org.flossware.classloader-java.JClassLoader ;
62+ import org.flossware.classloader-java.ApplicationClassLoader ;
6363
64- JClassLoader loader = JClassLoader . builder()
64+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
6565 .addLocalSource(" /path/to/classes" )
6666 .useCache(false )
6767 .build();
@@ -73,7 +73,7 @@ Object instance = myClass.getDeclaredConstructor().newInstance();
7373### Remote Class Loading (HTTP/HTTPS)
7474
7575``` java
76- JClassLoader loader = JClassLoader . builder()
76+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
7777 .addRemoteSource(" https://example.com/classes/" )
7878 .build();
7979
@@ -87,13 +87,13 @@ import org.flossware.classloader-java.AuthConfig;
8787
8888// Basic Authentication
8989AuthConfig basicAuth = AuthConfig . basic(" username" , " password" );
90- JClassLoader loader = JClassLoader . builder()
90+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
9191 .addRemoteSource(" https://secure.example.com/classes/" , basicAuth)
9292 .build();
9393
9494// Bearer Token Authentication
9595AuthConfig bearerAuth = AuthConfig . bearer(" your-token-here" );
96- JClassLoader loader2 = JClassLoader . builder()
96+ ApplicationClassLoader loader2 = ApplicationClassLoader . builder()
9797 .addRemoteSource(" https://api.example.com/classes/" , bearerAuth)
9898 .build();
9999```
@@ -102,17 +102,17 @@ JClassLoader loader2 = JClassLoader.builder()
102102
103103``` java
104104// Anonymous FTP
105- JClassLoader ftpLoader = JClassLoader . builder()
105+ ApplicationClassLoader ftpLoader = ApplicationClassLoader . builder()
106106 .addClassSource(new FtpClassSource (" ftp://ftp.example.com/classes/" ))
107107 .build();
108108
109109// Authenticated FTP
110- JClassLoader ftpAuthLoader = JClassLoader . builder()
110+ ApplicationClassLoader ftpAuthLoader = ApplicationClassLoader . builder()
111111 .addClassSource(new FtpClassSource (" ftp://ftp.example.com/classes/" , " username" , " password" ))
112112 .build();
113113
114114// FTPS (FTP over SSL/TLS)
115- JClassLoader ftpsLoader = JClassLoader . builder()
115+ ApplicationClassLoader ftpsLoader = ApplicationClassLoader . builder()
116116 .addClassSource(new FtpClassSource (" ftps://secure-ftp.example.com/classes/" , " username" , " password" ))
117117 .build();
118118```
@@ -125,13 +125,13 @@ JClassLoader ftpsLoader = JClassLoader.builder()
125125import org.flossware.classloader-java.AuthConfig ;
126126
127127// Public Nexus raw repository
128- JClassLoader loader = JClassLoader . builder()
128+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
129129 .addNexusRawSource(" https://nexus.example.com" , " raw-classes" )
130130 .build();
131131
132132// Authenticated Nexus raw repository
133133AuthConfig auth = AuthConfig . basic(" username" , " password" );
134- JClassLoader authLoader = JClassLoader . builder()
134+ ApplicationClassLoader authLoader = ApplicationClassLoader . builder()
135135 .addNexusRawSource(" https://nexus.example.com" , " private-raw" , auth)
136136 .build();
137137```
@@ -154,7 +154,7 @@ MavenNexusClassSource nexusSource = MavenNexusClassSource.builder()
154154 .addArtifact(" com.google.guava:guava:32.1.0-jre" )
155155 .build();
156156
157- JClassLoader loader = JClassLoader . builder()
157+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
158158 .addNexusMavenSource(nexusSource)
159159 .build();
160160
@@ -211,7 +211,7 @@ import org.flossware.classloader-java.cache.FileSystemCache;
211211
212212FileSystemCache cache = new FileSystemCache (" /tmp/classloader-java-cache" );
213213
214- JClassLoader loader = JClassLoader . builder()
214+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
215215 .addRemoteSource(" https://example.com/classes/" )
216216 .cache(cache)
217217 .useCache(true )
@@ -229,7 +229,7 @@ Class<?> myCachedClass = loader.loadClass("com.example.MyClass");
229229Classes are searched in the order sources are added:
230230
231231``` java
232- JClassLoader loader = JClassLoader . builder()
232+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
233233 .addLocalSource(" /opt/app/classes" ) // Searched first
234234 .addRemoteSource(" https://cdn.example.com/" ) // Searched second
235235 .addClassSource(new FtpClassSource (" ftp://backup.example.com/classes/" )) // Searched third
@@ -269,13 +269,13 @@ CloudStorageClient s3 = S3CloudStorageClient.builder()
269269 .prefix(" production/classes/" )
270270 .build();
271271
272- // Use with JClassLoader
273- JClassLoader loader = JClassLoader . builder()
272+ // Use with ApplicationClassLoader
273+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
274274 .addCloudStorage(s3)
275275 .build();
276276
277277// Or wrap manually
278- JClassLoader loader2 = JClassLoader . builder()
278+ ApplicationClassLoader loader2 = ApplicationClassLoader . builder()
279279 .addClassSource(new CloudStorageClassSource (s3))
280280 .build();
281281```
@@ -315,7 +315,7 @@ FileTransferClient sftp = SftpFileTransferClient.builder()
315315 .basePath(" /opt/classes" )
316316 .build();
317317
318- JClassLoader loader = JClassLoader . builder()
318+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
319319 .addClassSource(new FileTransferClassSource (sftp))
320320 .build();
321321```
@@ -345,7 +345,7 @@ MessageClient kafka = KafkaMessageClient.builder()
345345 .topic(" class-definitions" )
346346 .build();
347347
348- JClassLoader loader = JClassLoader . builder()
348+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
349349 .addClassSource(new MessageClientClassSource (kafka))
350350 .build();
351351```
@@ -374,7 +374,7 @@ ContainerClient k8s = KubernetesContainerClient.builder()
374374 .namespace(" production" )
375375 .build();
376376
377- JClassLoader loader = JClassLoader . builder()
377+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
378378 .addClassSource(new ContainerClientClassSource (k8s, " app-classes" ))
379379 .build();
380380```
@@ -405,7 +405,7 @@ VcsClient git = GitVcsClient.builder()
405405 .basePath(" build/classes" )
406406 .build();
407407
408- JClassLoader loader = JClassLoader . builder()
408+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
409409 .addClassSource(new VcsClientClassSource (git))
410410 .build();
411411```
@@ -417,21 +417,21 @@ Supported systems: Git (local and remote). See [jvcs docs](https://github.com/Fl
417417``` java
418418ClassLoader parentLoader = Thread . currentThread(). getContextClassLoader();
419419
420- JClassLoader loader = JClassLoader . builder()
420+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
421421 .parent(parentLoader)
422422 .addLocalSource(" /path/to/classes" )
423423 .build();
424424```
425425
426426### Delegation Strategies (NEW in 1.0)
427427
428- JClassLoader now supports configurable delegation strategies to control when classes are loaded from parent vs. configured sources.
428+ ApplicationClassLoader now supports configurable delegation strategies to control when classes are loaded from parent vs. configured sources.
429429
430430#### Parent-First (Default - Standard Java Behavior)
431431
432432``` java
433433// Delegates to parent first, then checks sources
434- JClassLoader loader = JClassLoader . builder()
434+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
435435 .addLocalSource(" /path/to/classes" )
436436 .parentFirst() // This is the default
437437 .build();
@@ -444,7 +444,7 @@ Useful for plugin systems, application containers, and isolation scenarios where
444444``` java
445445// Checks sources first, then falls back to parent
446446// System classes (java.*, javax.*) always from parent
447- JClassLoader loader = JClassLoader . builder()
447+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
448448 .addLocalSource(" /plugins/my-plugin" )
449449 .parentLast(" com.myapp.api." , " java." , " javax." ) // API classes from parent
450450 .build();
@@ -456,7 +456,7 @@ Fine-grained control using a predicate:
456456
457457``` java
458458// Custom logic to decide parent-first vs parent-last per class
459- JClassLoader loader = JClassLoader . builder()
459+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
460460 .addLocalSource(" /path/to/classes" )
461461 .customDelegation(className - >
462462 className. startsWith(" java." ) || // System classes: parent-first
@@ -473,13 +473,13 @@ Monitor class loading events for tracking, debugging, and resource management.
473473
474474``` java
475475// Log all class loading events
476- JClassLoader loader = JClassLoader . builder()
476+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
477477 .addLocalSource(" /path/to/classes" )
478478 .addLoggingListener() // Logs to System.out
479479 .build();
480480
481481// Verbose logging (includes cache hits)
482- JClassLoader verboseLoader = JClassLoader . builder()
482+ ApplicationClassLoader verboseLoader = ApplicationClassLoader . builder()
483483 .addLocalSource(" /path/to/classes" )
484484 .addLoggingListener(true ) // verbose = true
485485 .build();
@@ -494,7 +494,7 @@ import org.flossware.classloader-java.lifecycle.ResourceTrackingListener;
494494
495495ResourceTrackingListener tracker = new ResourceTrackingListener ();
496496
497- JClassLoader loader = JClassLoader . builder()
497+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
498498 .addLocalSource(" /plugins/my-plugin" )
499499 .addListener(tracker)
500500 .build();
@@ -535,7 +535,7 @@ ClassLoaderLifecycleListener myListener = new ClassLoaderLifecycleListener() {
535535 }
536536};
537537
538- JClassLoader loader = JClassLoader . builder()
538+ ApplicationClassLoader loader = ApplicationClassLoader . builder()
539539 .addLocalSource(" /path/to/classes" )
540540 .addListener(myListener)
541541 .build();
@@ -546,7 +546,7 @@ JClassLoader loader = JClassLoader.builder()
546546### Core Components
547547
548548** Class Loading:**
549- - ** ` JClassLoader ` ** : Main classloader implementation extending ` java.lang.ClassLoader `
549+ - ** ` ApplicationClassLoader ` ** : Main classloader implementation extending ` java.lang.ClassLoader `
550550- ** ` ClassSource ` ** : Interface for class loading sources (20+ implementations)
551551- ** ` LocalClassSource ` ** : Loads classes from local file system
552552- ** ` RemoteClassSource ` ** : Loads classes from HTTP/HTTPS URLs
@@ -604,7 +604,7 @@ mvn test
604604
605605### Test Coverage
606606
607- JClassLoader has ** 463 comprehensive unit tests** achieving ** 46% instruction coverage** across the codebase. While we strive for high test coverage, 100% coverage is not the goal for this project. Here's why:
607+ ApplicationClassLoader has ** 463 comprehensive unit tests** achieving ** 46% instruction coverage** across the codebase. While we strive for high test coverage, 100% coverage is not the goal for this project. Here's why:
608608
609609** What IS tested (well-covered):**
610610- ✅ ** Core functionality** (53% coverage): Class loading, delegation strategies, authentication
@@ -662,7 +662,7 @@ This project is licensed under the GNU General Public License v3.0 - see the [LI
662662### Plugin Systems
663663Use parent-last delegation to isolate plugins from the host application:
664664``` java
665- JClassLoader pluginLoader = JClassLoader . builder()
665+ ApplicationClassLoader pluginLoader = ApplicationClassLoader . builder()
666666 .addLocalSource(" /plugins/my-plugin" )
667667 .parentLast(" com.myapp.api." ) // Only API from host
668668 .trackResources() // For cleanup when unloading
@@ -672,7 +672,7 @@ JClassLoader pluginLoader = JClassLoader.builder()
672672### Application Containers (like JPlatform)
673673Run multiple applications in one JVM with isolation:
674674``` java
675- JClassLoader app1Loader = JClassLoader . builder()
675+ ApplicationClassLoader app1Loader = ApplicationClassLoader . builder()
676676 .addLocalSource(" /apps/app1.jar" )
677677 .addMavenCentral(" commons-lang3:3.12.0" )
678678 .parentLast(" org.platform.api." )
@@ -684,7 +684,7 @@ JClassLoader app1Loader = JClassLoader.builder()
684684Isolate tests and cleanup between runs:
685685``` java
686686ResourceTrackingListener tracker = new ResourceTrackingListener ();
687- JClassLoader testLoader = JClassLoader . builder()
687+ ApplicationClassLoader testLoader = ApplicationClassLoader . builder()
688688 .addLocalSource(" /test-classes" )
689689 .addListener(tracker)
690690 .build();
@@ -695,7 +695,7 @@ tracker.closeAllResources(); // Cleanup
695695### Multi-Tenant Applications
696696Load tenant-specific code with isolation:
697697``` java
698- JClassLoader tenantLoader = JClassLoader . builder()
698+ ApplicationClassLoader tenantLoader = ApplicationClassLoader . builder()
699699 .addRemoteSource(" https://tenant1.example.com/code/" )
700700 .parentLast()
701701 .build();
0 commit comments