You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pc...@apache.org on 2023/08/30 11:03:24 UTC

[camel-k] 01/02: Set builder profiles trait as a mutiple value

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

pcongiusti pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-k.git

commit 8f7b1a650047c029a9425e27a264ea3bb561259d
Author: Gaelle Fournier <ga...@gmail.com>
AuthorDate: Wed Aug 23 17:38:49 2023 +0200

    Set builder profiles trait as a mutiple value
---
 config/crd/bases/camel.apache.org_builds.yaml      |  87 ++++-----
 .../bases/camel.apache.org_integrationkits.yaml    |  22 ++-
 .../camel.apache.org_integrationplatforms.yaml     | 210 +++++++++++----------
 .../crd/bases/camel.apache.org_integrations.yaml   |  22 ++-
 .../bases/camel.apache.org_kameletbindings.yaml    |   8 +-
 config/crd/bases/camel.apache.org_pipes.yaml       |   8 +-
 docs/modules/ROOT/partials/apis/camel-k-crds.adoc  |  10 +-
 docs/modules/traits/pages/builder.adoc             |   6 +-
 e2e/common/traits/builder_test.go                  |  17 +-
 helm/camel-k/crds/crd-build.yaml                   |  87 ++++-----
 helm/camel-k/crds/crd-integration-kit.yaml         |  22 ++-
 helm/camel-k/crds/crd-integration-platform.yaml    | 210 +++++++++++----------
 helm/camel-k/crds/crd-integration.yaml             |  22 ++-
 helm/camel-k/crds/crd-kamelet-binding.yaml         |   8 +-
 helm/camel-k/crds/crd-pipe.yaml                    |   8 +-
 pkg/apis/camel/v1/maven_types.go                   |   2 +-
 pkg/apis/camel/v1/trait/builder.go                 |   4 +-
 pkg/apis/camel/v1/trait/zz_generated.deepcopy.go   |   5 +
 pkg/apis/camel/v1/zz_generated.deepcopy.go         |   8 +-
 pkg/builder/project.go                             |  26 ++-
 .../applyconfiguration/camel/v1/mavenbuildspec.go  |  15 +-
 .../camel/applyconfiguration/camel/v1/mavenspec.go |  17 +-
 pkg/trait/builder.go                               |  23 ++-
 pkg/trait/builder_test.go                          |  25 ++-
 pkg/util/maven/maven_project.go                    |   4 +-
 resources/traits.yaml                              |   8 +-
 26 files changed, 494 insertions(+), 390 deletions(-)

diff --git a/config/crd/bases/camel.apache.org_builds.yaml b/config/crd/bases/camel.apache.org_builds.yaml
index dea33d717..d5fff8964 100644
--- a/config/crd/bases/camel.apache.org_builds.yaml
+++ b/config/crd/bases/camel.apache.org_builds.yaml
@@ -310,50 +310,53 @@ spec:
                             localRepository:
                               description: The path of the local Maven repository.
                               type: string
-                            profile:
+                            profiles:
                               description: A reference to the ConfigMap or Secret
                                 key that contains the Maven profile.
-                              properties:
-                                configMapKeyRef:
-                                  description: Selects a key of a ConfigMap.
-                                  properties:
-                                    key:
-                                      description: The key to select.
-                                      type: string
-                                    name:
-                                      description: 'Name of the referent. More info:
-                                        https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
-                                        TODO: Add other useful fields. apiVersion,
-                                        kind, uid?'
-                                      type: string
-                                    optional:
-                                      description: Specify whether the ConfigMap or
-                                        its key must be defined
-                                      type: boolean
-                                  required:
-                                  - key
-                                  type: object
-                                secretKeyRef:
-                                  description: Selects a key of a secret.
-                                  properties:
-                                    key:
-                                      description: The key of the secret to select
-                                        from.  Must be a valid secret key.
-                                      type: string
-                                    name:
-                                      description: 'Name of the referent. More info:
-                                        https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
-                                        TODO: Add other useful fields. apiVersion,
-                                        kind, uid?'
-                                      type: string
-                                    optional:
-                                      description: Specify whether the Secret or its
-                                        key must be defined
-                                      type: boolean
-                                  required:
-                                  - key
-                                  type: object
-                              type: object
+                              items:
+                                description: ValueSource --
+                                properties:
+                                  configMapKeyRef:
+                                    description: Selects a key of a ConfigMap.
+                                    properties:
+                                      key:
+                                        description: The key to select.
+                                        type: string
+                                      name:
+                                        description: 'Name of the referent. More info:
+                                          https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                          TODO: Add other useful fields. apiVersion,
+                                          kind, uid?'
+                                        type: string
+                                      optional:
+                                        description: Specify whether the ConfigMap
+                                          or its key must be defined
+                                        type: boolean
+                                    required:
+                                    - key
+                                    type: object
+                                  secretKeyRef:
+                                    description: Selects a key of a secret.
+                                    properties:
+                                      key:
+                                        description: The key of the secret to select
+                                          from.  Must be a valid secret key.
+                                        type: string
+                                      name:
+                                        description: 'Name of the referent. More info:
+                                          https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                          TODO: Add other useful fields. apiVersion,
+                                          kind, uid?'
+                                        type: string
+                                      optional:
+                                        description: Specify whether the Secret or
+                                          its key must be defined
+                                        type: boolean
+                                    required:
+                                    - key
+                                    type: object
+                                type: object
+                              type: array
                             properties:
                               additionalProperties:
                                 type: string
diff --git a/config/crd/bases/camel.apache.org_integrationkits.yaml b/config/crd/bases/camel.apache.org_integrationkits.yaml
index d34ca382c..d286bf52f 100644
--- a/config/crd/bases/camel.apache.org_integrationkits.yaml
+++ b/config/crd/bases/camel.apache.org_integrationkits.yaml
@@ -211,16 +211,18 @@ spec:
                         description: When using `pod` strategy, the maximum amount
                           of memory required by the pod builder.
                         type: string
-                      mavenProfile:
-                        description: 'A reference pointing to a configmap/secret that
-                          contains a maven profile. The content of the maven profile
-                          is expected to be a text containing a valid maven profile
-                          starting with `<profile>` and ending with `</profile>` that
-                          will be integrated as an inline profile in the POM. Syntax:
-                          [configmap|secret]:name[/key], where name represents the
-                          resource name, key optionally represents the resource key
-                          to be filtered (default key value = profile.xml).'
-                        type: string
+                      mavenProfiles:
+                        description: 'A list of references pointing to configmaps/secrets
+                          that contains a maven profile. The content of the maven
+                          profile is expected to be a text containing a valid maven
+                          profile starting with `<profile>` and ending with `</profile>`
+                          that will be integrated as an inline profile in the POM.
+                          Syntax: [configmap|secret]:name[/key], where name represents
+                          the resource name, key optionally represents the resource
+                          key to be filtered (default key value = profile.xml).'
+                        items:
+                          type: string
+                        type: array
                       orderStrategy:
                         description: The build order strategy to use, either `dependencies`,
                           `fifo` or `sequential` (default sequential)
