Using the Java API
The library has three entry points, all in io.repaint.rangeresolver.lang:
| Class | Responsibility |
|---|---|
RangeResolverProcessor |
Parses script text into an immutable RangeResolver model. |
RepositoryResolver |
Resolves a model’s requests against Maven repositories. |
RepositoryWriter |
Writes a model back out as script text. |
The model types (RangeResolver, Resolve, Resolved, Repository, Import, Alias, Allow, Range and so on)
live in io.repaint.rangeresolver.api. They are Immutables value classes, so every
change returns a new copy, for example withLocked(...).
Parsing
Section titled “Parsing”import io.repaint.rangeresolver.api.RangeResolver;import static io.repaint.rangeresolver.lang.RangeResolverProcessor.parseRangeResolver;
RangeResolver model;try (var reader = Files.newBufferedReader(Path.of("pom.deps"))) { model = parseRangeResolver( "pom.deps", // source reference, used in error messages reader, "", // allowUnlocked: extra pattern of keys to unlock in imports ("" for none) ""); // allowSnapshots: extra pattern of keys allowed to resolve snapshots ("" for none)}A script with any lexer or parser error throws RangeResolverSyntaxException, whose message names the source,
line and column:
Syntax error in pom.deps: line 2:0 mismatched input 'resolve' expecting {'filtering', 'via', ';'}The two pattern arguments add non-persistent allow unlocked and allow snapshots rules on top of the ones in the
script. The Maven plugin uses them for its -DallowUnlocked=… and -DallowSnapshots=… options. They are never
written back to the file.
Resolving
Section titled “Resolving”import io.repaint.rangeresolver.api.ResolutionResult;import io.repaint.rangeresolver.lang.RepositoryResolver;
RepositoryResolver resolver = RepositoryResolver.createRepositoryResolver( System.out::println, // info logger System.err::println, // warning logger System.getProperty("user.home") + "/.m2/repository", "", // allowUnlocked "", // allowSnapshots false); // updateSnapshots: check remotes every time, not daily
ResolutionResult result = resolver.resolveRanges(model, "my-project", "pom.deps");
result.resolved().forEach(r -> System.out.println(r.key() + " -> " + r.version()));Inside a Maven plugin or extension, pass the build’s own RepositorySystem and RepositorySystemSession to the
other createRepositoryResolver overload. Resolution then honours the user’s settings.xml mirrors, proxies and
credentials.
Writing
Section titled “Writing”To produce an updated script, copy the result lists onto the model and write it out:
import static io.repaint.rangeresolver.lang.RepositoryWriter.writeRangeResolveSource;
RangeResolver updated = model .withResolved(result.resolved()) .withLocked(result.locked()) .withDeprecated(result.deprecated()) .withBlacklisted(result.blacklisted());
writeRangeResolveSource(updated, Files.newBufferedWriter(Path.of("pom.deps")));The writer emits statements in a fixed order (repositories, imports, allows, withholds, blacklists, deprecations, Docker resolutions, resolutions, overrides, aliases, then the records), separates the sections with blank lines, and keeps each statement’s leading comments.
Helpers
Section titled “Helpers”RepositoryResolver also exposes the static helpers the plugin goals are built on:
unlockDependencies(model, patterns)moves matchinglockedrecords back toresolved.snapshotDependencies(model, logger, patterns)switches matching requests to thesnapshotbound.isNewerVersion(a, b)compares two versions using Maven ordering.