Skip to content

The Jakarta migration updates Jakarta EE type names in string literals - #1271

Merged
jkschneider merged 12 commits into
jakarta/moxy-3from
jakarta/reflective-type-names
Oct 4, 2026
Merged

jkschneider merged 12 commits into
jakarta/moxy-3from
jakarta/reflective-type-names

Conversation

@jkschneider

Copy link
Copy Markdown
Member

ChangePackage moves imports but leaves class names in string literals, so code that looks types up by name, such as Arquillian's test enrichers checking for "javax.inject.Inject" or "javax.ejb.EJB", or that writes a services/javax.enterprise.inject.spi.Extension descriptor, silently stopped finding the migrated APIs. New declarative recipe JavaxRuntimeTypeNamesToJakarta, run early in JavaxMigrationToJakarta, applies ChangePackageInStringLiteral to javax.inject, javax.enterprise, javax.ejb and javax.servlet, and ChangeTypeInStringLiteral to javax.annotation.Resource and javax.annotation.Resources. It is limited to those names on purpose, so strings naming Java SE packages that stay in javax, such as javax.annotation.processing, javax.naming, javax.net.ssl and javax.transaction.xa, are left alone.

Found by a team of coding agents reviewing a Moderne run of org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta over the 31 Arquillian repositories (run 20261003120559-YQoma). The issues are javax-reflective-names-retained in the run's io.moderne.RecipeIssues data table (21 rows) and cdi-service-path-literal-retained (2 rows), and the fix was discussed and reviewed on the run's message board. A row from the table, as a generalized example:

Unmigrated runtime class names disable Jakarta availability checks or annotation recognition. (arquillian/arquillian-core, testenrichers/cdi/src/main/java/org/jboss/arquillian/testenricher/cdi/CDIInjectionEnricher.java, recipe org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta)

Before:

class A { String type = "javax.inject.Inject"; }

What the recipe produced:

class A { String type = "javax.inject.Inject"; }

Expected:

class A { String type = "jakarta.inject.Inject"; }

Stacked on #1270 (8 of 19); merge that one first.

@jkschneider
jkschneider force-pushed the jakarta/reflective-type-names branch from 2bce03c to d964eae Compare October 3, 2026 22:26
…vlet packages and the Java version (#1274)

* jetty-ee9-java-baseline: align Jetty dependencies packages and Java baseline

* jetty-ee9-java-baseline: leave standalone Jetty utility dependencies unchanged

* jetty-ee9-java-baseline: require a direct dependency before upgrading Java
…on properties when relocating artifacts (#1275)

* jackson-version-downgrade: preserve newer versions and shared properties

* jackson-shared-version-property-split: cover older shared Jackson versions
…ian Recorder 1.x binaries (#1276)

* recorder-javax-jaxb-api-removed: retain the API needed by Recorder binaries

* recorder-javax-jaxb-api-removed: limit retention to external binaries after migration
… it again in compile scope (#1279)

* cdi-provided-scope-promoted: preserve provided CDI API scope

* cdi-provided-scope-promoted: distinguish provided declarations from runtime APIs

* provided-api-scope-overwritten: preserve provided Mail API scope

* provided-api-scope-overwritten: preserve container API scopes across Jakarta migrations
…oviderBase._configForWriting` overrides (#1280)

* jackson-provider-override-signature: forward the default view parameter

* jackson-provider-override-signature: update callers of migrated overrides
@jkschneider
jkschneider added this pull request to stack #1284 October 4, 2026 09:43
@jkschneider
jkschneider merged commit 2881c45 into main Oct 4, 2026
1 check passed
@jkschneider
jkschneider deleted the jakarta/reflective-type-names branch October 4, 2026 09:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant