=== Upgrading from 2.x to 3.x
You will find here notes/tips about how to migrate from 2.x to 3.x.

[NOTE]
=====
This is a **work in progress** document, if something is wrong or missing please https://github.com/jooby-project/jooby/issues/new[report to Github] or better https://github.com/jooby-project/jooby/edit/3.x/docs/asciidoc/migration.adoc[edit this file and fix it]
=====

==== Requirements

- Java 17 as minimum

==== module-info.java

Jooby is now compatible with Java Module system.

Almost all Jooby components are now Java Modules, but not all them. For those where wasn't
possible the Jooby module contains the `Automatic-Module-Name` manifest entry.

==== Kotlin

Kotlin was removed from core, you need to the `jooby-kotlin` dependency:

[dependency, artifactId="jooby-kotlin"]
.

==== jakarta

|===
|2.x|3.x
|javax.servlet | jakarta.servlet
|javax.inject  | jakarta.inject
|javax.persistence  | jakarta.persistence
|===

==== Modules
|===
|2.x|3.x
|jooby-kotlin| Added
|jooby-weld| Removed
|jooby-archetype| Removed
|jooby-utow | Renamed: jooby-undertow
|jooby-commons-email | Renamed: jooby-commons-mail
|jooby-http2-jetty | Merged into: jooby-netty
|jooby-http2-netty | Merged into: jooby-netty
|jooby-http2-undertow | Merged into: jooby-undertow
|===

==== Package renames
|===
|2.x|3.x|Module
|io.jooby.annotations| io.jooby.annotation | jooby (core)
|io.jooby | io.jooby.test | jooby-test
|io.jooby (Kotlin)| io.jooby.kt | removed from jooby, now in jooby-kotlin
|io.jooby.graphql| io.jooby.graphiql | jooby-graphiql
|io.jooby.graphql| io.jooby.graphql.playground | jooby-graphql-playground
|io.jooby.json| io.jooby.gson | jooby-gson
|io.jooby.json| io.jooby.jackson | jooby-jackson
|io.jooby.di| io.jooby.guice | jooby-guice
|io.jooby.di| io.jooby.spring | jooby-spring
|io.jooby.aws| io.jooby.awssdkv1| jooby-awssdk-v1
|io.jooby.email| io.jooby.commons.mail| jooby-commons-mail
|io.jooby.utow|io.jooby.undertow| jooby-undertow
|===

==== Class renames
[cols="1,1,2"]
|===
|2.x|3.x|Module
|io.jooby.Route.Decorator| jooby (core) |io.jooby.Route.Filter
|io.jooby.Kooby|io.jooby.kt.Kooby| jooby-kotlin (new module)
|io.jooby.jetty.Jetty|io.jooby.jetty.JettyServer| jooby-jetty
|io.jooby.netty.Netty|io.jooby.netty.NettyServer| jooby-netty
|io.jooby.utow.Utow|io.jooby.undertow.UndertowServer| jooby-undertow
|io.jooby.AccessLogHandler|io.jooby.handler.AccessLogHandler| jooby (core)
|io.jooby.Cors|io.jooby.handler.Cors| jooby (core)
|io.jooby.CorsHandler|io.jooby.handler.CorsHandler| jooby (core)
|io.jooby.CsrfHandler|io.jooby.handler.CsrfHandler| jooby (core)
|io.jooby.HeadHandler|io.jooby.handler.HeadHandler| jooby (core)
|io.jooby.RateLimitHandler|io.jooby.handler.RateLimitHandler| jooby (core)
|io.jooby.SSLHandler|io.jooby.handler.SSLHandler| jooby (core)
|io.jooby.TraceHandler|io.jooby.handler.TraceHandler| jooby (core)
|io.jooby.WebVariables|io.jooby.handler.WebVariables| jooby (core)
|io.jooby.Asset|io.jooby.handler.Asset| jooby (core)
|io.jooby.AssetHandler|io.jooby.handler.AssetHandler| jooby (core)
|io.jooby.AssetSource|io.jooby.handler.AssetSource| jooby (core)
|io.jooby.CacheControl|io.jooby.handler.CacheControl| jooby (core)
|===

==== Method renames
[cols="1,1,2"]
|===
|2.x|3.x|Description
|Router.decorator(Decorator)|Router.use(Filter)| `decorator` has been deprecated in favor of `use`
|SslOptions.setCert(String)|SslOptions.setCert(InputStream)| Replaced the string argument with `InputStream`
|SslOptions.setTrustCert(String)|SslOptions.setTrustCert(InputStream)| Replaced the string argument with `InputStream`
|SslOptions.setPrivateKey(String)|SslOptions.setPrivateKey(InputStream)| Replaced the string argument with `InputStream`
|FileUpload.destroy|FileUpload.close| `destroy` has been replaced by `close`
|Context.attribute(String)|Context.getAttribute(String)|
|Context.attribute(String, Object)|Context.setAttribute(String, Object)|
|Context.multipart*|Context.form*| All Context.multipart related methods where merged into Context.form
|Context.query<Type>()|Context.query(Type::class)| Kotlin
|Context.form<Type>()|Context.form(Type::class)| Kotlin
|Context.body<Type>()|Context.body(Type::class)| Kotlin
|===

==== Dependencies
|===
|2.x|3.x|Module
|Slf4j 1.x|Slf4j 2.x| jooby (core)
|Jetty 9.x|Jetty 11.x| jooby-jetty
|Guice 5.x|Guice 7.x| jooby-guice
|===

==== Reactive support

Reactive libraries has been removed from core to his own module.

|===
|2.x|3.x
|rxjava|jooby-rxjava3
|reactor|jooby-reactor
|===

All reactive libraries requires explicit handler while using script/lambda routes. More details on link:{uiVersion}/#responses-nonblocking[NonBlocking] responses.
