You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pp...@apache.org on 2021/02/23 15:07:19 UTC

[camel-quarkus] branch master updated (6966fb6 -> 2e8c328)

This is an automated email from the ASF dual-hosted git repository.

ppalaga pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git.


    from 6966fb6  Improve the release guide
     new 7cb869c  Freemarker native support #223
     new 2e8c328  One more azure EventHubs test fixup

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../pages/reference/extensions/freemarker.adoc     | 101 ++++++++++++++++++++-
 .../partials/reference/components/freemarker.adoc  |   6 +-
 extensions-jvm/freemarker/integration-test/pom.xml |  83 -----------------
 extensions-jvm/pom.xml                             |   1 -
 .../freemarker/deployment/pom.xml                  |   4 +
 .../freemarker/deployment/FreemarkerProcessor.java |  23 +++--
 {extensions-jvm => extensions}/freemarker/pom.xml  |   1 -
 .../freemarker/runtime/pom.xml                     |  11 +++
 .../runtime/src/main/doc/configuration.adoc        |  84 +++++++++++++++++
 .../freemarker/CamelFreemarkerRecorder.java}       |  16 ++--
 .../main/resources/META-INF/quarkus-extension.yaml |   3 +-
 extensions/pom.xml                                 |   1 +
 integration-tests/azure-eventhubs/pom.xml          |  13 +++
 integration-tests/{jolt => freemarker}/pom.xml     |  11 +--
 .../freemarker/it/FreemarkerResource.java          |  52 ++++-------
 .../quarkus/component/freemarker/it/MyPerson.java  |   0
 .../src/main/resources/AppleTemplate.ftl           |   0
 .../src/main/resources/application.properties      |   3 +-
 .../subfolder/templates/BodyAsDomainObject.ftl     |   0
 .../apache/camel/component/freemarker/example.ftl  |   0
 .../component/freemarker/it/FreemarkerIT.java}     |   4 +-
 .../component/freemarker/it/FreemarkerTest.java    |  19 ++--
 integration-tests/pom.xml                          |   1 +
 pom.xml                                            |   3 +-
 poms/bom/pom.xml                                   |  10 ++
 tooling/scripts/test-categories.yaml               |   1 +
 26 files changed, 285 insertions(+), 166 deletions(-)
 delete mode 100644 extensions-jvm/freemarker/integration-test/pom.xml
 rename {extensions-jvm => extensions}/freemarker/deployment/pom.xml (93%)
 rename {extensions-jvm => extensions}/freemarker/deployment/src/main/java/org/apache/camel/quarkus/component/freemarker/deployment/FreemarkerProcessor.java (66%)
 rename {extensions-jvm => extensions}/freemarker/pom.xml (97%)
 rename {extensions-jvm => extensions}/freemarker/runtime/pom.xml (89%)
 create mode 100644 extensions/freemarker/runtime/src/main/doc/configuration.adoc
 copy extensions/{qute/runtime/src/main/java/org/apache/camel/quarkus/component/qute/CamelQuteRecorder.java => freemarker/runtime/src/main/java/org/apache/camel/quarkus/component/freemarker/CamelFreemarkerRecorder.java} (66%)
 rename {extensions-jvm => extensions}/freemarker/runtime/src/main/resources/META-INF/quarkus-extension.yaml (97%)
 copy integration-tests/{jolt => freemarker}/pom.xml (91%)
 rename {extensions-jvm/freemarker/integration-test => integration-tests/freemarker}/src/main/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerResource.java (68%)
 rename {extensions-jvm/freemarker/integration-test => integration-tests/freemarker}/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java (100%)
 rename {extensions-jvm/freemarker/integration-test => integration-tests/freemarker}/src/main/resources/AppleTemplate.ftl (100%)
 rename {extensions-jvm/freemarker/integration-test => integration-tests/freemarker}/src/main/resources/application.properties (95%)
 rename {extensions-jvm/freemarker/integration-test => integration-tests/freemarker}/src/main/resources/folder/subfolder/templates/BodyAsDomainObject.ftl (100%)
 rename {extensions-jvm/freemarker/integration-test => integration-tests/freemarker}/src/main/resources/org/apache/camel/component/freemarker/example.ftl (100%)
 copy integration-tests/{arangodb/src/test/java/org/apache/camel/quarkus/component/arangodb/it/ArangodbIT.java => freemarker/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerIT.java} (89%)
 rename {extensions-jvm/freemarker/integration-test => integration-tests/freemarker}/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerTest.java (85%)


[camel-quarkus] 02/02: One more azure EventHubs test fixup

Posted by pp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ppalaga pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git

commit 2e8c328db78d54ddf64c8382b7e8dea5487ad690
Author: Peter Palaga <pp...@redhat.com>
AuthorDate: Tue Feb 23 15:56:27 2021 +0100

    One more azure EventHubs test fixup
---
 integration-tests/azure-eventhubs/pom.xml | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/integration-tests/azure-eventhubs/pom.xml b/integration-tests/azure-eventhubs/pom.xml
index 5f3b50a..b2baee0 100644
--- a/integration-tests/azure-eventhubs/pom.xml
+++ b/integration-tests/azure-eventhubs/pom.xml
@@ -119,6 +119,19 @@
                 </exclusion>
             </exclusions>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-mock-deployment</artifactId>
+            <version>${project.version}</version>
+            <type>pom</type>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>*</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
     </dependencies>
 
     <profiles>


[camel-quarkus] 01/02: Freemarker native support #223

Posted by pp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ppalaga pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git

commit 7cb869c21297d6cf6ffa2f53ee1782f39c6af88d
Author: Peter Palaga <pp...@redhat.com>
AuthorDate: Fri Jan 29 17:15:36 2021 +0100

    Freemarker native support #223
---
 .../pages/reference/extensions/freemarker.adoc     | 101 ++++++++++++++++++++-
 .../partials/reference/components/freemarker.adoc  |   6 +-
 extensions-jvm/pom.xml                             |   1 -
 .../freemarker/deployment/pom.xml                  |   4 +
 .../freemarker/deployment/FreemarkerProcessor.java |  23 +++--
 {extensions-jvm => extensions}/freemarker/pom.xml  |   1 -
 .../freemarker/runtime/pom.xml                     |  11 +++
 .../runtime/src/main/doc/configuration.adoc        |  84 +++++++++++++++++
 .../freemarker/CamelFreemarkerRecorder.java        |  38 +++-----
 .../main/resources/META-INF/quarkus-extension.yaml |   3 +-
 extensions/pom.xml                                 |   1 +
 .../freemarker}/pom.xml                            |  38 +++++++-
 .../freemarker/it/FreemarkerResource.java          |  52 ++++-------
 .../quarkus/component/freemarker/it/MyPerson.java  |   0
 .../src/main/resources/AppleTemplate.ftl           |   0
 .../src/main/resources/application.properties      |   3 +-
 .../subfolder/templates/BodyAsDomainObject.ftl     |   0
 .../apache/camel/component/freemarker/example.ftl  |   0
 .../component/freemarker/it/FreemarkerIT.java      |  30 +-----
 .../component/freemarker/it/FreemarkerTest.java    |  19 ++--
 integration-tests/pom.xml                          |   1 +
 pom.xml                                            |   3 +-
 poms/bom/pom.xml                                   |  10 ++
 tooling/scripts/test-categories.yaml               |   1 +
 24 files changed, 307 insertions(+), 123 deletions(-)

diff --git a/docs/modules/ROOT/pages/reference/extensions/freemarker.adoc b/docs/modules/ROOT/pages/reference/extensions/freemarker.adoc
index d1c1e20..264080e 100644
--- a/docs/modules/ROOT/pages/reference/extensions/freemarker.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/freemarker.adoc
@@ -2,15 +2,15 @@
 // This file was generated by camel-quarkus-maven-plugin:update-extension-doc-page
 = Freemarker
 :cq-artifact-id: camel-quarkus-freemarker
-:cq-native-supported: false
-:cq-status: Preview
+:cq-native-supported: true
+:cq-status: Stable
 :cq-description: Transform messages using FreeMarker templates.
 :cq-deprecated: false
 :cq-jvm-since: 1.1.0
-:cq-native-since: n/a
+:cq-native-since: 1.8.0
 
 [.badges]
-[.badge-key]##JVM since##[.badge-supported]##1.1.0## [.badge-key]##Native##[.badge-unsupported]##unsupported##
+[.badge-key]##JVM since##[.badge-supported]##1.1.0## [.badge-key]##Native since##[.badge-supported]##1.8.0##
 
 Transform messages using FreeMarker templates.
 
@@ -31,3 +31,96 @@ Please refer to the above link for usage and configuration details.
 ----
 
 Check the xref:user-guide/index.adoc[User guide] for more information about writing Camel Quarkus applications.
+
+== allowContextMapAll option in native mode
+
+The `allowContextMapAll` option is not supported in native mode as it requires reflective access to security sensitive camel core classes such as
+`CamelContext` & `Exchange`. This is considered a security risk and thus access to the feature is not provided by default.
+
+== Additional Camel Quarkus configuration
+
+== Class path resources
+
+For the FreeMarker templates loaded from class path to work flawlessly in native mode, you need to list all your
+template files using `quarkus.native.resources.includes` and `quarkus.native.resources.excludes`
+options in `application.properties`.
+
+Here is an example: If your application's resources look like this
+
+[source,shell]
+----
+$ tree src/main/resources
+src/main/resources
+└── templates
+    ├── email.ftl
+    ├── page.html
+    └── unwanted-file.txt
+----
+
+and if your configuration is like this
+
+[source,properties]
+----
+quarkus.native.resources.includes = templates/*.ftl,templates/*.html
+quarkus.native.resources.excludes = templates/unwanted*
+----
+
+then, resources `templates/email.ftl` and `templates/page.ftl` will be available in the native image,
+while file `unwanted-file.txt` will not be available.
+
+You can thus use the available templates in a Camel route, e.g.:
+
+[source,java]
+----
+public class MyRoutes extends RouteBuilder {
+    @Override
+    public void configure() {
+        from("direct:example")
+            .to("freemarker:templates/email.ftl")
+    }
+}
+----
+
+== Quarkiverse Freemarker and its configuration
+
+Camel Quarkus Freemarker uses dev/index.html[Quarkiverse Freemarker] under the hood.
+This means in particular, that the `freemarker.template.Configuration` bean produced by Quarkiverse Freemarker
+is used by Camel Quarkus.
+The bean can be configured via `quarkus.freemarker.*` properties
+- check https://quarkiverse.github.io/quarkiverse-docs/quarkiverse-freemarker/dev/index.html[Freemarker Configuration Reference]
+for more details.
+
+If you wish to use your custom `Configuration` bean instead of the default provided by Quarkiverse Freemarker,
+you can let CDI to do the required wiring:
+
+[source,java]
+----
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Produces;
+import javax.inject.Named;
+import freemarker.template.Configuration;
+import io.quarkus.arc.Unremovable;
+import org.apache.camel.builder.RouteBuilder;
+
+@ApplicationScoped
+public class MyRoutes extends RouteBuilder {
+
+    @Produces
+    @ApplicationScoped
+    @Unremovable
+    @Named("myFreemarkerConfig")
+    Configuration produceFreemarkerConfig() {
+        Configuration result = new Configuration();
+        ...
+        return result;
+    }
+
+    @Override
+    public void configure() {
+        from("direct:example")
+            .to("freemarker:templates/email.ftl?configuration=myFreemarkerConfig")
+
+    }
+}
+----
+
diff --git a/docs/modules/ROOT/partials/reference/components/freemarker.adoc b/docs/modules/ROOT/partials/reference/components/freemarker.adoc
index 5c7f4c9..d2038c6 100644
--- a/docs/modules/ROOT/partials/reference/components/freemarker.adoc
+++ b/docs/modules/ROOT/partials/reference/components/freemarker.adoc
@@ -2,11 +2,11 @@
 // This file was generated by camel-quarkus-maven-plugin:update-extension-doc-page
 :cq-artifact-id: camel-quarkus-freemarker
 :cq-artifact-id-base: freemarker
-:cq-native-supported: false
-:cq-status: Preview
+:cq-native-supported: true
+:cq-status: Stable
 :cq-deprecated: false
 :cq-jvm-since: 1.1.0
-:cq-native-since: n/a
+:cq-native-since: 1.8.0
 :cq-camel-part-name: freemarker
 :cq-camel-part-title: Freemarker
 :cq-camel-part-description: Transform messages using FreeMarker templates.
diff --git a/extensions-jvm/pom.xml b/extensions-jvm/pom.xml
index 423f22c..994f12c 100644
--- a/extensions-jvm/pom.xml
+++ b/extensions-jvm/pom.xml
@@ -62,7 +62,6 @@
         <module>facebook</module>
         <module>fastjson</module>
         <module>flink</module>
-        <module>freemarker</module>
         <module>ganglia</module>
         <module>groovy</module>
         <module>guava-eventbus</module>
diff --git a/extensions-jvm/freemarker/deployment/pom.xml b/extensions/freemarker/deployment/pom.xml
similarity index 93%
rename from extensions-jvm/freemarker/deployment/pom.xml
rename to extensions/freemarker/deployment/pom.xml
index e471d94..ae701fd 100644
--- a/extensions-jvm/freemarker/deployment/pom.xml
+++ b/extensions/freemarker/deployment/pom.xml
@@ -35,6 +35,10 @@
             <artifactId>camel-quarkus-core-deployment</artifactId>
         </dependency>
         <dependency>
+            <groupId>io.quarkiverse.freemarker</groupId>
+            <artifactId>quarkus-freemarker-deployment</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-freemarker</artifactId>
         </dependency>
diff --git a/extensions-jvm/freemarker/deployment/src/main/java/org/apache/camel/quarkus/component/freemarker/deployment/FreemarkerProcessor.java b/extensions/freemarker/deployment/src/main/java/org/apache/camel/quarkus/component/freemarker/deployment/FreemarkerProcessor.java
similarity index 66%
rename from extensions-jvm/freemarker/deployment/src/main/java/org/apache/camel/quarkus/component/freemarker/deployment/FreemarkerProcessor.java
rename to extensions/freemarker/deployment/src/main/java/org/apache/camel/quarkus/component/freemarker/deployment/FreemarkerProcessor.java
index 1884a52..3faa3fa 100644
--- a/extensions-jvm/freemarker/deployment/src/main/java/org/apache/camel/quarkus/component/freemarker/deployment/FreemarkerProcessor.java
+++ b/extensions/freemarker/deployment/src/main/java/org/apache/camel/quarkus/component/freemarker/deployment/FreemarkerProcessor.java
@@ -16,17 +16,17 @@
  */
 package org.apache.camel.quarkus.component.freemarker.deployment;
 
