Hi Ondro,
Thank you again for the detailed context and for pointing me to the previous discussions.
I have been going through the MicroProfile Config specification, the Jakarta Config discussions, and some of the historical issues around configuration semantics. This has helped me form a clearer opinion about what Jakarta Config 1.0 could reasonably aim for.
My current view is that Jakarta Config 1.0 should use MicroProfile Config as the proven baseline and should avoid redesigning configuration from scratch.
Historically, MicroProfile was created to allow Enterprise Java to move faster and experiment in areas where the formal standardization process could not evolve quickly enough. MicroProfile Config has now accumulated several years of implementation and production experience, so I think Jakarta Config should benefit from that experience rather than repeat the experimentation phase.
Regarding the points you raised, my current position would be:
Jakarta Config should aim to become the standardized successor of MicroProfile Config.
If that is the goal, I think the namespace should be jakarta.*.
Migration from MicroProfile Config should be intentionally inexpensive. Ideally, for most application code, changing imports from org.eclipse.microprofile.config.* to jakarta.config.* should represent most of the migration effort.
The core API should remain usable independently of CDI. CDI integration is very valuable for Jakarta EE applications, but I believe CDI should consume/integrate with Jakarta Config rather than be a prerequisite for configuration itself.
I would avoid adding major new features to Jakarta Config 1.0 unless they are necessary to avoid an architectural dead end.
I have not found many MicroProfile Config features that I would consider obsolete. My default position would be to preserve existing behavior unless there is a concrete reason to change it.
While reviewing the specification, I found a few areas that I think are worth discussing carefully.
One is the distinction between a missing property and an explicitly empty property.
For example, I see these as different states:
property not present
and:
property=
I understand the historical reason why MicroProfile Config uses the empty string as a way for a higher-priority ConfigSource to clear a value from a lower-priority source. I also reviewed the discussion around issues #446, #531 and #532, and I think the clearing use case itself is completely valid.
However, using the empty string to represent "cleared/non-present" also means losing the distinction between an explicitly configured empty value and an absent value.
Conceptually, I think these are different states:
ABSENT
PRESENT_EMPTY
PRESENT_VALUE
CLEARED
I am not suggesting that Jakarta Config 1.0 must necessarily expose those four states directly in the API, but I think it is worth reviewing whether the model should preserve that distinction rather than conflate empty and absent.
This also seems relevant for future structured configuration support, where formats such as JSON naturally distinguish between a missing member, null, an empty string, and a non-empty value.
Another area is dynamic configuration.
I think Jakarta Config should support dynamic ConfigSources in 1.0. The specification should define portable observable behavior while leaving caching, polling, watches, and similar mechanisms as implementation details.
In other words, I think the specification should define configuration semantics rather than mandate a particular caching strategy.
A runtime may cache aggressively, but that should not effectively turn a source declared as dynamic into a static source.
Regarding Kubernetes ConfigMaps and Secrets, I currently see them primarily as possible ConfigSource implementations rather than something Jakarta Config itself should depend on.
The same configuration may reach the application through environment variables, mounted files, or a dedicated ConfigSource. Those are different transport mechanisms, even if the original source was Kubernetes.
I also think there is value in preserving information about sensitive values.
From a lookup perspective, a secret is still configuration. However, a ConfigSource that knows that a particular value came from a Kubernetes Secret, Vault, Azure Key Vault, etc. could potentially preserve metadata indicating that the value is sensitive.
I do not think Jakarta Config can guarantee that a secret will never be logged once an application explicitly converts it to a regular String. But preserving sensitivity metadata could help avoid accidental exposure by Jakarta Config itself and by tooling built on top of it.
It may also be worth exploring in the future whether sensitive values should support a representation that requires an explicit operation to expose their clear value, similar in spirit to why Console.readPassword() uses char[] rather than String.
For 1.0, however, I would be careful not to let this grow into a large new security API.
On structured/tree configuration, I do see value in it, especially for JSON/YAML-style configuration and object mapping. But I would explicitly keep full tree navigation, merge semantics, arrays, and hierarchical overrides out of the 1.0 scope. I think they should be considered in the design so that 1.0 does not make them impossible later, but they should not delay the first release.
Regarding existing MicroProfile Config features such as profiles, property expressions, converters, source ordinals, and deterministic ConfigSource ordering, I currently see strong reasons to preserve them.
In particular:
Profiles are very useful in practice.
Property expressions are fundamental when values come from multiple configuration sources.
Converters provide a clean way to adapt String-based configuration to application types.
ConfigSource ordinals and the current deterministic tie-breaking behavior should remain unchanged for compatibility.
Lookup should be fundamental, while full enumeration of all properties may deserve to be treated as an optional capability for remote or security-sensitive sources.
Overall, my current preference would be:
Start from MicroProfile Config.
Keep the 1.0 scope deliberately small.
Preserve existing, proven behavior by default.
Change behavior only where there is a clear semantic or architectural reason.
Keep the architecture extensible for future structured configuration and richer secret handling.
I am still learning the specification process and I may be missing historical context in some of these areas, so I would be very interested to know which of these points align with the current Jakarta Config API and which ones have already been discussed or rejected in the past.
Best regards,
Diego