Skip to content

Commit

Permalink
Merge branch 'main' into QDOCS-556
Browse files Browse the repository at this point in the history
  • Loading branch information
rolfedh authored Jan 16, 2024
2 parents 4b73e91 + 1b7c88e commit c4c141c
Show file tree
Hide file tree
Showing 348 changed files with 5,742 additions and 869 deletions.
192 changes: 192 additions & 0 deletions adr/0002-reactive-rename.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
= Rename Reactive extensions

* Status: proposed
* Date: 2023-10-17 by @geoand
* Revised: 2024-01-12 by @gsmet, @cescoffier, @geoand, @maxandersen
== Context and Problem Statement

RESTEasy Reactive is the preferred REST stack in Quarkus, however in the almost 3 years since its release, we have seen
folks of all experience misunderstand its capabilities and being led to believe that it forces reactive programming on them.

With the advent of Virtual Threads in Java 19+, the problem becomes larger since in the minds of users, Reactive and Virtual Threads
are two different worlds.

The same problem applies to other extensions as well:

* Reactive Messaging
* Reactive Routes
* REST Client Reactive

The common theme here is that these extensions can work equally well with reactive and blocking code, but their name confuses users.

We have tried to clarify the situation with blog posts, talks and on the various communication channels, but there seems to be
no escaping the fact that "reactive" in the name primes people in a non-desirable way.

What we would like to do is to only use of the word "reactive" in extensions that are forcing (or preferring) a reactive programming model. This does not mean that all reactive extensions is affected by this change, only the ones that are not forcing a reactive programming model.

Examples of good and bad names are:

[%header,format="csv"]
|===
Extension, Good/Bad
quarkus-hibernate-reactive, Good
quarkus-resteasy-reactive, Bad
smallrye-reactive-messaging, Bad
reactive-mysql-client, Good
|===

For majority of the extensions we can find a good name that causes no reuse of name, but for the REST Client we have a problem since the name `quarkus-rest-client` is already taken by the legacy REST Client implemented in RESTEasy Classic. Thus the best option is if we could come up with a name base name for `quarkus-rest`, i.e. `quarkus-restless` or similar but thus far we have not been able to come up with a good name, that is better or as acceptable as `quarkus-rest`.

Furthermore, we need to find a balance between the pain of renaming and the pain of keeping the status quo - while also informing/educating extension developers and users about the change in naming.

== Considered options

=== Do nothing

We can continue with the current situation, but that feels less than ideal given the recurrence of the problem.

=== Rename

We could simply rename the extensions without providing any backward compatibility with the old maven modules. This would likely cause a lot of pain - even in the presence of the Quarkus CLI update process, a lot of users won't use it.

=== Rename to new name everywhere

This would have the least impact on upgrading users, but it would also mean that we would have to come up with a new base-name for the REST Client. At this point no such name have been found.

=== Partial rename to new new name

For example, use `quarkus-rest` as base for everything, rename `quarkus-rest-client` to `quarkus-resteasy-client` and keep `quarkus-rest-client-reactive` as is. This would be a compromise between the two previous options.

Issue here is that it makes everything more complex and inconsistent.

=== Rename + warn/break at build time

Here we rename to new names everywhere but uses relocation's to warn/inform for dependency updates and add further logic in Quarkus buildtime phase to detect incompatible combinations.

For example today we detect when extensions are incompatible (i.e. resteasy combined resteasy-reactrive) with each other and fail the build. We could extend this to also detect when extensions are incompatible with each other due to the new naming.

== Decision

The decision is that we MUST do something about removing the word "reactive" from the names of the extensions that are not forcing a reactive programming model.

At a highlevel that means we will do the following:

* Rename current `quarkus-smallrye-reactive-messaging` to `quarkus-messaging`
* Rename current `quarkus-resteasy-reactive` to `quarkus-rest`
* Keep `quarkus-reactive-routes` as it is primarily pushing reactive.
* Rename current `quarkus-rest-client` to `quarkus-resteasy-client`
* Rename `quarkus-rest-client-reactive` to `quarkus-rest-client`
* TODO: rename all remaining bits??

