diff --git a/box.json b/box.json index 5948a29..ab68d02 100644 --- a/box.json +++ b/box.json @@ -1,7 +1,7 @@ { "name":"JavaLoader", "author":"Ortus Solutions.com ", - "version":"2.5.0", + "version":"2.6.0", "location":"https://downloads.ortussolutions.com/ortussolutions/coldbox-modules/cbjavaloader/@build.version@/cbjavaloader-@build.version@.zip", "slug":"cbjavaloader", "type":"modules", diff --git a/changelog.md b/changelog.md index 2368613..10867d9 100644 --- a/changelog.md +++ b/changelog.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [2.5.0] - 2026-04-02 + ## [2.4.0] - 2026-04-02 ## [2.3.0] - 2025-08-23 @@ -123,7 +125,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Create first module version -[unreleased]: https://github.com/coldbox-modules/cbjavaloader/compare/v2.4.0...HEAD +[unreleased]: https://github.com/coldbox-modules/cbjavaloader/compare/v2.5.0...HEAD +[2.5.0]: https://github.com/coldbox-modules/cbjavaloader/compare/v2.4.0...v2.5.0 [2.4.0]: https://github.com/coldbox-modules/cbjavaloader/compare/v2.3.0...v2.4.0 [2.3.0]: https://github.com/coldbox-modules/cbjavaloader/compare/v2.2.0...v2.3.0 [2.2.0]: https://github.com/coldbox-modules/cbjavaloader/compare/768425a02713cf6d17ebae745a4d15cc1e8b603a...v2.2.0 diff --git a/models/javaloader/JavaLoader.cfc b/models/javaloader/JavaLoader.cfc index 11f375a..15c0316 100644 --- a/models/javaloader/JavaLoader.cfc +++ b/models/javaloader/JavaLoader.cfc @@ -305,38 +305,54 @@ output ="false" > - var iterator = getClassLoadPaths().iterator(); - var file = 0; - var classLoader = 0; - var networkClassLoaderClass = 0; - var networkClassLoaderProxy = 0; - - networkClassLoaderClass = getServerURLClassLoader().loadClass( - "com.compoundtheory.classloader.NetworkClassLoader" - ); - - networkClassLoaderProxy = createJavaProxy( networkClassLoaderClass ); - - if ( isObject( getParentClassLoader() ) ) { - classLoader = networkClassLoaderProxy.init( getParentClassLoader() ); - } else { - classLoader = networkClassLoaderProxy.init(); + var networkClassLoaderKey = instance.static.uuid & "." & getVersion() & ".networkclassloader"; + + // Reuse existing NetworkClassLoader if already cached in server scope + if ( structKeyExists( server, networkClassLoaderKey ) ) { + setURLClassLoader( server[ networkClassLoaderKey ] ); + return; } - while ( iterator.hasNext() ) { - file = createObject( "java", "java.io.File" ).init( iterator.next() ); - if ( NOT file.exists() ) { - throwException( - "javaloader.PathNotFoundException", - "The path you have specified could not be found", - file.getAbsolutePath() & " does not exist" - ); + lock name="javaloader.networkclassloader.load" throwontimeout="true" timeout="60" { + // Double-check inside lock + if ( structKeyExists( server, networkClassLoaderKey ) ) { + setURLClassLoader( server[ networkClassLoaderKey ] ); + return; } - classLoader.addUrl( file.toURL() ); - } + var iterator = getClassLoadPaths().iterator(); + var file = 0; + var classLoader = 0; + var networkClassLoaderClass = 0; + var networkClassLoaderProxy = 0; + + networkClassLoaderClass = getServerURLClassLoader().loadClass( + "com.compoundtheory.classloader.NetworkClassLoader" + ); + + networkClassLoaderProxy = createJavaProxy( networkClassLoaderClass ); + + if ( isObject( getParentClassLoader() ) ) { + classLoader = networkClassLoaderProxy.init( getParentClassLoader() ); + } else { + classLoader = networkClassLoaderProxy.init(); + } - setURLClassLoader( classLoader ); + while ( iterator.hasNext() ) { + file = createObject( "java", "java.io.File" ).init( iterator.next() ); + if ( NOT file.exists() ) { + throwException( + "javaloader.PathNotFoundException", + "The path you have specified could not be found", + file.getAbsolutePath() & " does not exist" + ); + } + classLoader.addUrl( file.toURL() ); + } + + server[ networkClassLoaderKey ] = classLoader; + setURLClassLoader( classLoader ); + }