+import io.quarkus.arc.deployment.BeanContainerBuildItem;
 import io.quarkus.deployment.annotations.BuildStep;
 import io.quarkus.deployment.annotations.ExecutionTime;
 import io.quarkus.deployment.annotations.Record;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
-import io.quarkus.deployment.pkg.steps.NativeBuild;
-import org.apache.camel.quarkus.core.JvmOnlyRecorder;
-import org.jboss.logging.Logger;
+import org.apache.camel.component.freemarker.FreemarkerComponent;
+import org.apache.camel.quarkus.component.freemarker.CamelFreemarkerRecorder;
+import org.apache.camel.quarkus.core.deployment.spi.CamelRuntimeBeanBuildItem;
 
 class FreemarkerProcessor {
 
-    private static final Logger LOG = Logger.getLogger(FreemarkerProcessor.class);
     private static final String FEATURE = "camel-freemarker";
 
     @BuildStep
@@ -34,13 +34,12 @@ class FreemarkerProcessor {
         return new FeatureBuildItem(FEATURE);
     }
 
-    /**
-     * Remove this once this extension starts supporting the native mode.
-     */
-    @BuildStep(onlyIf = NativeBuild.class)
-    @Record(value = ExecutionTime.RUNTIME_INIT)
-    void warnJvmInNative(JvmOnlyRecorder recorder) {
-        JvmOnlyRecorder.warnJvmInNative(LOG, FEATURE); // warn at build time
-        recorder.warnJvmInNative(FEATURE); // warn at runtime
+    @Record(ExecutionTime.RUNTIME_INIT)
+    @BuildStep
+    CamelRuntimeBeanBuildItem componentBean(CamelFreemarkerRecorder recorder, BeanContainerBuildItem beanContainer) {
+        return new CamelRuntimeBeanBuildItem(
+                "freemarker",
+                FreemarkerComponent.class.getName(),
+                recorder.createComponent(beanContainer.getValue()));
     }
 }
diff --git a/extensions-jvm/freemarker/pom.xml b/extensions/freemarker/pom.xml
similarity index 97%
rename from extensions-jvm/freemarker/pom.xml
rename to extensions/freemarker/pom.xml
index 8614c45..3616976 100644
--- a/extensions-jvm/freemarker/pom.xml
+++ b/extensions/freemarker/pom.xml
@@ -33,6 +33,5 @@
     <modules>
         <module>deployment</module>
         <module>runtime</module>
-        <module>integration-test</module>
     </modules>
 </project>
diff --git a/extensions-jvm/freemarker/runtime/pom.xml b/extensions/freemarker/runtime/pom.xml
similarity index 89%
rename from extensions-jvm/freemarker/runtime/pom.xml
rename to extensions/freemarker/runtime/pom.xml
index cabf4fd..483bb6e 100644
--- a/extensions-jvm/freemarker/runtime/pom.xml
+++ b/extensions/freemarker/runtime/pom.xml
@@ -32,6 +32,7 @@
 
     <properties>
         <camel.quarkus.jvmSince>1.1.0</camel.quarkus.jvmSince>
+        <camel.quarkus.nativeSince>1.8.0</camel.quarkus.nativeSince>
     </properties>
 
     <dependencyManagement>
@@ -52,8 +53,18 @@
             <artifactId>camel-quarkus-core</artifactId>
         </dependency>
         <dependency>
+            <groupId>io.quarkiverse.freemarker</groupId>
+            <artifactId>quarkus-freemarker</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-freemarker</artifactId>
+            <exclusions>
+                <exclusion><!-- We prefer the version pulled via quarkus-freemarker -->
+                    <groupId>org.freemarker</groupId>
+                    <artifactId>freemarker</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
     </dependencies>
 
diff --git a/extensions/freemarker/runtime/src/main/doc/configuration.adoc b/extensions/freemarker/runtime/src/main/doc/configuration.adoc
new file mode 100644
index 0000000..323fd41
--- /dev/null
+++ b/extensions/freemarker/runtime/src/main/doc/configuration.adoc
@@ -0,0 +1,84 @@
+== Class path resources
+
+For the FreeMarker templates loaded from class path to work flawlessly in native mode, you need to list all your
+template files using `quarkus.native.resources.includes` and `quarkus.native.resources.excludes`
+options in `application.properties`.
+
+Here is an example: If your application's resources look like this
+
+[source,shell]
+----
+$ tree src/main/resources
+src/main/resources
+└── templates
+    ├── email.ftl
+    ├── page.html
+    └── unwanted-file.txt
+----
+
+and if your configuration is like this
+
+[source,properties]
+----
+quarkus.native.resources.includes = templates/*.ftl,templates/*.html
+quarkus.native.resources.excludes = templates/unwanted*
+----
+
+then, resources `templates/email.ftl` and `templates/page.ftl` will be available in the native image,
+while file `unwanted-file.txt` will not be available.
+
+You can thus use the available templates in a Camel route, e.g.:
+
+[source,java]
+----
+public class MyRoutes extends RouteBuilder {
+    @Override
+    public void configure() {
+        from("direct:example")
+            .to("freemarker:templates/email.ftl")
+    }
+}
+----
+
+== Quarkiverse Freemarker and its configuration
+
+Camel Quarkus Freemarker uses dev/index.html[Quarkiverse Freemarker] under the hood.
+This means in particular, that the `freemarker.template.Configuration` bean produced by Quarkiverse Freemarker
+is used by Camel Quarkus.
+The bean can be configured via `quarkus.freemarker.*` properties
+- check https://quarkiverse.github.io/quarkiverse-docs/quarkiverse-freemarker/dev/index.html[Freemarker Configuration Reference]
+for more details.
+
+If you wish to use your custom `Configuration` bean instead of the default provided by Quarkiverse Freemarker,
+you can let CDI to do the required wiring:
+
+[source,java]
+----
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Produces;
+import javax.inject.Named;
+import freemarker.template.Configuration;
+import io.quarkus.arc.Unremovable;
+import org.apache.camel.builder.RouteBuilder;
+
+@ApplicationScoped
+public class MyRoutes extends RouteBuilder {
+
+    @Produces
+    @ApplicationScoped
+    @Unremovable
+    @Named("myFreemarkerConfig")
+    Configuration produceFreemarkerConfig() {
+        Configuration result = new Configuration();
+        ...
+        return result;
+    }
+
+    @Override
+    public void configure() {
+        from("direct:example")
+            .to("freemarker:templates/email.ftl?configuration=myFreemarkerConfig")
+
+    }
+}
+----
diff --git a/extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java b/extensions/freemarker/runtime/src/main/java/org/apache/camel/quarkus/component/freemarker/CamelFreemarkerRecorder.java
similarity index 52%
copy from extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java
copy to extensions/freemarker/runtime/src/main/java/org/apache/camel/quarkus/component/freemarker/CamelFreemarkerRecorder.java
index 1cf3731..67b01b1 100644
--- a/extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java
+++ b/extensions/freemarker/runtime/src/main/java/org/apache/camel/quarkus/component/freemarker/CamelFreemarkerRecorder.java
@@ -14,35 +14,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.freemarker.it;
+package org.apache.camel.quarkus.component.freemarker;
 
-import io.quarkus.runtime.annotations.RegisterForReflection;
+import freemarker.template.Configuration;
+import io.quarkus.arc.runtime.BeanContainer;
+import io.quarkus.runtime.RuntimeValue;
+import io.quarkus.runtime.annotations.Recorder;
+import org.apache.camel.component.freemarker.FreemarkerComponent;
 
-@RegisterForReflection
-public class MyPerson {
-    public MyPerson(String givenName, String familyName) {
-        this.givenName = givenName;
-        this.familyName = familyName;
-    }
-
-    private final String givenName;
-    private final String familyName;
+@Recorder
+public class CamelFreemarkerRecorder {
 
-    public String getGivenName() {
-        return givenName;
-    }
+    public RuntimeValue<FreemarkerComponent> createComponent(BeanContainer beanContainer) {
+        final Configuration configuration = beanContainer.instance(Configuration.class);
 
-    public String getFamilyName() {
-        return familyName;
-    }
+        final FreemarkerComponent component = new FreemarkerComponent();
+        component.setConfiguration(configuration);
 
-    @Override
-    public String toString() {
-        return "MyPerson{"
-                + "givenName='"
-                + givenName + '\''
-                + ", familyName='"
-                + familyName + '\''
-                + '}';
+        return new RuntimeValue<>(component);
     }
 }
diff --git a/extensions-jvm/freemarker/runtime/src/main/resources/META-INF/quarkus-extension.yaml b/extensions/freemarker/runtime/src/main/resources/META-INF/quarkus-extension.yaml
similarity index 97%
rename from extensions-jvm/freemarker/runtime/src/main/resources/META-INF/quarkus-extension.yaml
rename to extensions/freemarker/runtime/src/main/resources/META-INF/quarkus-extension.yaml
index 8f8698f..51fd8fe 100644
--- a/extensions-jvm/freemarker/runtime/src/main/resources/META-INF/quarkus-extension.yaml
+++ b/extensions/freemarker/runtime/src/main/resources/META-INF/quarkus-extension.yaml
@@ -24,9 +24,8 @@
 name: "Camel Freemarker"
 description: "Transform messages using FreeMarker templates"
 metadata:
-  unlisted: true
   guide: "https://camel.apache.org/camel-quarkus/latest/reference/extensions/freemarker.html"
   categories:
   - "integration"
   status:
-  - "preview"
+  - "stable"
diff --git a/extensions/pom.xml b/extensions/pom.xml
index ed82c5b..467ea84 100644
--- a/extensions/pom.xml
+++ b/extensions/pom.xml
@@ -115,6 +115,7 @@
         <module>file-watch</module>
         <module>flatpack</module>
         <module>fop</module>
+        <module>freemarker</module>
         <module>ftp</module>
         <module>geocoder</module>
         <module>git</module>
diff --git a/extensions-jvm/freemarker/integration-test/pom.xml b/integration-tests/freemarker/pom.xml
similarity index 71%
rename from extensions-jvm/freemarker/integration-test/pom.xml
rename to integration-tests/freemarker/pom.xml
index 7fb0c80..ec0c3cf 100644
--- a/extensions-jvm/freemarker/integration-test/pom.xml
+++ b/integration-tests/freemarker/pom.xml
@@ -21,13 +21,13 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.camel.quarkus</groupId>
-        <artifactId>camel-quarkus-build-parent-it</artifactId>
+        <artifactId>camel-quarkus-integration-tests</artifactId>
         <version>1.8.0-SNAPSHOT</version>
-        <relativePath>../../../poms/build-parent-it/pom.xml</relativePath>
+        <relativePath>../pom.xml</relativePath>
     </parent>
 
-    <artifactId>camel-quarkus-freemarker-integration-test</artifactId>
-    <name>Camel Quarkus :: Freemarker :: Integration Test</name>
+    <artifactId>camel-quarkus-integration-test-freemarker</artifactId>
+    <name>Camel Quarkus :: Integration Tests :: Freemarker</name>
     <description>Integration tests for Camel Quarkus Freemarker extension</description>
 
     <dependencyManagement>
@@ -80,4 +80,34 @@
         </dependency>
     </dependencies>
 
+    <profiles>
+        <profile>
+            <id>native</id>
+            <activation>
+                <property>
+                    <name>native</name>
+                </property>
+            </activation>
+            <properties>
+                <quarkus.package.type>native</quarkus.package.type>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-failsafe-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <goal>integration-test</goal>
+                                    <goal>verify</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
 </project>
diff --git a/extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerResource.java b/integration-tests/freemarker/src/main/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerResource.java
similarity index 68%
rename from extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerResource.java
rename to integration-tests/freemarker/src/main/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerResource.java
index d24527b..1ca1c9e 100644
--- a/extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerResource.java
+++ b/integration-tests/freemarker/src/main/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerResource.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.quarkus.component.freemarker.it;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -64,20 +65,16 @@ public class FreemarkerResource {
     @Produces(MediaType.TEXT_PLAIN)
     public String freemarkerDataModel() throws Exception {
         return producerTemplate.request(
-                "freemarker:org/apache/camel/component/freemarker/example.ftl?allowTemplateFromHeader=true&allowContextMapAll=true",
+                "freemarker:org/apache/camel/component/freemarker/example.ftl?allowTemplateFromHeader=true",
                 new Processor() {
                     @Override
                     public void process(Exchange exchange) throws Exception {
-                        exchange.getIn().setBody("");
-                        exchange.getIn().setHeader("name", "Christian");
-                        Map<String, Object> variableMap = new HashMap<>();
-                        Map<String, Object> headersMap = new HashMap<>();
-                        headersMap.put("name", "Willem");
-                        variableMap.put("headers", headersMap);
-                        variableMap.put("body", "Monday");
-                        variableMap.put("exchange", exchange);
-                        exchange.getIn().setHeader(FreemarkerConstants.FREEMARKER_DATA_MODEL, variableMap);
-                        exchange.setProperty("item", "7");
+                        final Map<String, Object> model = new HashMap<>();
+                        model.put("headers", Collections.singletonMap("name", "Willem"));
+                        model.put("body", "Monday");
+                        model.put("exchange",
+                                Collections.singletonMap("properties", Collections.singletonMap("item", "7")));
+                        exchange.getIn().setHeader(FreemarkerConstants.FREEMARKER_DATA_MODEL, model);
                     }
                 })
                 .getMessage().getBody(String.class);
@@ -102,13 +99,14 @@ public class FreemarkerResource {
 
     @Path("/templateInHeader")
     @POST
-    @Consumes(MediaType.APPLICATION_JSON)
+    @Consumes(MediaType.TEXT_PLAIN)
     @Produces(MediaType.TEXT_PLAIN)
-    public String templateInHeader() throws Exception {
-        final Map<String, Object> headers = new HashMap<>();
-        headers.put(FreemarkerConstants.FREEMARKER_TEMPLATE, "<hello>${headers.cheese}</hello>");
-        headers.put("cheese", "foo");
-        return producerTemplate.requestBodyAndHeaders("freemarker://dummy?allowContextMapAll=true", headers, null,
+    public String templateInHeader(String body) throws Exception {
+        return producerTemplate.requestBodyAndHeader(
+                "freemarker://dummy?allowTemplateFromHeader=true",
+                body,
+                FreemarkerConstants.FREEMARKER_TEMPLATE,
+                "Hello ${body}!",
                 String.class);
     }
 
@@ -118,26 +116,10 @@ public class FreemarkerResource {
     @Produces(MediaType.TEXT_PLAIN)
     public String bodyAsDomainObject(@PathParam("firstName") String firstName, @PathParam("lastName") String lastName)
             throws Exception {
-        return producerTemplate.requestBody("freemarker:folder/subfolder/templates/BodyAsDomainObject.ftl",
+        return producerTemplate.requestBody(
+                "freemarker:folder/subfolder/templates/BodyAsDomainObject.ftl",
                 new MyPerson(firstName, lastName),
                 String.class);
     }
 
-    @Path("/apple")
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.TEXT_PLAIN)
-    public String apple() throws Exception {
-        return producerTemplate
-                .request("freemarker:AppleTemplate.ftl?allowContextMapAll=true", new Processor() {
-                    @Override
-                    public void process(Exchange exchange) throws Exception {
-                        exchange.getIn().setBody("Orange");
-                        exchange.getIn().setHeader("color", "orange");
-                        exchange.setProperty("price", "7");
-                    }
-                })
-                .getMessage().getBody(String.class);
-    }
-
 }
diff --git a/extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java b/integration-tests/freemarker/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java
similarity index 100%
copy from extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java
copy to integration-tests/freemarker/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java
diff --git a/extensions-jvm/freemarker/integration-test/src/main/resources/AppleTemplate.ftl b/integration-tests/freemarker/src/main/resources/AppleTemplate.ftl
similarity index 100%
rename from extensions-jvm/freemarker/integration-test/src/main/resources/AppleTemplate.ftl
rename to integration-tests/freemarker/src/main/resources/AppleTemplate.ftl
diff --git a/extensions-jvm/freemarker/integration-test/src/main/resources/application.properties b/integration-tests/freemarker/src/main/resources/application.properties
similarity index 95%
rename from extensions-jvm/freemarker/integration-test/src/main/resources/application.properties
rename to integration-tests/freemarker/src/main/resources/application.properties
index 5e200d3..db92578 100644
--- a/extensions-jvm/freemarker/integration-test/src/main/resources/application.properties
+++ b/integration-tests/freemarker/src/main/resources/application.properties
@@ -17,5 +17,6 @@
 #
 # Quarkus
 #
-quarkus.freemarker.resource-paths=classpath:
 quarkus.freemarker.default-encoding=UTF-8
+
+quarkus.freemarker.includes=**.ftl
diff --git a/extensions-jvm/freemarker/integration-test/src/main/resources/folder/subfolder/templates/BodyAsDomainObject.ftl b/integration-tests/freemarker/src/main/resources/folder/subfolder/templates/BodyAsDomainObject.ftl
similarity index 100%
rename from extensions-jvm/freemarker/integration-test/src/main/resources/folder/subfolder/templates/BodyAsDomainObject.ftl
rename to integration-tests/freemarker/src/main/resources/folder/subfolder/templates/BodyAsDomainObject.ftl
diff --git a/extensions-jvm/freemarker/integration-test/src/main/resources/org/apache/camel/component/freemarker/example.ftl b/integration-tests/freemarker/src/main/resources/org/apache/camel/component/freemarker/example.ftl
similarity index 100%
rename from extensions-jvm/freemarker/integration-test/src/main/resources/org/apache/camel/component/freemarker/example.ftl
rename to integration-tests/freemarker/src/main/resources/org/apache/camel/component/freemarker/example.ftl
diff --git a/extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java b/integration-tests/freemarker/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerIT.java
similarity index 55%
rename from extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java
rename to integration-tests/freemarker/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerIT.java
index 1cf3731..69a2c75 100644
--- a/extensions-jvm/freemarker/integration-test/src/main/java/org/apache/camel/quarkus/component/freemarker/it/MyPerson.java
+++ b/integration-tests/freemarker/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerIT.java
@@ -16,33 +16,9 @@
  */
 package org.apache.camel.quarkus.component.freemarker.it;
 
-import io.quarkus.runtime.annotations.RegisterForReflection;
+import io.quarkus.test.junit.NativeImageTest;
 
-@RegisterForReflection
-public class MyPerson {
-    public MyPerson(String givenName, String familyName) {
-        this.givenName = givenName;
-        this.familyName = familyName;
-    }
+@NativeImageTest
+class FreemarkerIT extends FreemarkerTest {
 
-    private final String givenName;
-    private final String familyName;
-
-    public String getGivenName() {
-        return givenName;
-    }
-
-    public String getFamilyName() {
-        return familyName;
-    }
-
-    @Override
-    public String toString() {
-        return "MyPerson{"
-                + "givenName='"
-                + givenName + '\''
-                + ", familyName='"
-                + familyName + '\''
-                + '}';
-    }
 }
diff --git a/extensions-jvm/freemarker/integration-test/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerTest.java b/integration-tests/freemarker/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerTest.java
similarity index 85%
rename from extensions-jvm/freemarker/integration-test/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerTest.java
rename to integration-tests/freemarker/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerTest.java
index 4cb258f..5af38d4 100644
--- a/extensions-jvm/freemarker/integration-test/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerTest.java
+++ b/integration-tests/freemarker/src/test/java/org/apache/camel/quarkus/component/freemarker/it/FreemarkerTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.quarkus.component.freemarker.it;
 
+import io.quarkus.test.junit.DisabledOnNativeImage;
 import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
 import io.restassured.http.ContentType;
@@ -27,6 +28,7 @@ import static org.hamcrest.Matchers.equalTo;
 class FreemarkerTest {
 
     @Test
+    @DisabledOnNativeImage // requires allowContextMapAll=true which is unsupported in native mode
     public void freemarkerLetter() {
         RestAssured.given()
                 .contentType(ContentType.JSON)
@@ -49,6 +51,7 @@ class FreemarkerTest {
     }
 
     @Test
+    @DisabledOnNativeImage // requires allowContextMapAll=true which is unsupported in native mode
     public void valuesInProperties() {
         RestAssured.given()
                 .contentType(ContentType.JSON)
@@ -60,23 +63,25 @@ class FreemarkerTest {
     }
 
     @Test
-    public void bodyAsDomainObject() {
+    public void templateInHeader() {
         RestAssured.given()
+                .contentType(ContentType.TEXT)
                 .accept(ContentType.TEXT)
-                .get("/freemarker/bodyAsDomainObject/{firstName}/{lastName}", "Claus", "Ibsen")
+                .body("Kermit")
+                .post("/freemarker/templateInHeader")
                 .then()
                 .statusCode(200)
-                .body(equalTo("Hi Claus how are you? Its a nice day.\nGive my regards to the family Ibsen."));
+                .body(equalTo("Hello Kermit!"));
     }
 
     @Test
-    public void apple() {
+    public void bodyAsDomainObject() {
         RestAssured.given()
-                .contentType(ContentType.JSON)
                 .accept(ContentType.TEXT)
-                .post("/freemarker/apple")
+                .get("/freemarker/bodyAsDomainObject/{firstName}/{lastName}", "Claus", "Ibsen")
                 .then()
                 .statusCode(200)
-                .body(equalTo("I am a Orange whose color is orange. I cost 7."));
+                .body(equalTo("Hi Claus how are you? Its a nice day.\nGive my regards to the family Ibsen."));
     }
+
 }
diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index 8812ae7..5b4c436 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -102,6 +102,7 @@
         <module>flatpack</module>
         <module>fop</module>
         <module>foundation</module>
+        <module>freemarker</module>
         <module>ftp</module>
         <module>geocoder</module>
         <module>git</module>
diff --git a/pom.xml b/pom.xml
index 6e78ba3..cd1525c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -69,7 +69,7 @@
         <debezium.version>1.4.0.Final</debezium.version>
         <derby.version>10.15.2.0</derby.version><!-- Spark -->
         <eddsa.version>0.3.0</eddsa.version>
-        <freemarker.version>2.3.30</freemarker.version>
+        <freemarker.version>2.3.31</freemarker.version><!-- keep in sync with quarkiverse.freemarker.version -->
         <fommil.netlib.core.version>1.1.2</fommil.netlib.core.version><!-- Mess in Weka transitive deps -->
         <jodatime.version>2.10.6</jodatime.version><!-- Mess in transitive dependencies of Spark and Splunk -->
         <github-api.version>1.111</github-api.version>
@@ -103,6 +103,7 @@
         <okhttp.version>${squareup-okhttp-version}</okhttp.version><!-- keep in sync with okio -->
         <okio.version>${squareup-okio-version}</okio.version><!-- keep in sync with okhttp -->
         <optaplanner.version>7.46.0.Final</optaplanner.version>
+        <quarkiverse.freemarker.version>0.2.2</quarkiverse.freemarker.version>
         <quarkiverse-minio.version>0.2.0</quarkiverse-minio.version>
         <quarkus.version>1.12.0.Final</quarkus.version>
         <quarkus-google-cloud.version>0.3.0</quarkus-google-cloud.version>
diff --git a/poms/bom/pom.xml b/poms/bom/pom.xml
index b193197..baaf2b3 100644
--- a/poms/bom/pom.xml
+++ b/poms/bom/pom.xml
@@ -5809,6 +5809,16 @@
                 <version>${reactor-netty.version}</version>
             </dependency>
             <dependency>
+                <groupId>io.quarkiverse.freemarker</groupId>
+                <artifactId>quarkus-freemarker</artifactId>
+                <version>${quarkiverse.freemarker.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.quarkiverse.freemarker</groupId>
+                <artifactId>quarkus-freemarker-deployment</artifactId>
+                <version>${quarkiverse.freemarker.version}</version>
+            </dependency>
+            <dependency>
                 <groupId>io.quarkiverse.googlecloudservices</groupId>
                 <artifactId>quarkus-google-cloud-bigquery</artifactId>
                 <version>${quarkus-google-cloud.version}</version>
diff --git a/tooling/scripts/test-categories.yaml b/tooling/scripts/test-categories.yaml
index 9571ed7..7549a8a 100644
--- a/tooling/scripts/test-categories.yaml
+++ b/tooling/scripts/test-categories.yaml
@@ -53,6 +53,7 @@ core-main-validation:
   - bean-validator
   - json-validator
   - validator
+  - freemarker
 database:
   - arangodb
   - cassandraql