This will cause a reuse of the `quarkus-rest-client` name where past it would be using resteasy classic but going forward it would be using resteasy reactive. As such we will need to add a relocation to warn users about this and also add a check in the buildtime phase to detect when the user is using the wrong combination of extensions.

=== Timing

We will not do this change in full for the 3.7/3.8 release as it is too close but instead split this up in two phases:

In 3.7/3.8 rename extensions that has `quarkus-rest-client` or `rest-client` in the name to use `quarkus-resteasy-client`/`rest-client` + provide relocation to warn users about the change.

In 3.9+ perform the full rename as described further below here.

This will allow us to do the rename in a more controlled manner and also allow us to do the rename in a way that is less likely to cause issues for users, especially LTS users.

=== Additional changes needed

* Introduce Maven relocations to allow for users not updating their poms
* Introduce recipe(s) that the Quarkus CLI can use during update
* Update quickstarts
* Update codestarts
* Update tooling to indicate proper older / newer relationship
* Write a new blog post explaining why we made the change
* Update old blog posts to mention the new name
* Update prominent Quarkus demo application and workshops
* Update GitHub labels
* Update bot configuration

=== What this will NOT do

* No Java code changes should be made - all code continue to reside in the same packages

== 3.7 renames

=== `rest-client` -> `quarkus-resteasy-client`

[%header,format="csv"]
|===
Old, New
*rest*-client, *quarkus-resteasy*-client
*rest*-client-config, rest-client-config
*rest*-client-jackson, *quarkus-resteasy*-client-jackson
*rest*-client-jaxb, *quarkus-resteasy*-client-jaxb
*rest*-client-jsonb, *quarkus-resteasy*-client-jsonb
*rest*-client-mutiny, *quarkus-resteasy*-client-mutiny
*quarkus*-oidc-*client*,*quarkus-resteasy-client*-oidc-filter
|===

== 3.9 renames

=== `smallrye-reactive-messaging` -> `quarkus-messaging`

[%header,format="csv"]
|===
Old, New
*smallrye-reactive*-messaging-kafka,*quarkus*-messaging-kafka
*smallrye-reactive*-messaging-mqtt,*quarkus*-messaging-mqtt
*smallrye-reactive*-messaging,*quarkus*-messsaging
*smallrye-reactive*-messaging-pulsar,*quarkus*-messaging-pulsar
*smallrye-reactive*-messaging-rabbitmq,*quarkus*-messaging-rabbitmq
*smallrye-reactive-messaging-amqp*,*quarkus*-messaging-amqp
|===

== `resteasy-reactive` -> `quarkus-rest`

[%header,format="csv"]
|===
Old, New
quarkus-*resteasy-reactive*,quarkus-*rest*
quarkus-*resteasy-reactive*-kotlin-serialization-common,quarkus-*rest*-kotlin-serialization-common
quarkus-*resteasy-reactive*-servlet, quarkus-*rest*-servlet
quarkus-*resteasy-reactive*-jsonb-common,*quarkus-rest*-jsonb-common
quarkus-*resteasy-reactive*-kotlin,*quarkus-rest*-kotlin
rest-client-reactive-kotlin-serialization,*quarkus-rest*-client-kotlin-serialization
*resteasy-reactive*/jaxrs-client-reactive,*quarkus-rest*-client-jaxrs
quarkus-*resteasy-reactive*-jaxb,*quarkus-rest*-jaxb
quarkus-*resteasy-reactive*-jackson-common,*quarkus-rest*-jackson-common
quarkus-*resteasy-reactive*-links,*quarkus-rest*-links
quarkus-*resteasy-reactive*-qute,*quarkus-rest*-qute
quarkus-*resteasy-reactive*-kotlin-serialization,*quarkus-rest*-kotlin-serialization
quarkus-*resteasy-reactive*-jsonb,*quarkus-rest*-jsonb
quarkus-*resteasy-reactive*,*quarkus-rest*
quarkus-*resteasy-reactive*-common,*quarkus-rest*-common
quarkus-*resteasy-reactive*-jackson,*quarkus-rest*-jackson

