Getting Started
This guide builds the common application flow: install the core and a backend, create defaults, load a file, merge missing defaults, apply runtime overrides, read typed values, and save the document.
Add Dependencies
dependencies {
implementation(platform("net.pistonmaster:pistonconfig-bom:0.1.0-SNAPSHOT"))
implementation("net.pistonmaster:pistonconfig-core")
implementation("net.pistonmaster:pistonconfig-yaml")
implementation("net.pistonmaster:pistonconfig-env")
}
Use installation for Maven, GitHub Packages, and non-BOM examples.
Create Defaults
Defaults are just normal documents. That keeps manual defaults, annotation-generated defaults, static-field defaults, and resource-loaded defaults compatible with the same merge API.
var defaults = ConfigDocument.empty()
.set("server.host", "0.0.0.0")
.set("server.port", 25565)
.set("server.online-mode", true);
defaults.root()
.getOrCreate(ConfigPath.parse("server.port"))
.setComment(ConfigComment.builder()
.addLeading(ConfigCommentLine.builder()
.text("Port used by the public listener.")
.type(ConfigCommentType.BLOCK)
.marker(ConfigCommentMarker.HASH)
.build())
.build());
Load the User File
var path = Path.of("config.yml");
var loader = YamlConfigFormat.INSTANCE.loader();
var document = Files.exists(path)
? ConfigLoaders.load(path, loader)
: ConfigDocument.empty();
ConfigLoaders handles UTF-8 readers and writers. Format modules provide the actual ConfigLoader.
Merge Missing Defaults
document.mergeDefaults(defaults, MergeOptions.conservative());
MergeOptions.conservative() adds missing defaults and refreshes comments from the defaults. It does not replace user values or remove unknown user keys.
Use merge defaults when you need exact-default behavior or list strategies.
Apply Deployment Overrides
EnvironmentOverrides.system("myapp").applyTo(document);
With the myapp prefix:
| Source | Example | Config path |
|---|---|---|
| Environment | MYAPP_SERVER_PORT=25566 |
server.port |
| System property | -Dmyapp.server.host=127.0.0.1 |
server.host |
Apply overrides after merging defaults and migrations so deployment values win.
Read Values
int port = document.find("server.port")
.flatMap(ConfigNode::asInt)
.orElse(25565);
String host = document.find("server.host")
.flatMap(ConfigNode::asString)
.orElse("0.0.0.0");
Accessors return Optional because files are external input. Decode near the boundary where you can choose a fallback or report an error.
Save the Result
ConfigLoaders.save(path, loader, document);
The backend writes the source detail it can represent. For example, YAML can write inline comments, scalar styles, anchors, and collection styles; properties files keep a flatter model and layout attributes.