[[promote-jvm-to-native]]
= Promote JVM extension to Native
:page-aliases: promote-jvm-to-native.adoc

The directory `extensions-jvm` contains extensions that have not been tested in
link:https://quarkus.io/guides/building-native-image[native mode] yet. Configuring the
link:https://quarkus.io/guides/writing-native-applications-tips[native build] and implementing integration tests for
them may open the door to even faster startup and lower memory footprint.
Please find some guiding steps below to start this quest:

1. Make sure that nobody else works on promoting the same extension by searching through the
   https://github.com/apache/camel-quarkus/issues[GitHub issues].

2. Let others know that you work on promoting the given extension by either creating a
   https://github.com/apache/camel-quarkus/issues/new[new issue] or asking to assign an existing one to you.

3. Use the `promote` mojo of `cq-maven-plugin` to perform the automatable steps:
+
[source,shell]
----
$ cd camel-quarkus
$ mvn -N cq:promote -Dcq.artifactIdBase=...
----
+
where `cq.artifactIdBase` needs to be set to the unique part of the `artifactId` of the extension you are
promoting. E.g. if you are promoting an extension with `artifactId` `camel-quarkus-foo`, you need to set
`-Dcq.artifactIdBase=foo`.
+
The `promote` mojo does the following for you:
+
* Copies the test module from `extensions-jvm/foo/integration-test` to `integration-tests/foo`
* Adjusts the `name` and `artifactId` of the test module
* Adds `native` profile to the test module
* Creates a native test class extending the existing JVM mode test class
* Copies the rest of the extension code from `extensions-jvm/foo` to `extensions/foo`
* Removes the warning build step from the processor class in the deployment module

4. Assign the integration test to an existing or new test category in `tooling/scripts/test-categories.yaml` so that
   it gets executed by the CI.

5. Add some meaningful tests to `FooTest` and make sure they pass in both JVM and native mode:
+
[source,shell]
----
$ cd integration-tests/foo
$ mvn clean verify -Pnative
----
+
Consider shifting some tasks from runtime to build time.
The https://quarkus.io/guides/extension-authors-guide[Quarkus extension author's guide] may be a good ally for this.

6. Unify source files format, update docs and rebuild the whole project:
+
[source,shell]
----
$ mvn clean install -DskipTests -Pformat
----

7. Squash your commits before sending a pull request.

Good luck!