*rest-client-reactive*-jsonb,*quarkus-rest-client*-jsonb (REUSE)
*rest-client-reactive*,*quarkus-rest-client* (REUSE)
*rest-client-reactive*-jackson,*quarkus-rest-clietn*-jackson (REUSE)
*rest-client-reactive*-jaxb,*quarkus-rest-client*-jaxb (REUSE)
|===

== Related cleanup

[%header,format="csv"]
|===
Old, New
csrf-*reactive*,*quarkus-rest*-csrf
oidc-token-propagation-*reactive*,*quarkus-rest*-oidc-token-propagation
oidc-*client-reactive*-filter,*quarkus-rest-client*-filter-oidc
oidc-*client-reactive*-filter,*quarkus-rest-client*-oidc-filter
keycloak-admin-client-*reactive*,*quarkus*-keycloak-admin-*rest-client*
|===

== Consequences

Positives:
* Conveying the actual capabilities (blocking, non-blocking, Virtual Threads) of our stack should become easier.
* the new name aligns quite nicely with Java EE's Jakarta REST
* The 3.7 changes are just cleanup, we have time to adjust/fix things before the 3.9 changes and future LTS.

Negatives:

* renaming is always confusing for users.
* we will have to maintain relocations
88 changes: 69 additions & 19 deletions bom/application/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
<opentelemetry-alpha.version>1.32.0-alpha</opentelemetry-alpha.version>
<opentelemetry-semconv.version>1.21.0-alpha</opentelemetry-semconv.version> <!-- keep in sync with opentelemetry-java-instrumentation in the alpha bom-->
<quarkus-http.version>5.1.0.Final</quarkus-http.version>
<micrometer.version>1.12.1</micrometer.version><!-- keep in sync with hdrhistogram -->
<micrometer.version>1.12.2</micrometer.version><!-- keep in sync with hdrhistogram -->
<hdrhistogram.version>2.1.12</hdrhistogram.version><!-- keep in sync with micrometer -->
<google-auth.version>0.22.0</google-auth.version>
<graphql-java.version>21.1</graphql-java.version> <!-- keep in sync with smallrye-graphql -->
Expand All @@ -51,11 +51,11 @@
<microprofile-lra.version>2.0</microprofile-lra.version>
<microprofile-openapi.version>3.1.1</microprofile-openapi.version>
<smallrye-common.version>2.2.0</smallrye-common.version>
<smallrye-config.version>3.5.1</smallrye-config.version>
<smallrye-config.version>3.5.2</smallrye-config.version>
<smallrye-health.version>4.1.0</smallrye-health.version>
<smallrye-metrics.version>4.0.0</smallrye-metrics.version>
<smallrye-open-api.version>3.8.0</smallrye-open-api.version>
<smallrye-graphql.version>2.6.1</smallrye-graphql.version>
<smallrye-graphql.version>2.7.0</smallrye-graphql.version>
<smallrye-fault-tolerance.version>6.2.6</smallrye-fault-tolerance.version>
<smallrye-jwt.version>4.4.0</smallrye-jwt.version>
<smallrye-context-propagation.version>2.1.0</smallrye-context-propagation.version>
Expand Down Expand Up @@ -100,17 +100,17 @@
bytebuddy.version (just below), hibernate-orm.version-for-documentation (in docs/pom.xml)
and both hibernate-orm.version and antlr.version in build-parent/pom.xml
WARNING again for diffs that don't provide enough context: when updating, see above -->
<hibernate-orm.version>6.4.0.Final</hibernate-orm.version>
<hibernate-orm.version>6.4.1.Final</hibernate-orm.version>
<bytebuddy.version>1.14.7</bytebuddy.version> <!-- Version controlled by Hibernate ORM's needs -->
<hibernate-commons-annotations.version>6.0.6.Final</hibernate-commons-annotations.version> <!-- version controlled by Hibernate ORM -->
<hibernate-reactive.version>2.2.0.Final</hibernate-reactive.version>
<hibernate-reactive.version>2.2.1.Final</hibernate-reactive.version>
<hibernate-validator.version>8.0.1.Final</hibernate-validator.version>
<!-- When updating, align hibernate-search.version-for-documentation in docs/pom.xml -->
<hibernate-search.version>7.0.0.Final</hibernate-search.version>
<narayana.version>7.0.0.Final</narayana.version>
<agroal.version>2.1</agroal.version>
<jboss-transaction-spi.version>8.0.0.Final</jboss-transaction-spi.version>
<elasticsearch-opensource-components.version>8.11.3</elasticsearch-opensource-components.version>
<elasticsearch-opensource-components.version>8.11.4</elasticsearch-opensource-components.version>
<rxjava.version>2.2.21</rxjava.version>
<wildfly.openssl-java.version>2.2.5.Final</wildfly.openssl-java.version>
<wildfly.openssl-linux.version>2.2.2.Final</wildfly.openssl-linux.version>
Expand Down Expand Up @@ -178,7 +178,7 @@
<mongo-client.version>4.11.1</mongo-client.version>
<mongo-crypt.version>1.8.0</mongo-crypt.version>
<proton-j.version>0.34.1</proton-j.version>
<javaparser.version>3.25.6</javaparser.version>
<javaparser.version>3.25.8</javaparser.version>
<hibernate-quarkus-local-cache.version>0.3.0</hibernate-quarkus-local-cache.version>
<flapdoodle.mongo.version>4.12.0</flapdoodle.mongo.version>
<quarkus-spring-api.version>5.2.SP7</quarkus-spring-api.version>
Expand Down Expand Up @@ -1636,62 +1636,62 @@
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client</artifactId>
<artifactId>quarkus-rest-client-config</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-deployment</artifactId>
<artifactId>quarkus-rest-client-config-deployment</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-config</artifactId>
<artifactId>quarkus-resteasy-client</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-config-deployment</artifactId>
<artifactId>quarkus-resteasy-client-deployment</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-jackson</artifactId>
<artifactId>quarkus-resteasy-client-jackson</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-jackson-deployment</artifactId>
<artifactId>quarkus-resteasy-client-jackson-deployment</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-jaxb</artifactId>
<artifactId>quarkus-resteasy-client-jaxb</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-jaxb-deployment</artifactId>
<artifactId>quarkus-resteasy-client-jaxb-deployment</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-jsonb</artifactId>
<artifactId>quarkus-resteasy-client-jsonb</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-jsonb-deployment</artifactId>
<artifactId>quarkus-resteasy-client-jsonb-deployment</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-mutiny</artifactId>
<artifactId>quarkus-resteasy-client-mutiny</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-mutiny-deployment</artifactId>
<artifactId>quarkus-resteasy-client-mutiny-deployment</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
Expand Down Expand Up @@ -6228,6 +6228,56 @@
<artifactId>quarkus-smallrye-opentracing-deployment</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-deployment</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-jackson</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-jackson-deployment</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-jaxb</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-jaxb-deployment</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-jsonb</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-jsonb-deployment</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-mutiny</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-mutiny-deployment</artifactId>
<version>${project.version}</version>
</dependency>
<!-- End of Relocations, please put new extensions above this list -->

</dependencies>
Expand Down
4 changes: 2 additions & 2 deletions build-parent/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@

<asciidoctorj.version>2.5.11</asciidoctorj.version>
<htmlunit.version>2.70.0</htmlunit.version>
<javaparser-core.version>3.25.6</javaparser-core.version>
<javaparser-core.version>3.25.8</javaparser-core.version>
<jdeparser.version>2.0.3.Final</jdeparser.version>
<subethasmtp.version>6.0.1</subethasmtp.version>

Expand Down Expand Up @@ -111,7 +111,7 @@

<unboundid-ldap.version>6.0.11</unboundid-ldap.version>

<assertj.version>3.24.2</assertj.version>
<assertj.version>3.25.1</assertj.version>

<wiremock.version>3.3.1</wiremock.version>
<wiremock-maven-plugin.version>7.3.0</wiremock-maven-plugin.version>
Expand Down
Loading

0 comments on commit c4c141c

Please sign in to comment.