7.1.0 is a cleanup release with three breaking packaging changes for consumers already on 7.0.0, plus additive features (full list in RELEASE_NOTES.md).
- OSGi runtime variant removed. If you consumed the OSGi bundles or called the OSGi-specific
ServiceRegistrymethods, see OSGi support removed below for the exact API delta and thebnd/pax-urlwrap path. metaobjects-dynamic-corefolded intometaobjects-metadata. Drop anycom.metaobjects:metaobjects-dynamic-coredependency — itsCoreObjectsMetaDataProvidernow ships insidemetaobjects-metadata. Thevalue*/data*attribute extensions it used to contribute ontoobject.base(e.g.valueObjectType,dataBuilderClass,dataImmutable) have been removed — generated-object flavor is now derived from the codegen generator's configuration, not from metamodel attributes. If you authored any of those attributes in metadata, delete them.archetype/examplesdirectories deleted. No action unless you referenced them as source.
Additive (opt-in) in 7.1.0: programmatic provider registration, the TemplateGenerator render API in metaobjects-render, codegen-spring hasFoo() presence helpers for nullable record fields, and codegen-kotlin text() mapping for jsonb-backed string fields.
Otherwise it is a version bump:
<version>7.1.0</version>7.0.0 is the first publish from the consolidated server/java/ reactor under the cross-language MetaObjects monorepo. Most consumers' migration is a version bump — the bulk of the work moved underneath the API. The full release notes are in RELEASE_NOTES.md.
<dependency>
<groupId>com.metaobjects</groupId>
<artifactId>metaobjects-metadata</artifactId>
<version>7.0.0</version>
</dependency>Maven coordinates are unchanged from 6.x — com.metaobjects:* on Maven Central. Group IDs and artifact names stay the same except for new modules listed below.
Five module additions in 7.0.0 (none required; opt in per stack):
| Module | When you need it |
|---|---|
metaobjects-codegen-spring |
Generate Spring REST controllers + DTOs + JPA repositories + filter allowlists from metadata |
metaobjects-codegen-kotlin |
Generate idiomatic Kotlin (entity / Exposed table / Spring controller / payload / validator / stored-proc) on KotlinPoet |
metaobjects-render |
Mustache render + payload-VO codegen + drift-verify (the prompt-construction pillar) |
metaobjects-metadata-ktx |
Kotlin facade over the Java metadata core |
metaobjects-omdb-ktx |
Kotlin facade over OMDB |
The metaobjects-dynamic-core module from 6.x is gone — its CoreObjectsMetaDataProvider now ships inside metaobjects-metadata. The value* / data* attribute extensions it once contributed onto object.base (dataBuilderClass, valueObjectType, dataImmutable, etc.) have since been removed: generated-object flavor is derived from the codegen generator's configuration rather than from metamodel attributes, so there is nothing for consumers to register or author. Consumers of the metaobjects-dynamic-core artifact coordinate should drop the dependency; any of those attributes still present in authored metadata should be deleted.
The OSGi runtime variant (OSGIServiceRegistry, BundleLifecycleManager, the maven-bundle-plugin packaging on every reactor module) was dropped in 7.1.0. The artifacts are now plain JARs. Decision rationale: ADR-0012.
Consumers running inside an OSGi container can still wrap MetaObjects' JARs with bnd / pax-url to produce bundles with the appropriate manifest headers — the code itself works in any classloader environment. What changes:
<packaging>bundle</packaging>is now<packaging>jar</packaging>on every module; noBundle-SymbolicName/Export-Packagemanifest entries are emitted.ServiceRegistry.isOSGIEnvironment(),onBundleEvent(Object),cleanupForBundle(Object),isBundleLifecycleActive(),getBundleLifecycleStatus()are gone from the interface (they had no callers outside the OSGi implementation itself).StandardServiceRegistryis the onlyServiceRegistryimplementation.ServiceRegistryFactory.create()and.getDefault()return aStandardServiceRegistry. The OSGi auto-detection /createOSGI(BundleContext)factories are gone.
The WeakReference patterns in MetaData, HybridCache, and StandardServiceRegistry stay — they are general ClassLoader-leak prevention, not OSGi-specific.
MetaDataRegistry now ships a compose(...) / registerProviders(...) API that mirrors the cross-port pattern already in TypeScript (composeRegistry(providers)) and Python (compose_registry(providers)):
MetaDataRegistry registry = MetaDataRegistry.compose(List.of(
new CoreTypesProvider(),
new MyDomainProvider(),
new MyTenantProvider()
));Use this when ServiceLoader is awkward — embedded scenarios, fat-jar consolidation, GraalVM native-image, conditional / tenant-driven composition, and tests that want to inject a fixture provider without touching META-INF/services. Strict error contract matches the cross-port spec: duplicate provider id, missing dependency, or dependency cycle throws MetaDataException with the matching ErrorCode.
The default MetaDataRegistry.getInstance() still uses ServiceLoader auto-discovery with warn-and-continue semantics — no change for the typical app.
The metaobjects-codegen-mustache and metaobjects-codegen-plantuml modules from 6.x continue unchanged.
Step 3 — source paradigm v2 (ADR-0007)
If your 6.x metadata declared a writable table via the legacy source.dbTable subtype, or a view via source.dbView, the canonical form is now:
- Source subtype:
source.rdb(only) —@kindselectstable/view/materializedView/storedProc/tableFunction. Read-only-ness is derived from@kind. Multi-source per object via@role(exactly oneprimary). - Source physical name:
@table(replaces@nameon the source). - Field physical name:
@column(replaces@dbColumn). - DB schema:
@schemaon the source (publicdefault for Postgres; SQLite rejects non-default values). - Referential actions on relationships:
@onDelete/@onUpdateon the relationship, not on the source.
The legacy source.dbTable / source.dbView subtypes and the @dbColumn attribute are retired.
Step 4 — FR5 actionable loader errors (ADR-0009)
Loader errors now ship as structured envelopes with errorCode, path, position, message, and hint fields. If you parse loader-error output, switch to the envelope shape — the legacy flat-string format is gone.
mvn meta:verify extends drift detection beyond entity codegen to prompt templates, output parsers, and database schema. Adopt it where you ship typed prompts or want compile-time gates against schema/code divergence.
The render pillar's payload-VO generator emits typed records for every template.input projection; FR-006 emits typed output parsers for every template.output schema. Both are opt-in additions — your existing entity codegen is unaffected.
The archetype and examples directories are still on disk as scaffold source but are no longer in the 7.0.0 reactor and are not deployed to Central. If you depended on them as Maven artifacts, copy the scaffold material into your own project tree.
The 5.x → 6.x migration changed the Maven group ID from com.draagon to com.metaobjects and refactored the package namespace from com.draagon.meta.* to com.metaobjects.*. The 6.x release notes have the per-package mapping. The recommended path for 5.x consumers today is 5.x → 7.0.0 directly — there is no benefit to landing at an intermediate 6.x version.
For the 5.x → 6.x package rename, replace com.draagon group IDs and com.draagon.meta.* import statements with com.metaobjects and com.metaobjects.* respectively, then proceed with the 6.x → 7.0.0 steps above.
- Specification + ADRs:
spec/at the repository root. - Cross-language conformance corpora:
fixtures/. - Issues: github.com/metaobjectsdev/metaobjects/issues.
{ "object.entity": { "name": "Subscriber", "children": [ { "source.rdb": { "@kind": "table", "@table": "subscribers", "@schema": "public" }}, { "field.string": { "name": "email", "@column": "email_address" }} ] }}