diff --git a/config/crd/bases/camel.apache.org_integrationplatforms.yaml b/config/crd/bases/camel.apache.org_integrationplatforms.yaml
index 15b266e54..9bd66b917 100644
--- a/config/crd/bases/camel.apache.org_integrationplatforms.yaml
+++ b/config/crd/bases/camel.apache.org_integrationplatforms.yaml
@@ -202,48 +202,51 @@ spec:
                       localRepository:
                         description: The path of the local Maven repository.
                         type: string
-                      profile:
+                      profiles:
                         description: A reference to the ConfigMap or Secret key that
                           contains the Maven profile.
-                        properties:
-                          configMapKeyRef:
-                            description: Selects a key of a ConfigMap.
-                            properties:
-                              key:
-                                description: The key to select.
-                                type: string
-                              name:
-                                description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
-                                  TODO: Add other useful fields. apiVersion, kind,
-                                  uid?'
-                                type: string
-                              optional:
-                                description: Specify whether the ConfigMap or its
-                                  key must be defined
-                                type: boolean
-                            required:
-                            - key
-                            type: object
-                          secretKeyRef:
-                            description: Selects a key of a secret.
-                            properties:
-                              key:
-                                description: The key of the secret to select from.  Must
-                                  be a valid secret key.
-                                type: string
-                              name:
-                                description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
-                                  TODO: Add other useful fields. apiVersion, kind,
-                                  uid?'
-                                type: string
-                              optional:
-                                description: Specify whether the Secret or its key
-                                  must be defined
-                                type: boolean
-                            required:
-                            - key
-                            type: object
-                        type: object
+                        items:
+                          description: ValueSource --
+                          properties:
+                            configMapKeyRef:
+                              description: Selects a key of a ConfigMap.
+                              properties:
+                                key:
+                                  description: The key to select.
+                                  type: string
+                                name:
+                                  description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                    TODO: Add other useful fields. apiVersion, kind,
+                                    uid?'
+                                  type: string
+                                optional:
+                                  description: Specify whether the ConfigMap or its
+                                    key must be defined
+                                  type: boolean
+                              required:
+                              - key
+                              type: object
+                            secretKeyRef:
+                              description: Selects a key of a secret.
+                              properties:
+                                key:
+                                  description: The key of the secret to select from.  Must
+                                    be a valid secret key.
+                                  type: string
+                                name:
+                                  description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                    TODO: Add other useful fields. apiVersion, kind,
+                                    uid?'
+                                  type: string
+                                optional:
+                                  description: Specify whether the Secret or its key
+                                    must be defined
+                                  type: boolean
+                              required:
+                              - key
+                              type: object
+                          type: object
+                        type: array
                       properties:
                         additionalProperties:
                           type: string
@@ -511,16 +514,18 @@ spec:
                         description: When using `pod` strategy, the maximum amount
                           of memory required by the pod builder.
                         type: string
-                      mavenProfile:
-                        description: 'A reference pointing to a configmap/secret that
-                          contains a maven profile. The content of the maven profile
-                          is expected to be a text containing a valid maven profile
-                          starting with `<profile>` and ending with `</profile>` that
-                          will be integrated as an inline profile in the POM. Syntax:
-                          [configmap|secret]:name[/key], where name represents the
-                          resource name, key optionally represents the resource key
-                          to be filtered (default key value = profile.xml).'
-                        type: string
+                      mavenProfiles:
+                        description: 'A list of references pointing to configmaps/secrets
+                          that contains a maven profile. The content of the maven
+                          profile is expected to be a text containing a valid maven
+                          profile starting with `<profile>` and ending with `</profile>`
+                          that will be integrated as an inline profile in the POM.
+                          Syntax: [configmap|secret]:name[/key], where name represents
+                          the resource name, key optionally represents the resource
+                          key to be filtered (default key value = profile.xml).'
+                        items:
+                          type: string
+                        type: array
                       orderStrategy:
                         description: The build order strategy to use, either `dependencies`,
                           `fifo` or `sequential` (default sequential)
@@ -1914,48 +1919,51 @@ spec:
                       localRepository:
                         description: The path of the local Maven repository.
                         type: string
-                      profile:
+                      profiles:
                         description: A reference to the ConfigMap or Secret key that
                           contains the Maven profile.
-                        properties:
-                          configMapKeyRef:
-                            description: Selects a key of a ConfigMap.
-                            properties:
-                              key:
-                                description: The key to select.
-                                type: string
-                              name:
-                                description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
-                                  TODO: Add other useful fields. apiVersion, kind,
-                                  uid?'
-                                type: string
-                              optional:
-                                description: Specify whether the ConfigMap or its
-                                  key must be defined
-                                type: boolean
-                            required:
-                            - key
-                            type: object
-                          secretKeyRef:
-                            description: Selects a key of a secret.
-                            properties:
-                              key:
-                                description: The key of the secret to select from.  Must
-                                  be a valid secret key.
-                                type: string
-                              name:
-                                description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
-                                  TODO: Add other useful fields. apiVersion, kind,
-                                  uid?'
-                                type: string
-                              optional:
-                                description: Specify whether the Secret or its key
-                                  must be defined
-                                type: boolean
-                            required:
-                            - key
-                            type: object
-                        type: object
+                        items:
+                          description: ValueSource --
+                          properties:
+                            configMapKeyRef:
+                              description: Selects a key of a ConfigMap.
+                              properties:
+                                key:
+                                  description: The key to select.
+                                  type: string
+                                name:
+                                  description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                    TODO: Add other useful fields. apiVersion, kind,
+                                    uid?'
+                                  type: string
+                                optional:
+                                  description: Specify whether the ConfigMap or its
+                                    key must be defined
+                                  type: boolean
+                              required:
+                              - key
+                              type: object
+                            secretKeyRef:
+                              description: Selects a key of a secret.
+                              properties:
+                                key:
+                                  description: The key of the secret to select from.  Must
+                                    be a valid secret key.
+                                  type: string
+                                name:
+                                  description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                    TODO: Add other useful fields. apiVersion, kind,
+                                    uid?'
+                                  type: string
+                                optional:
+                                  description: Specify whether the Secret or its key
+                                    must be defined
+                                  type: boolean
+                              required:
+                              - key
+                              type: object
+                          type: object
+                        type: array
                       properties:
                         additionalProperties:
                           type: string
@@ -2271,16 +2279,18 @@ spec:
                         description: When using `pod` strategy, the maximum amount
                           of memory required by the pod builder.
                         type: string
-                      mavenProfile:
-                        description: 'A reference pointing to a configmap/secret that
-                          contains a maven profile. The content of the maven profile
-                          is expected to be a text containing a valid maven profile
-                          starting with `<profile>` and ending with `</profile>` that
-                          will be integrated as an inline profile in the POM. Syntax:
-                          [configmap|secret]:name[/key], where name represents the
-                          resource name, key optionally represents the resource key
-                          to be filtered (default key value = profile.xml).'
-                        type: string
+                      mavenProfiles:
+                        description: 'A list of references pointing to configmaps/secrets
+                          that contains a maven profile. The content of the maven
+                          profile is expected to be a text containing a valid maven
+                          profile starting with `<profile>` and ending with `</profile>`
+                          that will be integrated as an inline profile in the POM.
+                          Syntax: [configmap|secret]:name[/key], where name represents
+                          the resource name, key optionally represents the resource
+                          key to be filtered (default key value = profile.xml).'
+                        items:
+                          type: string
+                        type: array
                       orderStrategy:
                         description: The build order strategy to use, either `dependencies`,
                           `fifo` or `sequential` (default sequential)
diff --git a/config/crd/bases/camel.apache.org_integrations.yaml b/config/crd/bases/camel.apache.org_integrations.yaml
index efdff886e..c9ff39673 100644
--- a/config/crd/bases/camel.apache.org_integrations.yaml
+++ b/config/crd/bases/camel.apache.org_integrations.yaml
@@ -6194,16 +6194,18 @@ spec:
                         description: When using `pod` strategy, the maximum amount
                           of memory required by the pod builder.
                         type: string
-                      mavenProfile:
-                        description: 'A reference pointing to a configmap/secret that
-                          contains a maven profile. The content of the maven profile
-                          is expected to be a text containing a valid maven profile
-                          starting with `<profile>` and ending with `</profile>` that
-                          will be integrated as an inline profile in the POM. Syntax:
-                          [configmap|secret]:name[/key], where name represents the
-                          resource name, key optionally represents the resource key
-                          to be filtered (default key value = profile.xml).'
-                        type: string
+                      mavenProfiles:
+                        description: 'A list of references pointing to configmaps/secrets
+                          that contains a maven profile. The content of the maven
+                          profile is expected to be a text containing a valid maven
+                          profile starting with `<profile>` and ending with `</profile>`
+                          that will be integrated as an inline profile in the POM.
+                          Syntax: [configmap|secret]:name[/key], where name represents
+                          the resource name, key optionally represents the resource
+                          key to be filtered (default key value = profile.xml).'
+                        items:
+                          type: string
+                        type: array
                       orderStrategy:
                         description: The build order strategy to use, either `dependencies`,
                           `fifo` or `sequential` (default sequential)
diff --git a/config/crd/bases/camel.apache.org_kameletbindings.yaml b/config/crd/bases/camel.apache.org_kameletbindings.yaml
index fc14f54af..69c4fecb8 100644
--- a/config/crd/bases/camel.apache.org_kameletbindings.yaml
+++ b/config/crd/bases/camel.apache.org_kameletbindings.yaml
@@ -6469,8 +6469,8 @@ spec:
                             description: When using `pod` strategy, the maximum amount
                               of memory required by the pod builder.
                             type: string
-                          mavenProfile:
-                            description: 'A reference pointing to a configmap/secret
+                          mavenProfiles:
+                            description: 'A list of references pointing to configmaps/secrets
                               that contains a maven profile. The content of the maven
                               profile is expected to be a text containing a valid
                               maven profile starting with `<profile>` and ending with
@@ -6479,7 +6479,9 @@ spec:
                               name represents the resource name, key optionally represents
                               the resource key to be filtered (default key value =
                               profile.xml).'
-                            type: string
+                            items:
+                              type: string
+                            type: array
                           orderStrategy:
                             description: The build order strategy to use, either `dependencies`,
                               `fifo` or `sequential` (default sequential)
diff --git a/config/crd/bases/camel.apache.org_pipes.yaml b/config/crd/bases/camel.apache.org_pipes.yaml
index 9ceecf473..165d7dcd0 100644
--- a/config/crd/bases/camel.apache.org_pipes.yaml
+++ b/config/crd/bases/camel.apache.org_pipes.yaml
@@ -6466,8 +6466,8 @@ spec:
                             description: When using `pod` strategy, the maximum amount
                               of memory required by the pod builder.
                             type: string
-                          mavenProfile:
-                            description: 'A reference pointing to a configmap/secret
+                          mavenProfiles:
+                            description: 'A list of references pointing to configmaps/secrets
                               that contains a maven profile. The content of the maven
                               profile is expected to be a text containing a valid
                               maven profile starting with `<profile>` and ending with
@@ -6476,7 +6476,9 @@ spec:
                               name represents the resource name, key optionally represents
                               the resource key to be filtered (default key value =
                               profile.xml).'
-                            type: string
+                            items:
+                              type: string
+                            type: array
                           orderStrategy:
                             description: The build order strategy to use, either `dependencies`,
                               `fifo` or `sequential` (default sequential)
diff --git a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
index 5eb016eec..1db2f63ea 100644
--- a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
+++ b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
@@ -3837,8 +3837,8 @@ map[string]string
 
 The Maven properties.
 
-|`profile` +
-*xref:#_camel_apache_org_v1_ValueSource[ValueSource]*
+|`profiles` +
+*xref:#_camel_apache_org_v1_ValueSource[[\]ValueSource]*
 |
 
 
@@ -5451,12 +5451,12 @@ string
 
 When using `pod` strategy, the maximum amount of memory required by the pod builder.
 
-|`mavenProfile` +
-string
+|`mavenProfiles` +
+[]string
 |
 
 
-A reference pointing to a configmap/secret that contains a maven profile.
+A list of references pointing to configmaps/secrets that contains a maven profile.
 The content of the maven profile is expected to be a text containing a valid maven profile starting with `<profile>` and ending with `</profile>` that will be integrated as an inline profile in the POM.
 Syntax: [configmap{vbar}secret]:name[/key], where name represents the resource name, key optionally represents the resource key to be filtered (default key value = profile.xml).
 
diff --git a/docs/modules/traits/pages/builder.adoc b/docs/modules/traits/pages/builder.adoc
index b9d9edf59..891bd196d 100755
--- a/docs/modules/traits/pages/builder.adoc
+++ b/docs/modules/traits/pages/builder.adoc
@@ -60,9 +60,9 @@ The following configuration options are available:
 | string
 | When using `pod` strategy, the maximum amount of memory required by the pod builder.
 
-| builder.maven-profile
-| string
-| A reference pointing to a configmap/secret that contains a maven profile.
+| builder.maven-profiles
+| []string
+| A list of references pointing to configmaps/secrets that contains a maven profile.
 The content of the maven profile is expected to be a text containing a valid maven profile starting with `<profile>` and ending with `</profile>` that will be integrated as an inline profile in the POM.
 Syntax: [configmap\|secret]:name[/key], where name represents the resource name, key optionally represents the resource key to be filtered (default key value = profile.xml).
 
diff --git a/e2e/common/traits/builder_test.go b/e2e/common/traits/builder_test.go
index c1e9ed492..795b2abd3 100644
--- a/e2e/common/traits/builder_test.go
+++ b/e2e/common/traits/builder_test.go
@@ -229,12 +229,15 @@ func TestBuilderTrait(t *testing.T) {
 	t.Run("Run maven profile", func(t *testing.T) {
 		name := "java-maven-profile"
 
-		mavenProfileCm := newMavenProfileConfigMap(ns, "maven-profile", "owasp-profile")
-		Expect(TestClient().Create(TestContext, mavenProfileCm)).To(Succeed())
+		mavenProfile1Cm := newMavenProfileConfigMap(ns, "maven-profile-owasp", "owasp-profile")
+		Expect(TestClient().Create(TestContext, mavenProfile1Cm)).To(Succeed())
+		mavenProfile2Cm := newMavenProfileConfigMap(ns, "maven-profile-dependency", "dependency-profile")
+		Expect(TestClient().Create(TestContext, mavenProfile2Cm)).To(Succeed())
 
 		Expect(KamelRunWithID(operatorID, ns, "files/Java.java",
 			"--name", name,
-			"-t", "builder.maven-profile=configmap:maven-profile/owasp-profile",
+			"-t", "builder.maven-profiles=configmap:maven-profile-owasp/owasp-profile",
+			"-t", "builder.maven-profiles=configmap:maven-profile-dependency/dependency-profile",
 			"-t", "builder.tasks=custom1;alpine;cat maven/pom.xml",
 			"-t", "builder.strategy=pod",
 		).Execute()).To(Succeed())
@@ -260,10 +263,12 @@ func TestBuilderTrait(t *testing.T) {
 			TestTimeoutShort).Should(ContainSubstring("</project>"))
 
 		// Check logs
-		Eventually(Logs(ns, builderKitName, corev1.PodLogOptions{Container: "custom1"})).Should(ContainSubstring(`<id>owasp-dependency-check</id>`))
+		Eventually(Logs(ns, builderKitName, corev1.PodLogOptions{Container: "custom1"})).Should(ContainSubstring(`<id>owasp-profile</id>`))
+		Eventually(Logs(ns, builderKitName, corev1.PodLogOptions{Container: "custom1"})).Should(ContainSubstring(`<id>dependency-profile</id>`))
 
 		Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed())
-		Expect(TestClient().Delete(TestContext, mavenProfileCm)).To(Succeed())
+		Expect(TestClient().Delete(TestContext, mavenProfile1Cm)).To(Succeed())
+		Expect(TestClient().Delete(TestContext, mavenProfile2Cm)).To(Succeed())
 	})
 }
 
@@ -280,7 +285,7 @@ func newMavenProfileConfigMap(ns, name, key string) *corev1.ConfigMap {
 		Data: map[string]string{
 			key: fmt.Sprintf(`
 <profile>
-  <id>owasp-dependency-check</id>
+  <id>` + key + `</id>
   <build>
     <plugins>
       <plugin>
diff --git a/helm/camel-k/crds/crd-build.yaml b/helm/camel-k/crds/crd-build.yaml
index dea33d717..d5fff8964 100644
--- a/helm/camel-k/crds/crd-build.yaml
+++ b/helm/camel-k/crds/crd-build.yaml
@@ -310,50 +310,53 @@ spec:
                             localRepository:
                               description: The path of the local Maven repository.
                               type: string
-                            profile:
+                            profiles:
                               description: A reference to the ConfigMap or Secret
                                 key that contains the Maven profile.
-                              properties:
-                                configMapKeyRef:
-                                  description: Selects a key of a ConfigMap.
-                                  properties:
-                                    key:
-                                      description: The key to select.
-                                      type: string
-                                    name:
-                                      description: 'Name of the referent. More info:
-                                        https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
-                                        TODO: Add other useful fields. apiVersion,
-                                        kind, uid?'
-                                      type: string
-                                    optional:
-                                      description: Specify whether the ConfigMap or
-                                        its key must be defined
-                                      type: boolean
-                                  required:
-                                  - key
-                                  type: object
-                                secretKeyRef:
-                                  description: Selects a key of a secret.
-                                  properties:
-                                    key:
-                                      description: The key of the secret to select
-                                        from.  Must be a valid secret key.
-                                      type: string
-                                    name:
-                                      description: 'Name of the referent. More info:
-                                        https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
-                                        TODO: Add other useful fields. apiVersion,
-                                        kind, uid?'
-                                      type: string
-                                    optional:
-                                      description: Specify whether the Secret or its
-                                        key must be defined
-                                      type: boolean
-                                  required:
-                                  - key
-                                  type: object
-                              type: object
+                              items:
+                                description: ValueSource --
+                                properties:
+                                  configMapKeyRef:
+                                    description: Selects a key of a ConfigMap.
+                                    properties:
+                                      key:
+                                        description: The key to select.
+                                        type: string
+                                      name:
+                                        description: 'Name of the referent. More info:
+                                          https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                          TODO: Add other useful fields. apiVersion,
+                                          kind, uid?'
+                                        type: string
+                                      optional:
+                                        description: Specify whether the ConfigMap
+                                          or its key must be defined
+                                        type: boolean
+                                    required:
+                                    - key
+                                    type: object
+                                  secretKeyRef:
+                                    description: Selects a key of a secret.
+                                    properties:
+                                      key:
+                                        description: The key of the secret to select
+                                          from.  Must be a valid secret key.
+                                        type: string
+                                      name:
+                                        description: 'Name of the referent. More info:
+                                          https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                          TODO: Add other useful fields. apiVersion,
+                                          kind, uid?'
+                                        type: string
+                                      optional:
+                                        description: Specify whether the Secret or
+                                          its key must be defined
+                                        type: boolean
+                                    required:
+                                    - key
+                                    type: object
+                                type: object
+                              type: array
                             properties:
                               additionalProperties:
                                 type: string
diff --git a/helm/camel-k/crds/crd-integration-kit.yaml b/helm/camel-k/crds/crd-integration-kit.yaml
index d34ca382c..d286bf52f 100644
--- a/helm/camel-k/crds/crd-integration-kit.yaml
+++ b/helm/camel-k/crds/crd-integration-kit.yaml
@@ -211,16 +211,18 @@ spec:
                         description: When using `pod` strategy, the maximum amount
                           of memory required by the pod builder.
                         type: string
-                      mavenProfile:
-                        description: 'A reference pointing to a configmap/secret that
-                          contains a maven profile. The content of the maven profile
-                          is expected to be a text containing a valid maven profile
-                          starting with `<profile>` and ending with `</profile>` that
-                          will be integrated as an inline profile in the POM. Syntax:
-                          [configmap|secret]:name[/key], where name represents the
-                          resource name, key optionally represents the resource key
-                          to be filtered (default key value = profile.xml).'
-                        type: string
+                      mavenProfiles:
+                        description: 'A list of references pointing to configmaps/secrets
+                          that contains a maven profile. The content of the maven
+                          profile is expected to be a text containing a valid maven
+                          profile starting with `<profile>` and ending with `</profile>`
+                          that will be integrated as an inline profile in the POM.
+                          Syntax: [configmap|secret]:name[/key], where name represents
+                          the resource name, key optionally represents the resource
+                          key to be filtered (default key value = profile.xml).'
+                        items:
+                          type: string
+                        type: array
                       orderStrategy:
                         description: The build order strategy to use, either `dependencies`,
                           `fifo` or `sequential` (default sequential)
diff --git a/helm/camel-k/crds/crd-integration-platform.yaml b/helm/camel-k/crds/crd-integration-platform.yaml
index 15b266e54..9bd66b917 100644
--- a/helm/camel-k/crds/crd-integration-platform.yaml
+++ b/helm/camel-k/crds/crd-integration-platform.yaml
@@ -202,48 +202,51 @@ spec:
                       localRepository:
                         description: The path of the local Maven repository.
                         type: string
-                      profile:
+                      profiles:
                         description: A reference to the ConfigMap or Secret key that
                           contains the Maven profile.
-                        properties:
-                          configMapKeyRef:
-                            description: Selects a key of a ConfigMap.
-                            properties:
-                              key:
-                                description: The key to select.
-                                type: string
-                              name:
-                                description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
-                                  TODO: Add other useful fields. apiVersion, kind,
-                                  uid?'
-                                type: string
-                              optional:
-                                description: Specify whether the ConfigMap or its
-                                  key must be defined
-                                type: boolean
-                            required:
-                            - key
-                            type: object
-                          secretKeyRef:
-                            description: Selects a key of a secret.
-                            properties:
-                              key:
-                                description: The key of the secret to select from.  Must
-                                  be a valid secret key.
-                                type: string
-                              name:
-                                description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
-                                  TODO: Add other useful fields. apiVersion, kind,
-                                  uid?'
-                                type: string
-                              optional:
-                                description: Specify whether the Secret or its key
-                                  must be defined
-                                type: boolean
-                            required:
-                            - key
-                            type: object
-                        type: object
+                        items:
+                          description: ValueSource --
+                          properties:
+                            configMapKeyRef:
+                              description: Selects a key of a ConfigMap.
+                              properties:
+                                key:
+                                  description: The key to select.
+                                  type: string
+                                name:
+                                  description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                    TODO: Add other useful fields. apiVersion, kind,
+                                    uid?'
+                                  type: string
+                                optional:
+                                  description: Specify whether the ConfigMap or its
+                                    key must be defined
+                                  type: boolean
+                              required:
+                              - key
+                              type: object
+                            secretKeyRef:
+                              description: Selects a key of a secret.
+                              properties:
+                                key:
+                                  description: The key of the secret to select from.  Must
+                                    be a valid secret key.
+                                  type: string
+                                name:
+                                  description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                    TODO: Add other useful fields. apiVersion, kind,
+                                    uid?'
+                                  type: string
+                                optional:
+                                  description: Specify whether the Secret or its key
+                                    must be defined
+                                  type: boolean
+                              required:
+                              - key
+                              type: object
+                          type: object
+                        type: array
                       properties:
                         additionalProperties:
                           type: string
@@ -511,16 +514,18 @@ spec:
                         description: When using `pod` strategy, the maximum amount
                           of memory required by the pod builder.
                         type: string
-                      mavenProfile:
-                        description: 'A reference pointing to a configmap/secret that
-                          contains a maven profile. The content of the maven profile
-                          is expected to be a text containing a valid maven profile
-                          starting with `<profile>` and ending with `</profile>` that
-                          will be integrated as an inline profile in the POM. Syntax:
-                          [configmap|secret]:name[/key], where name represents the
-                          resource name, key optionally represents the resource key
-                          to be filtered (default key value = profile.xml).'
-                        type: string
+                      mavenProfiles:
+                        description: 'A list of references pointing to configmaps/secrets
+                          that contains a maven profile. The content of the maven
+                          profile is expected to be a text containing a valid maven
+                          profile starting with `<profile>` and ending with `</profile>`
+                          that will be integrated as an inline profile in the POM.
+                          Syntax: [configmap|secret]:name[/key], where name represents
+                          the resource name, key optionally represents the resource
+                          key to be filtered (default key value = profile.xml).'
+                        items:
+                          type: string
+                        type: array
                       orderStrategy:
                         description: The build order strategy to use, either `dependencies`,
                           `fifo` or `sequential` (default sequential)
@@ -1914,48 +1919,51 @@ spec:
                       localRepository:
                         description: The path of the local Maven repository.
                         type: string
-                      profile:
+                      profiles:
                         description: A reference to the ConfigMap or Secret key that
                           contains the Maven profile.
-                        properties:
-                          configMapKeyRef:
-                            description: Selects a key of a ConfigMap.
-                            properties:
-                              key:
-                                description: The key to select.
-                                type: string
-                              name:
-                                description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
-                                  TODO: Add other useful fields. apiVersion, kind,
-                                  uid?'
-                                type: string
-                              optional:
-                                description: Specify whether the ConfigMap or its
-                                  key must be defined
-                                type: boolean
-                            required:
-                            - key
-                            type: object
-                          secretKeyRef:
-                            description: Selects a key of a secret.
-                            properties:
-                              key:
-                                description: The key of the secret to select from.  Must
-                                  be a valid secret key.
-                                type: string
-                              name:
-                                description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
-                                  TODO: Add other useful fields. apiVersion, kind,
-                                  uid?'
-                                type: string
-                              optional:
-                                description: Specify whether the Secret or its key
-                                  must be defined
-                                type: boolean
-                            required:
-                            - key
-                            type: object
-                        type: object
+                        items:
+                          description: ValueSource --
+                          properties:
+                            configMapKeyRef:
+                              description: Selects a key of a ConfigMap.
+                              properties:
+                                key:
+                                  description: The key to select.
+                                  type: string
+                                name:
+                                  description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                    TODO: Add other useful fields. apiVersion, kind,
+                                    uid?'
+                                  type: string
+                                optional:
+                                  description: Specify whether the ConfigMap or its
+                                    key must be defined
+                                  type: boolean
+                              required:
+                              - key
+                              type: object
+                            secretKeyRef:
+                              description: Selects a key of a secret.
+                              properties:
+                                key:
+                                  description: The key of the secret to select from.  Must
+                                    be a valid secret key.
+                                  type: string
+                                name:
+                                  description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                    TODO: Add other useful fields. apiVersion, kind,
+                                    uid?'
+                                  type: string
+                                optional:
+                                  description: Specify whether the Secret or its key
+                                    must be defined
+                                  type: boolean
+                              required:
+                              - key
+                              type: object
+                          type: object
+                        type: array
                       properties:
                         additionalProperties:
                           type: string
@@ -2271,16 +2279,18 @@ spec:
                         description: When using `pod` strategy, the maximum amount
                           of memory required by the pod builder.
                         type: string
-                      mavenProfile:
-                        description: 'A reference pointing to a configmap/secret that
-                          contains a maven profile. The content of the maven profile
-                          is expected to be a text containing a valid maven profile
-                          starting with `<profile>` and ending with `</profile>` that
-                          will be integrated as an inline profile in the POM. Syntax:
-                          [configmap|secret]:name[/key], where name represents the
-                          resource name, key optionally represents the resource key
-                          to be filtered (default key value = profile.xml).'
-                        type: string
+                      mavenProfiles:
+                        description: 'A list of references pointing to configmaps/secrets
+                          that contains a maven profile. The content of the maven
+                          profile is expected to be a text containing a valid maven
+                          profile starting with `<profile>` and ending with `</profile>`
+                          that will be integrated as an inline profile in the POM.
+                          Syntax: [configmap|secret]:name[/key], where name represents
+                          the resource name, key optionally represents the resource
+                          key to be filtered (default key value = profile.xml).'
+                        items:
+                          type: string
+                        type: array
                       orderStrategy:
                         description: The build order strategy to use, either `dependencies`,
                           `fifo` or `sequential` (default sequential)
diff --git a/helm/camel-k/crds/crd-integration.yaml b/helm/camel-k/crds/crd-integration.yaml
index efdff886e..c9ff39673 100644
--- a/helm/camel-k/crds/crd-integration.yaml
+++ b/helm/camel-k/crds/crd-integration.yaml
@@ -6194,16 +6194,18 @@ spec:
                         description: When using `pod` strategy, the maximum amount
                           of memory required by the pod builder.
                         type: string
-                      mavenProfile:
-                        description: 'A reference pointing to a configmap/secret that
-                          contains a maven profile. The content of the maven profile
-                          is expected to be a text containing a valid maven profile
-                          starting with `<profile>` and ending with `</profile>` that
-                          will be integrated as an inline profile in the POM. Syntax:
-                          [configmap|secret]:name[/key], where name represents the
-                          resource name, key optionally represents the resource key
-                          to be filtered (default key value = profile.xml).'
-                        type: string
+                      mavenProfiles:
+                        description: 'A list of references pointing to configmaps/secrets
+                          that contains a maven profile. The content of the maven
+                          profile is expected to be a text containing a valid maven
+                          profile starting with `<profile>` and ending with `</profile>`
+                          that will be integrated as an inline profile in the POM.
+                          Syntax: [configmap|secret]:name[/key], where name represents
+                          the resource name, key optionally represents the resource
+                          key to be filtered (default key value = profile.xml).'
+                        items:
+                          type: string
+                        type: array
                       orderStrategy:
                         description: The build order strategy to use, either `dependencies`,
                           `fifo` or `sequential` (default sequential)
diff --git a/helm/camel-k/crds/crd-kamelet-binding.yaml b/helm/camel-k/crds/crd-kamelet-binding.yaml
index fc14f54af..69c4fecb8 100644
--- a/helm/camel-k/crds/crd-kamelet-binding.yaml
+++ b/helm/camel-k/crds/crd-kamelet-binding.yaml
@@ -6469,8 +6469,8 @@ spec:
                             description: When using `pod` strategy, the maximum amount
                               of memory required by the pod builder.
                             type: string
-                          mavenProfile:
-                            description: 'A reference pointing to a configmap/secret
+                          mavenProfiles:
+                            description: 'A list of references pointing to configmaps/secrets
                               that contains a maven profile. The content of the maven
                               profile is expected to be a text containing a valid
                               maven profile starting with `<profile>` and ending with
@@ -6479,7 +6479,9 @@ spec:
                               name represents the resource name, key optionally represents
                               the resource key to be filtered (default key value =
                               profile.xml).'
-                            type: string
+                            items:
+                              type: string
+                            type: array
                           orderStrategy:
                             description: The build order strategy to use, either `dependencies`,
                               `fifo` or `sequential` (default sequential)
diff --git a/helm/camel-k/crds/crd-pipe.yaml b/helm/camel-k/crds/crd-pipe.yaml
index 9ceecf473..165d7dcd0 100644
--- a/helm/camel-k/crds/crd-pipe.yaml
+++ b/helm/camel-k/crds/crd-pipe.yaml
@@ -6466,8 +6466,8 @@ spec:
                             description: When using `pod` strategy, the maximum amount
                               of memory required by the pod builder.
                             type: string
-                          mavenProfile:
-                            description: 'A reference pointing to a configmap/secret
+                          mavenProfiles:
+                            description: 'A list of references pointing to configmaps/secrets
                               that contains a maven profile. The content of the maven
                               profile is expected to be a text containing a valid
                               maven profile starting with `<profile>` and ending with
@@ -6476,7 +6476,9 @@ spec:
                               name represents the resource name, key optionally represents
                               the resource key to be filtered (default key value =
                               profile.xml).'
-                            type: string
+                            items:
+                              type: string
+                            type: array
                           orderStrategy:
                             description: The build order strategy to use, either `dependencies`,
                               `fifo` or `sequential` (default sequential)
diff --git a/pkg/apis/camel/v1/maven_types.go b/pkg/apis/camel/v1/maven_types.go
index 66101d202..0650279e3 100644
--- a/pkg/apis/camel/v1/maven_types.go
+++ b/pkg/apis/camel/v1/maven_types.go
@@ -31,7 +31,7 @@ type MavenSpec struct {
 	Properties map[string]string `json:"properties,omitempty"`
 	// A reference to the ConfigMap or Secret key that contains
 	// the Maven profile.
-	Profile ValueSource `json:"profile,omitempty"`
+	Profiles []ValueSource `json:"profiles,omitempty"`
 	// A reference to the ConfigMap or Secret key that contains
 	// the Maven settings.
 	Settings ValueSource `json:"settings,omitempty"`
diff --git a/pkg/apis/camel/v1/trait/builder.go b/pkg/apis/camel/v1/trait/builder.go
index dd4fa05c7..166975c3b 100644
--- a/pkg/apis/camel/v1/trait/builder.go
+++ b/pkg/apis/camel/v1/trait/builder.go
@@ -39,10 +39,10 @@ type BuilderTrait struct {
 	LimitCPU string `property:"limit-cpu" json:"limitCPU,omitempty"`
 	// When using `pod` strategy, the maximum amount of memory required by the pod builder.
 	LimitMemory string `property:"limit-memory" json:"limitMemory,omitempty"`
-	// A reference pointing to a configmap/secret that contains a maven profile.
+	// A list of references pointing to configmaps/secrets that contains a maven profile.
 	// The content of the maven profile is expected to be a text containing a valid maven profile starting with `<profile>` and ending with `</profile>` that will be integrated as an inline profile in the POM.
 	// Syntax: [configmap|secret]:name[/key], where name represents the resource name, key optionally represents the resource key to be filtered (default key value = profile.xml).
-	MavenProfile string `property:"maven-profile" json:"mavenProfile,omitempty"`
+	MavenProfiles []string `property:"maven-profiles" json:"mavenProfiles,omitempty"`
 	// A list of tasks to be executed (available only when using `pod` strategy) with format <name>;<container-image>;<container-command>
 	Tasks []string `property:"tasks" json:"tasks,omitempty"`
 }
diff --git a/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go b/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go
index bad665a54..037173370 100644
--- a/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go
+++ b/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go
@@ -64,6 +64,11 @@ func (in *BuilderTrait) DeepCopyInto(out *BuilderTrait) {
 		*out = make([]string, len(*in))
 		copy(*out, *in)
 	}
+	if in.MavenProfiles != nil {
+		in, out := &in.MavenProfiles, &out.MavenProfiles
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
 	if in.Tasks != nil {
 		in, out := &in.Tasks, &out.Tasks
 		*out = make([]string, len(*in))
diff --git a/pkg/apis/camel/v1/zz_generated.deepcopy.go b/pkg/apis/camel/v1/zz_generated.deepcopy.go
index e1e578389..cc0853d90 100644
--- a/pkg/apis/camel/v1/zz_generated.deepcopy.go
+++ b/pkg/apis/camel/v1/zz_generated.deepcopy.go
@@ -2000,7 +2000,13 @@ func (in *MavenSpec) DeepCopyInto(out *MavenSpec) {
 			(*out)[key] = val
 		}
 	}
-	in.Profile.DeepCopyInto(&out.Profile)
+	if in.Profiles != nil {
+		in, out := &in.Profiles, &out.Profiles
+		*out = make([]ValueSource, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
 	in.Settings.DeepCopyInto(&out.Settings)
 	in.SettingsSecurity.DeepCopyInto(&out.SettingsSecurity)
 	if in.CASecrets != nil {
diff --git a/pkg/builder/project.go b/pkg/builder/project.go
index ab6c8baf7..e31e25a56 100644
--- a/pkg/builder/project.go
+++ b/pkg/builder/project.go
@@ -41,7 +41,7 @@ func init() {
 		Project.GenerateProjectSettings,
 		Project.InjectDependencies,
 		Project.SanitizeDependencies,
-		Project.InjectProfile,
+		Project.InjectProfiles,
 	}
 }
 
@@ -51,7 +51,7 @@ type projectSteps struct {
 	GenerateProjectSettings Step
 	InjectDependencies      Step
 	SanitizeDependencies    Step
-	InjectProfile           Step
+	InjectProfiles          Step
 
 	CommonSteps []Step
 }
@@ -62,7 +62,7 @@ var Project = projectSteps{
 	GenerateProjectSettings: NewStep(ProjectGenerationPhase+1, generateProjectSettings),
 	InjectDependencies:      NewStep(ProjectGenerationPhase+2, injectDependencies),
 	SanitizeDependencies:    NewStep(ProjectGenerationPhase+3, sanitizeDependencies),
-	InjectProfile:           NewStep(ProjectGenerationPhase+4, injectProfile),
+	InjectProfiles:          NewStep(ProjectGenerationPhase+4, injectProfiles),
 }
 
 func cleanUpBuildDir(ctx *builderContext) error {
@@ -195,13 +195,19 @@ func sanitizeDependencies(ctx *builderContext) error {
 	return camel.SanitizeIntegrationDependencies(ctx.Maven.Project.Dependencies)
 }
 
-func injectProfile(ctx *builderContext) error {
-	val, err := kubernetes.ResolveValueSource(ctx.C, ctx.Client, ctx.Namespace, &ctx.Build.Maven.Profile)
-	if err != nil {
-		return err
-	}
-	if val != "" {
-		ctx.Maven.Project.AddProfile(val)
+func injectProfiles(ctx *builderContext) error {
+	if ctx.Build.Maven.Profiles != nil {
+		profiles := ""
+		for _, profile := range ctx.Build.Maven.Profiles {
+			val, err := kubernetes.ResolveValueSource(ctx.C, ctx.Client, ctx.Namespace, &profile)
+			if err != nil {
+				return err
+			}
+			if val != "" {
+				profiles += val
+			}
+		}
+		ctx.Maven.Project.AddProfiles(profiles)
 	}
 	return nil
 }
diff --git a/pkg/client/camel/applyconfiguration/camel/v1/mavenbuildspec.go b/pkg/client/camel/applyconfiguration/camel/v1/mavenbuildspec.go
index 52528bcf8..6fec4f020 100644
--- a/pkg/client/camel/applyconfiguration/camel/v1/mavenbuildspec.go
+++ b/pkg/client/camel/applyconfiguration/camel/v1/mavenbuildspec.go
@@ -59,11 +59,16 @@ func (b *MavenBuildSpecApplyConfiguration) WithProperties(entries map[string]str
 	return b
 }
 
-// WithProfile sets the Profile field in the declarative configuration to the given value
-// and returns the receiver, so that objects can be built by chaining "With" function invocations.
-// If called multiple times, the Profile field is set to the value of the last call.
-func (b *MavenBuildSpecApplyConfiguration) WithProfile(value *ValueSourceApplyConfiguration) *MavenBuildSpecApplyConfiguration {
-	b.Profile = value
+// WithProfiles adds the given value to the Profiles field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the Profiles field.
+func (b *MavenBuildSpecApplyConfiguration) WithProfiles(values ...*ValueSourceApplyConfiguration) *MavenBuildSpecApplyConfiguration {
+	for i := range values {
+		if values[i] == nil {
+			panic("nil value passed to WithProfiles")
+		}
+		b.Profiles = append(b.Profiles, *values[i])
+	}
 	return b
 }
 
diff --git a/pkg/client/camel/applyconfiguration/camel/v1/mavenspec.go b/pkg/client/camel/applyconfiguration/camel/v1/mavenspec.go
index b73c97f27..c8e833f5c 100644
--- a/pkg/client/camel/applyconfiguration/camel/v1/mavenspec.go
+++ b/pkg/client/camel/applyconfiguration/camel/v1/mavenspec.go
@@ -28,7 +28,7 @@ import (
 type MavenSpecApplyConfiguration struct {
 	LocalRepository  *string                           `json:"localRepository,omitempty"`
 	Properties       map[string]string                 `json:"properties,omitempty"`
-	Profile          *ValueSourceApplyConfiguration    `json:"profile,omitempty"`
+	Profiles         []ValueSourceApplyConfiguration   `json:"profiles,omitempty"`
 	Settings         *ValueSourceApplyConfiguration    `json:"settings,omitempty"`
 	SettingsSecurity *ValueSourceApplyConfiguration    `json:"settingsSecurity,omitempty"`
 	CASecrets        []corev1.SecretKeySelector        `json:"caSecrets,omitempty"`
@@ -64,11 +64,16 @@ func (b *MavenSpecApplyConfiguration) WithProperties(entries map[string]string)
 	return b
 }
 
-// WithProfile sets the Profile field in the declarative configuration to the given value
-// and returns the receiver, so that objects can be built by chaining "With" function invocations.
-// If called multiple times, the Profile field is set to the value of the last call.
-func (b *MavenSpecApplyConfiguration) WithProfile(value *ValueSourceApplyConfiguration) *MavenSpecApplyConfiguration {
-	b.Profile = value
+// WithProfiles adds the given value to the Profiles field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the Profiles field.
+func (b *MavenSpecApplyConfiguration) WithProfiles(values ...*ValueSourceApplyConfiguration) *MavenSpecApplyConfiguration {
+	for i := range values {
+		if values[i] == nil {
+			panic("nil value passed to WithProfiles")
+		}
+		b.Profiles = append(b.Profiles, *values[i])
+	}
 	return b
 }
 
diff --git a/pkg/trait/builder.go b/pkg/trait/builder.go
index c9fc315c2..16bc17cd5 100644
--- a/pkg/trait/builder.go
+++ b/pkg/trait/builder.go
@@ -285,14 +285,25 @@ func (t *builderTrait) builderTask(e *Environment) (*v1.BuilderTask, error) {
 	}
 
 	// User provides a maven profile
-	if t.MavenProfile != "" {
-		mavenProfile, err := v1.DecodeValueSource(t.MavenProfile, "profile.xml",
-			"illegal profile definition, syntax: configmap|secret:resource-name[/profile path]")
-		if err != nil {
-			return nil, fmt.Errorf("invalid maven profile: %s: %w. ", t.MavenProfile, err)
+	if t.MavenProfiles != nil {
+		mavenProfiles := make([]v1.ValueSource, 0)
+		for _, v := range t.MavenProfiles {
+			if v != "" {
+				// TODO parametrize message with input
+				mavenProfile, err := v1.DecodeValueSource(v, "profile.xml",
+					"illegal profile definition, syntax: configmap|secret:resource-name[/profile path]")
+				if err != nil {
+					return nil, fmt.Errorf("invalid maven profile: %s: %w. ", v, err)
+				}
+				mavenProfiles = append(mavenProfiles, mavenProfile)
+			}
 		}
-		task.Maven.Profile = mavenProfile
+		task.Maven.Profiles = mavenProfiles
 	}
+	// add jib profile
+	/*if e.Platform.Status.Build.PublishStrategy == v1.IntegrationPlatformBuildPublishStrategyJib {
+		t.L.Info("GFO - You should add jib profile")
+	}*/
 
 	steps := make([]builder.Step, 0)
 	steps = append(steps, builder.Project.CommonSteps...)
diff --git a/pkg/trait/builder_test.go b/pkg/trait/builder_test.go
index 95702bbc8..4ccd434d6 100644
--- a/pkg/trait/builder_test.go
+++ b/pkg/trait/builder_test.go
@@ -255,10 +255,10 @@ func findCustomTaskByName(tasks []v1.Task, name string) v1.Task {
 	return v1.Task{}
 }
 
-func TestMavenProfileBuilderTrait(t *testing.T) {
+func TestMavenProfilesBuilderTrait(t *testing.T) {
 	env := createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategyKaniko, v1.BuildStrategyRoutine)
 	builderTrait := createNominalBuilderTraitTest()
-	builderTrait.MavenProfile = "configmap:maven-profile/owasp-profile.xml"
+	builderTrait.MavenProfiles = []string{"configmap:maven-profile/owasp-profile.xml", "secret:maven-profile-secret"}
 
 	err := builderTrait.Apply(env)
 
@@ -271,5 +271,24 @@ func TestMavenProfileBuilderTrait(t *testing.T) {
 			},
 			Key: "owasp-profile.xml",
 		},
-	}, env.Pipeline[0].Builder.Maven.MavenSpec.Profile)
+	}, env.Pipeline[0].Builder.Maven.MavenSpec.Profiles[0])
+	assert.Equal(t, v1.ValueSource{
+		SecretKeyRef: &corev1.SecretKeySelector{
+			LocalObjectReference: corev1.LocalObjectReference{
+				Name: "maven-profile-secret",
+			},
+			Key: "profile.xml",
+		},
+	}, env.Pipeline[0].Builder.Maven.MavenSpec.Profiles[1])
+}
+
+func TestInvalidMavenProfilesBuilderTrait(t *testing.T) {
+	env := createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategyKaniko, v1.BuildStrategyRoutine)
+	builderTrait := createNominalBuilderTraitTest()
+	builderTrait.MavenProfiles = []string{"fakeprofile"}
+
+	err := builderTrait.Apply(env)
+
+	assert.NotNil(t, err)
+
 }
diff --git a/pkg/util/maven/maven_project.go b/pkg/util/maven/maven_project.go
index 4a75003f4..7eba8f0d0 100644
--- a/pkg/util/maven/maven_project.go
+++ b/pkg/util/maven/maven_project.go
@@ -152,8 +152,8 @@ func (p *Project) AddEncodedDependencyExclusion(gav string, exclusion Exclusion)
 	}
 }
 
-func (p *Project) AddProfile(profile string) {
-	p.Profiles = ProfilesContent{InnerXML: profile}
+func (p *Project) AddProfiles(profiles string) {
+	p.Profiles = ProfilesContent{InnerXML: profiles}
 }
 
 // NewDependency creates an new dependency from the given GAV.
diff --git a/resources/traits.yaml b/resources/traits.yaml
index 6e57c10c6..64b2a0e0e 100755
--- a/resources/traits.yaml
+++ b/resources/traits.yaml
@@ -232,10 +232,10 @@ traits:
     type: string
     description: When using `pod` strategy, the maximum amount of memory required
       by the pod builder.
-  - name: maven-profile
-    type: string
-    description: 'A reference pointing to a configmap/secret that contains a maven
-      profile. The content of the maven profile is expected to be a text containing
+  - name: maven-profiles
+    type: '[]string'
+    description: 'A list of references pointing to configmaps/secrets that contains
+      a maven profile. The content of the maven profile is expected to be a text containing
       a valid maven profile starting with `<profile>` and ending with `</profile>`
       that will be integrated as an inline profile in the POM. Syntax: [configmap|secret]:name[/key],
       where name represents the resource name, key optionally represents the resource