Quark-J8 provides comprehensive dependency management with runtime Maven dependency loading and full transitive dependency resolution.
// Load single dependency by coordinates
libraryManager.loadDependency("com.google.code.gson", "gson", "2.10.1");
// Load using coordinates string
libraryManager.loadDependency("org.yaml:snakeyaml:2.0");
// Load dependency from coordinates string
Dependency dependency = Dependency.fromCoordinates("com.google.code.gson:gson:2.10.1");
libraryManager.loadDependency(dependency);
// Load multiple dependencies
List<Dependency> dependencies = List.of(
Dependency.of("com.google.code.gson", "gson", "2.10.1"),
Dependency.of("org.yaml", "snakeyaml", "2.0")
);
libraryManager.loadDependencies(dependencies);
Dependency dependency = Dependency.builder()
.groupId("com.example")
.artifactId("my-library")
.version("1.0.0")
.classifier("sources") // Optional classifier
.optional(true) // Mark as optional
.scope("runtime") // Set scope
.fallbackRepository("https://custom-repo.com/maven/") // Fallback repository
.build();
libraryManager.loadDependency(dependency);
// Load main JAR
libraryManager.loadDependency("com.example:library:1.0.0");
// Load sources JAR using coordinates
libraryManager.loadDependency("com.example:library:1.0.0:sources");
// Using builder for classifier
Dependency withSources = Dependency.builder()
.groupId("com.example")
.artifactId("library")
.version("1.0.0")
.classifier("sources")
.build();
Dependency dep = Dependency.of("com.example", "library", "1.0.0");
// Get coordinate representations
String coords = dep.getCoordinates(); // "com.example:library:1.0.0"
String groupArtifact = dep.getGroupArtifactId(); // "com.example:library"
// Get file information
String jarFileName = dep.getJarFileName(); // "library-1.0.0.jar"
String pomFileName = dep.getPomFileName(); // "library-1.0.0.pom"
// Get repository paths
String repoPath = dep.getRepositoryPath(); // "com/example/library/1.0.0"
// Create variations
Dependency newVersion = Dependency.builder()
.groupId(dep.getGroupId())
.artifactId(dep.getArtifactId())
.version("2.0.0")
.build();
// Limit transitive dependency depth
libraryManager.maxTransitiveDepth(2);
// Exclude specific group IDs from resolution
libraryManager.excludeGroupIds("javax.servlet", "log4j");
// Exclude specific artifact patterns
libraryManager.excludeArtifacts("*:commons-logging", "org.slf4j:*");
// Skip optional dependencies
libraryManager.skipOptionalDependencies(true);
// Skip test dependencies
libraryManager.skipTestDependencies(true);
// Include dependency management from POMs
libraryManager.includeDependencyManagement(true);
// Apply optimization defaults for faster downloads
libraryManager.optimizeDependencyDownloads();
// Set log level for debugging
libraryManager.setLogLevel(LogLevel.DEBUG);
// Create named isolated class loader
IsolatedClassLoader isolatedLoader = libraryManager.createNamedIsolatedClassLoader("gson-loader");
// Load dependencies into isolated loader
List<Dependency> gsonDeps = List.of(
Dependency.of("com.google.code.gson", "gson", "2.10.1")
);
libraryManager.loadDependencies(isolatedLoader, gsonDeps);
// Load class from isolated loader
Class<?> gsonClass = isolatedLoader.loadClass("com.google.gson.Gson");
// Don't forget to close
isolatedLoader.close();
// Use the global isolated class loader
IsolatedClassLoader globalLoader = libraryManager.getGlobalIsolatedClassLoader();
// Load dependencies into global isolated loader
libraryManager.loadDependencies(globalLoader, dependencies);
// Check if dependency is loaded
Dependency gson = Dependency.of("com.google.code.gson", "gson", "2.10.1");
if (libraryManager.isDependencyLoaded(gson)) {
System.out.println("Gson is loaded!");
}
// Get all loaded dependencies with their paths
Map<Dependency, Path> loaded = libraryManager.getLoadedDependencies();
for (Map.Entry<Dependency, Path> entry : loaded.entrySet()) {
System.out.println(entry.getKey().getCoordinates() + " -> " + entry.getValue());
}
// Load dependencies configured via Gradle plugin
libraryManager.loadFromGradle();
// This will automatically load all dependencies and relocations
// configured in your build file with the quark configuration
Handle dependency loading failures:
try {
libraryManager.loadDependency("com.example:nonexistent:1.0.0");
} catch (LibraryManager.LibraryLoadException e) {
logger.error("Failed to load dependency: " + e.getMessage());
// Handle appropriately - maybe load fallback or disable feature
}
// Get library manager statistics
LibraryManager.LibraryManagerStats stats = libraryManager.getStats();
System.out.println("Repositories: " + stats.repositoryCount());
System.out.println("Loaded dependencies: " + stats.loadedDependencyCount());
System.out.println("Isolated class loaders: " + stats.isolatedClassLoaderCount());