You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2019/06/05 15:59:57 UTC

[camel-k] branch master updated (d179ded -> 6b09af9)

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

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


    from d179ded  Fix #722: filter allowed env variables in Knative
     new 645e1d3  Allow to provide custom settings.xml #715
     new 6b09af9  fix typos

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:
 README.adoc                                        |  56 ++++-
 pkg/apis/camel/v1alpha1/build_types.go             |   1 -
 pkg/apis/camel/v1alpha1/common_types.go            |  14 ++
 .../camel/v1alpha1/integrationplatform_types.go    |   2 +-
 pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go   |  55 ++++-
 pkg/builder/builder_steps.go                       |  96 ++++----
 pkg/builder/builder_steps_test.go                  | 243 +++++++++++----------
 pkg/builder/builder_types.go                       |   7 +-
 pkg/builder/builder_utils.go                       |  42 +---
 pkg/builder/builder_utils_test.go                  |   8 +-
 pkg/builder/kaniko/kaniko.go                       |   2 +
 pkg/builder/s2i/s2i.go                             |   2 +
 pkg/cmd/install.go                                 | 178 +++++++++++----
 pkg/cmd/install_test.go                            |  69 ++++++
 pkg/controller/integrationcontext/build.go         |  12 +-
 pkg/controller/integrationplatform/initialize.go   |   8 -
 pkg/trait/builder_test.go                          |   4 +-
 pkg/trait/rest-dsl.go                              |  86 +++-----
 pkg/util/kubernetes/util.go                        |  44 ++++
 pkg/util/maven/maven.go                            |  84 ++++---
 pkg/util/maven/maven_project.go                    |  39 ++++
 .../maven/{maven_test.go => maven_project_test.go} |  88 ++++----
 .../maven/maven_settings.go}                       |  18 +-
 pkg/util/maven/maven_settings_test.go              |  86 ++++++++
 .../{maven_project_types.go => maven_types.go}     | 173 +++++++++++----
 pkg/util/util.go                                   |  75 ++++---
 26 files changed, 1000 insertions(+), 492 deletions(-)
 create mode 100644 pkg/cmd/install_test.go
 rename pkg/util/maven/{maven_test.go => maven_project_test.go} (78%)
 copy pkg/{apis/camel/v1alpha1/camelcatalog_types_support.go => util/maven/maven_settings.go} (66%)
 create mode 100644 pkg/util/maven/maven_settings_test.go
 rename pkg/util/maven/{maven_project_types.go => maven_types.go} (63%)


[camel-k] 02/02: fix typos

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

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

commit 6b09af9d214cbdb69d3783a979104b3093c56142
Author: lburgazzoli <lb...@gmail.com>
AuthorDate: Tue Jun 4 11:11:16 2019 +0200

    fix typos
---
 pkg/cmd/install.go | 46 +++++++++++++++++++++++-----------------------
 1 file changed, 23 insertions(+), 23 deletions(-)

diff --git a/pkg/cmd/install.go b/pkg/cmd/install.go
index bb93c09..ab91a9e 100644
--- a/pkg/cmd/install.go
+++ b/pkg/cmd/install.go
@@ -80,7 +80,7 @@ func newCmdInstall(rootCmdOptions *RootCmdOptions) *cobra.Command {
 	// maven settings
 	cmd.Flags().StringVar(&impl.localRepository, "local-repository", "", "Location of the local maven repository")
 	cmd.Flags().StringVar(&impl.mavenSettings, "maven-settings", "", "Configure the source of the maven settings (configmap|secret:name[/key])")
-	cmd.Flags().StringSliceVar(&impl.mavenRpositories, "maven-repository", nil, "Add a maven repository")
+	cmd.Flags().StringSliceVar(&impl.mavenRepositories, "maven-repository", nil, "Add a maven repository")
 
 	// completion support
 	configureBashAnnotationForFlag(
@@ -96,23 +96,23 @@ func newCmdInstall(rootCmdOptions *RootCmdOptions) *cobra.Command {
 
 type installCmdOptions struct {
 	*RootCmdOptions
-	wait             bool
-	clusterSetupOnly bool
-	skipClusterSetup bool
-	exampleSetup     bool
-	outputFormat     string
-	camelVersion     string
-	runtimeVersion   string
-	baseImage        string
-	operatorImage    string
-	localRepository  string
-	buildStrategy    string
-	buildTimeout     string
-	mavenRpositories []string
-	mavenSettings    string
-	properties       []string
-	contexts         []string
-	registry         v1alpha1.IntegrationPlatformRegistrySpec
+	wait              bool
+	clusterSetupOnly  bool
+	skipClusterSetup  bool
+	exampleSetup      bool
+	outputFormat      string
+	camelVersion      string
+	runtimeVersion    string
+	baseImage         string
+	operatorImage     string
+	localRepository   string
+	buildStrategy     string
+	buildTimeout      string
+	mavenRepositories []string
+	mavenSettings     string
+	properties        []string
+	contexts          []string
+	registry          v1alpha1.IntegrationPlatformRegistrySpec
 }
 
 // nolint: gocyclo
@@ -201,13 +201,13 @@ func (o *installCmdOptions) install(_ *cobra.Command, _ []string) error {
 			platform.Spec.Build.Timeout.Duration = d
 		}
 
-		if len(o.mavenRpositories) > 0 {
+		if len(o.mavenRepositories) > 0 {
 			o.mavenSettings = fmt.Sprintf("configmap:%s-maven-settings/settings.xml", platform.Name)
 
 			settings := maven.NewSettings()
-			repositories := make([]maven.Repository, 0, len(o.mavenRpositories))
+			repositories := make([]maven.Repository, 0, len(o.mavenRepositories))
 
-			for i, r := range o.mavenRpositories {
+			for i, r := range o.mavenRepositories {
 				repository := maven.NewRepository(r)
 				if repository.ID == "" {
 					repository.ID = fmt.Sprintf("repository-%03d", i)
@@ -356,8 +356,8 @@ func (o *installCmdOptions) validate(_ *cobra.Command, _ []string) error {
 		result = multierr.Append(result, err)
 	}
 
-	if len(o.mavenRpositories) > 0 && o.mavenSettings != "" {
-		result = fmt.Errorf("incompatible options combinations: you canno set both mavenRpository and mavenSettings")
+	if len(o.mavenRepositories) > 0 && o.mavenSettings != "" {
+		result = fmt.Errorf("incompatible options combinations: you cannot set both mavenRepository and mavenSettings")
 	}
 
 	return result


[camel-k] 01/02: Allow to provide custom settings.xml #715

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

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

commit 645e1d399aec41c9d93aee68454a8a913e298ae3
Author: lburgazzoli <lb...@gmail.com>
AuthorDate: Fri May 31 14:45:55 2019 +0200

    Allow to provide custom settings.xml #715
---
 README.adoc                                        |  56 ++++-
 pkg/apis/camel/v1alpha1/build_types.go             |   1 -
 pkg/apis/camel/v1alpha1/common_types.go            |  14 ++
 .../camel/v1alpha1/integrationplatform_types.go    |   2 +-
 pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go   |  55 ++++-
 pkg/builder/builder_steps.go                       |  96 ++++----
 pkg/builder/builder_steps_test.go                  | 243 +++++++++++----------
 pkg/builder/builder_types.go                       |   7 +-
 pkg/builder/builder_utils.go                       |  42 +---
 pkg/builder/builder_utils_test.go                  |   8 +-
 pkg/builder/kaniko/kaniko.go                       |   2 +
 pkg/builder/s2i/s2i.go                             |   2 +
 pkg/cmd/install.go                                 | 178 +++++++++++----
 pkg/cmd/install_test.go                            |  69 ++++++
 pkg/controller/integrationcontext/build.go         |  12 +-
 pkg/controller/integrationplatform/initialize.go   |   8 -
 pkg/trait/builder_test.go                          |   4 +-
 pkg/trait/rest-dsl.go                              |  86 +++-----
 pkg/util/kubernetes/util.go                        |  44 ++++
 pkg/util/maven/maven.go                            |  84 ++++---
 pkg/util/maven/maven_project.go                    |  39 ++++
 .../maven/{maven_test.go => maven_project_test.go} |  88 ++++----
 .../kaniko.go => util/maven/maven_settings.go}     |  44 +---
 pkg/util/maven/maven_settings_test.go              |  86 ++++++++
 .../{maven_project_types.go => maven_types.go}     | 173 +++++++++++----
 pkg/util/util.go                                   |  75 ++++---
 26 files changed, 1003 insertions(+), 515 deletions(-)

diff --git a/README.adoc b/README.adoc
index 0ab236a..7783f7d 100644
--- a/README.adoc
+++ b/README.adoc
@@ -156,14 +156,58 @@ As example if you want to change the queue size of the seda component, you can u
 camel.component.seda.queueSize = 10
 ```
 
-==== Configure additional maven repositories
+==== Configure Maven settings
 
-Additional maven repositories can be defined at platform installation time or at integration/context build time:
+Maven settings can be configured by providing a custom settings.xml through a ConfigMap or secret.
+The source for maven settings can be configured using either the `kamel` CLI at installation time or by editing Camel K's IntegrationPlatform:
+
+- cli:
++
+.Syntax
+[source]
+----
+kamel install --maven-settings=configmap|secret:name[/key]
+----
++
+.Example
+[source]
+----
+kamel cmd --maven-settings=configmap:maven-settings/settings.xml
+----
+
+- IntegrationPlatform:
++
+[source,yaml]
+----
+apiVersion: camel.apache.org/v1alpha1
+kind: IntegrationPlatform
+metadata:
+  labels:
+    app: camel-k
+  name: camel-k
+spec:
+  build:
+    maven:
+      settings:
+        configMapKeyRef:
+          key: settings.xml
+          name: maven-settings
+----
+
+To quickly create a config map you can use the following command:
+
+[source]
+----
+kubectl create configmap maven-settings --from-file=settings.xml
+----
+
+
+As an installation shortcut, additional maven repositories can be alternatively added using the `--maven-repository` option
 
 
 [source]
 ----
-kamel cmd --repository http://repo1.my-company.com --repository http://repo2.my-company.com
+kamel cmd --maven-repository http://repo1.my-company.com --maven-repository http://repo2.my-company.com
 ----
 
 A repository url follow conventions used to configure additional repositories in https://karaf.apache.org[_Apache Karaf_] so it can be appended with zero or more of the following flags:
@@ -174,7 +218,7 @@ A repository url follow conventions used to configure additional repositories in
 
 [source]
 ----
-kamel install --repository http://repository.apache.org/content/groups/snapshots-group@id=apache@snapshots@noreleases
+kamel install --maven-repository http://repository.apache.org/content/groups/snapshots-group@id=apache@snapshots@noreleases
 ----
 
 This results in:
@@ -195,9 +239,9 @@ This results in:
 </repositories>
 ----
 
-[NOTE]
+IMPORTANT
 ====
-The final repositories list is the sum of the repositories defined on the resource (integration/context) and the platform ones
+the options `--maven-settings` and `--maven-repository` are mutually exclusive
 ====
 
 ==== Configure Integration Volumes
diff --git a/pkg/apis/camel/v1alpha1/build_types.go b/pkg/apis/camel/v1alpha1/build_types.go
index f06f1ca..7a511d5 100644
--- a/pkg/apis/camel/v1alpha1/build_types.go
+++ b/pkg/apis/camel/v1alpha1/build_types.go
@@ -20,7 +20,6 @@ type BuildSpec struct {
 	Sources        []SourceSpec            `json:"sources,omitempty"`
 	Resources      []ResourceSpec          `json:"resources,omitempty"`
 	Dependencies   []string                `json:"dependencies,omitempty"`
-	Repositories   []string                `json:"repositories,omitempty"`
 	BuildDir       string                  `json:"buildDir,omitempty"`
 }
 
diff --git a/pkg/apis/camel/v1alpha1/common_types.go b/pkg/apis/camel/v1alpha1/common_types.go
index c16aca6..4a927dd 100644
--- a/pkg/apis/camel/v1alpha1/common_types.go
+++ b/pkg/apis/camel/v1alpha1/common_types.go
@@ -18,6 +18,7 @@ limitations under the License.
 package v1alpha1
 
 import (
+	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
@@ -71,3 +72,16 @@ type TraitSpec struct {
 type Configurable interface {
 	Configurations() []ConfigurationSpec
 }
+
+// MavenSpec --
+type MavenSpec struct {
+	Settings ValueSource `json:"settings,omitempty"`
+}
+
+// ValueSource --
+type ValueSource struct {
+	// Selects a key of a ConfigMap.
+	ConfigMapKeyRef *corev1.ConfigMapKeySelector `json:"configMapKeyRef,omitempty"`
+	// Selects a key of a secret.
+	SecretKeyRef *corev1.SecretKeySelector `json:"secretKeyRef,omitempty" `
+}
diff --git a/pkg/apis/camel/v1alpha1/integrationplatform_types.go b/pkg/apis/camel/v1alpha1/integrationplatform_types.go
index a07b69e..653a63d 100644
--- a/pkg/apis/camel/v1alpha1/integrationplatform_types.go
+++ b/pkg/apis/camel/v1alpha1/integrationplatform_types.go
@@ -80,10 +80,10 @@ type IntegrationPlatformBuildSpec struct {
 	BaseImage             string                                  `json:"baseImage,omitempty"`
 	Properties            map[string]string                       `json:"properties,omitempty"`
 	LocalRepository       string                                  `json:"localRepository,omitempty"`
-	Repositories          []string                                `json:"repositories,omitempty"`
 	Registry              IntegrationPlatformRegistrySpec         `json:"registry,omitempty"`
 	Timeout               metav1.Duration                         `json:"timeout,omitempty"`
 	PersistentVolumeClaim string                                  `json:"persistentVolumeClaim,omitempty"`
+	Maven                 MavenSpec                               `json:"maven,omitempty"`
 }
 
 // IntegrationPlatformRegistrySpec --
diff --git a/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
index 1233a9e..fab12d9 100644
--- a/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/camel/v1alpha1/zz_generated.deepcopy.go
@@ -5,6 +5,7 @@
 package v1alpha1
 
 import (
+	v1 "k8s.io/api/core/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 )
 
@@ -110,11 +111,6 @@ func (in *BuildSpec) DeepCopyInto(out *BuildSpec) {
 		*out = make([]string, len(*in))
 		copy(*out, *in)
 	}
-	if in.Repositories != nil {
-		in, out := &in.Repositories, &out.Repositories
-		*out = make([]string, len(*in))
-		copy(*out, *in)
-	}
 	return
 }
 
@@ -681,13 +677,9 @@ func (in *IntegrationPlatformBuildSpec) DeepCopyInto(out *IntegrationPlatformBui
 			(*out)[key] = val
 		}
 	}
-	if in.Repositories != nil {
-		in, out := &in.Repositories, &out.Repositories
-		*out = make([]string, len(*in))
-		copy(*out, *in)
-	}
 	out.Registry = in.Registry
 	out.Timeout = in.Timeout
+	in.Maven.DeepCopyInto(&out.Maven)
 	return
 }
 
@@ -907,6 +899,23 @@ func (in *IntegrationStatus) DeepCopy() *IntegrationStatus {
 }
 
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *MavenSpec) DeepCopyInto(out *MavenSpec) {
+	*out = *in
+	in.Settings.DeepCopyInto(&out.Settings)
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MavenSpec.
+func (in *MavenSpec) DeepCopy() *MavenSpec {
+	if in == nil {
+		return nil
+	}
+	out := new(MavenSpec)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *ResourceSpec) DeepCopyInto(out *ResourceSpec) {
 	*out = *in
 	out.DataSpec = in.DataSpec
@@ -978,3 +987,29 @@ func (in *TraitSpec) DeepCopy() *TraitSpec {
 	in.DeepCopyInto(out)
 	return out
 }
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ValueSource) DeepCopyInto(out *ValueSource) {
+	*out = *in
+	if in.ConfigMapKeyRef != nil {
+		in, out := &in.ConfigMapKeyRef, &out.ConfigMapKeyRef
+		*out = new(v1.ConfigMapKeySelector)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.SecretKeyRef != nil {
+		in, out := &in.SecretKeyRef, &out.SecretKeyRef
+		*out = new(v1.SecretKeySelector)
+		(*in).DeepCopyInto(*out)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ValueSource.
+func (in *ValueSource) DeepCopy() *ValueSource {
+	if in == nil {
+		return nil
+	}
+	out := new(ValueSource)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/pkg/builder/builder_steps.go b/pkg/builder/builder_steps.go
index d9494ab..0b50b15 100644
--- a/pkg/builder/builder_steps.go
+++ b/pkg/builder/builder_steps.go
@@ -25,6 +25,8 @@ import (
 	"reflect"
 	"strings"
 
+	"github.com/apache/camel-k/pkg/util/kubernetes"
+
 	k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
 
 	"github.com/scylladb/go-set/strset"
@@ -45,25 +47,31 @@ func init() {
 }
 
 type steps struct {
-	GenerateProject      Step
-	InjectDependencies   Step
-	SanitizeDependencies Step
-	ComputeDependencies  Step
-	StandardPackager     Step
-	IncrementalPackager  Step
+	GenerateProject         Step
+	GenerateProjectSettings Step
+	InjectDependencies      Step
+	SanitizeDependencies    Step
+	ComputeDependencies     Step
+	StandardPackager        Step
+	IncrementalPackager     Step
 }
 
+// Steps --
 var Steps = steps{
 	GenerateProject: NewStep(
 		ProjectGenerationPhase,
 		generateProject,
 	),
-	InjectDependencies: NewStep(
+	GenerateProjectSettings: NewStep(
 		ProjectGenerationPhase+1,
+		generateProjectSettings,
+	),
+	InjectDependencies: NewStep(
+		ProjectGenerationPhase+2,
 		injectDependencies,
 	),
 	SanitizeDependencies: NewStep(
-		ProjectGenerationPhase+2,
+		ProjectGenerationPhase+3,
 		sanitizeDependencies,
 	),
 	ComputeDependencies: NewStep(
@@ -80,6 +88,7 @@ var Steps = steps{
 	),
 }
 
+// RegisterSteps --
 func RegisterSteps(steps interface{}) {
 	v := reflect.ValueOf(steps)
 	t := reflect.TypeOf(steps)
@@ -107,16 +116,16 @@ func registerStep(steps ...Step) {
 
 // generateProject --
 func generateProject(ctx *Context) error {
-	p, err := NewProject(ctx)
+	p, err := NewMavenProject(ctx)
 	if err != nil {
 		return err
 	}
 
-	ctx.Project = p
+	ctx.Maven.Project = p
 	//
 	// set-up dependencies
 	//
-	ctx.Project.AddDependencyGAV("org.apache.camel.k", "camel-k-runtime-jvm", ctx.Build.RuntimeVersion)
+	ctx.Maven.Project.AddDependencyGAV("org.apache.camel.k", "camel-k-runtime-jvm", ctx.Build.RuntimeVersion)
 
 	for _, d := range ctx.Build.Dependencies {
 		switch {
@@ -127,7 +136,7 @@ func generateProject(ctx *Context) error {
 				artifactID = "camel-" + artifactID
 			}
 
-			ctx.Project.AddDependencyGAV("org.apache.camel", artifactID, "")
+			ctx.Maven.Project.AddDependencyGAV("org.apache.camel", artifactID, "")
 		case strings.HasPrefix(d, "camel-k:"):
 			artifactID := strings.TrimPrefix(d, "camel-k:")
 
@@ -135,16 +144,16 @@ func generateProject(ctx *Context) error {
 				artifactID = "camel-" + artifactID
 			}
 
-			ctx.Project.AddDependencyGAV("org.apache.camel.k", artifactID, ctx.Build.RuntimeVersion)
+			ctx.Maven.Project.AddDependencyGAV("org.apache.camel.k", artifactID, ctx.Build.RuntimeVersion)
 		case strings.HasPrefix(d, "mvn:"):
 			mid := strings.TrimPrefix(d, "mvn:")
 			gav := strings.Replace(mid, "/", ":", -1)
 
-			ctx.Project.AddEncodedDependencyGAV(gav)
+			ctx.Maven.Project.AddEncodedDependencyGAV(gav)
 		case strings.HasPrefix(d, "runtime:"):
 			artifactID := strings.Replace(d, "runtime:", "camel-k-runtime-", 1)
 
-			ctx.Project.AddDependencyGAV("org.apache.camel.k", artifactID, ctx.Build.RuntimeVersion)
+			ctx.Maven.Project.AddDependencyGAV("org.apache.camel.k", artifactID, ctx.Build.RuntimeVersion)
 		case strings.HasPrefix(d, "bom:"):
 			// no-op
 		default:
@@ -153,7 +162,7 @@ func generateProject(ctx *Context) error {
 	}
 
 	// Add Log4j 2 SLF4J binding as default logging impl
-	ctx.Project.AddDependency(maven.Dependency{
+	ctx.Maven.Project.AddDependency(maven.Dependency{
 		GroupID:    "org.apache.logging.log4j",
 		ArtifactID: "log4j-slf4j-impl",
 		Version:    "2.11.2",
@@ -163,12 +172,25 @@ func generateProject(ctx *Context) error {
 	return nil
 }
 
+// generateProjectSettings --
+func generateProjectSettings(ctx *Context) error {
+	val, err := kubernetes.ResolveValueSource(ctx.C, ctx.Client, ctx.Namespace, &ctx.Build.Platform.Build.Maven.Settings)
+	if err != nil {
+		return err
+	}
+	if val != "" {
+		ctx.Maven.SettingsData = []byte(val)
+	}
+
+	return nil
+}
+
 func injectDependencies(ctx *Context) error {
 	//
 	// Add dependencies from catalog
 	//
-	deps := make([]maven.Dependency, len(ctx.Project.Dependencies))
-	copy(deps, ctx.Project.Dependencies)
+	deps := make([]maven.Dependency, len(ctx.Maven.Project.Dependencies))
+	copy(deps, ctx.Maven.Project.Dependencies)
 
 	for _, d := range deps {
 		if a, ok := ctx.Catalog.Artifacts[d.ArtifactID]; ok {
@@ -178,7 +200,7 @@ func injectDependencies(ctx *Context) error {
 					ArtifactID: dep.ArtifactID,
 				}
 
-				ctx.Project.AddDependency(md)
+				ctx.Maven.Project.AddDependency(md)
 
 				for _, e := range dep.Exclusions {
 					me := maven.Exclusion{
@@ -186,7 +208,7 @@ func injectDependencies(ctx *Context) error {
 						ArtifactID: e.ArtifactID,
 					}
 
-					ctx.Project.AddDependencyExclusion(md, me)
+					ctx.Maven.Project.AddDependencyExclusion(md, me)
 				}
 			}
 		}
@@ -194,8 +216,8 @@ func injectDependencies(ctx *Context) error {
 	//
 	// post process dependencies
 	//
-	deps = make([]maven.Dependency, len(ctx.Project.Dependencies))
-	copy(deps, ctx.Project.Dependencies)
+	deps = make([]maven.Dependency, len(ctx.Maven.Project.Dependencies))
+	copy(deps, ctx.Maven.Project.Dependencies)
 
 	for _, d := range deps {
 		if a, ok := ctx.Catalog.Artifacts[d.ArtifactID]; ok {
@@ -210,7 +232,7 @@ func injectDependencies(ctx *Context) error {
 					ArtifactID: e.ArtifactID,
 				}
 
-				ctx.Project.AddDependencyExclusion(md, me)
+				ctx.Maven.Project.AddDependencyExclusion(md, me)
 			}
 		}
 	}
@@ -219,21 +241,21 @@ func injectDependencies(ctx *Context) error {
 }
 
 func sanitizeDependencies(ctx *Context) error {
-	for i := 0; i < len(ctx.Project.Dependencies); i++ {
-		dep := ctx.Project.Dependencies[i]
+	for i := 0; i < len(ctx.Maven.Project.Dependencies); i++ {
+		dep := ctx.Maven.Project.Dependencies[i]
 
 		switch dep.GroupID {
 		case "org.apache.camel":
 			//
 			// Remove the version so we force using the one configured by the bom
 			//
-			ctx.Project.Dependencies[i].Version = ""
+			ctx.Maven.Project.Dependencies[i].Version = ""
 		case "org.apache.camel.k":
 			//
 			// Force every runtime dependency to have the required version discardin
 			// any version eventually set on the catalog
 			//
-			ctx.Project.Dependencies[i].Version = ctx.Build.RuntimeVersion
+			ctx.Maven.Project.Dependencies[i].Version = ctx.Build.RuntimeVersion
 		}
 	}
 
@@ -241,23 +263,17 @@ func sanitizeDependencies(ctx *Context) error {
 }
 
 func computeDependencies(ctx *Context) error {
-	p := path.Join(ctx.Path, "maven")
-
-	err := maven.CreateStructure(p, ctx.Project)
-	if err != nil {
-		return err
-	}
+	mc := maven.NewContext(path.Join(ctx.Path, "maven"), ctx.Maven.Project)
+	mc.Settings = ctx.Maven.Settings
+	mc.SettingsData = ctx.Maven.SettingsData
+	mc.AddArguments(maven.ExtraOptions(ctx.Build.Platform.Build.LocalRepository)...)
+	mc.AddArgumentf("org.apache.camel.k:camel-k-maven-plugin:%s:generate-dependency-list", ctx.Build.RuntimeVersion)
 
-	opts := make([]string, 0, 2)
-	opts = append(opts, maven.ExtraOptions(ctx.Build.Platform.Build.LocalRepository)...)
-	opts = append(opts, fmt.Sprintf("org.apache.camel.k:camel-k-maven-plugin:%s:generate-dependency-list", ctx.Build.RuntimeVersion))
-
-	err = maven.Run(p, opts...)
-	if err != nil {
+	if err := maven.Run(mc); err != nil {
 		return errors.Wrap(err, "failure while determining classpath")
 	}
 
-	dependencies := path.Join(p, "target", "dependencies.yaml")
+	dependencies := path.Join(mc.Path, "target", "dependencies.yaml")
 	content, err := ioutil.ReadFile(dependencies)
 	if err != nil {
 		return err
diff --git a/pkg/builder/builder_steps_test.go b/pkg/builder/builder_steps_test.go
index dcdfd12..b576f8d 100644
--- a/pkg/builder/builder_steps_test.go
+++ b/pkg/builder/builder_steps_test.go
@@ -20,6 +20,7 @@ package builder
 import (
 	"testing"
 
+	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
@@ -50,7 +51,7 @@ func TestRegisterDuplicatedSteps(t *testing.T) {
 	})
 }
 
-func TestMavenRepositories(t *testing.T) {
+func TestGenerateJvmProject(t *testing.T) {
 	catalog, err := test.DefaultCatalog()
 	assert.Nil(t, err)
 
@@ -66,10 +67,6 @@ func TestMavenRepositories(t *testing.T) {
 			Dependencies: []string{
 				"runtime:jvm",
 			},
-			Repositories: []string{
-				"https://repository.apache.org/content/repositories/snapshots@id=apache.snapshots@snapshots@noreleases",
-				"https://oss.sonatype.org/content/repositories/snapshots/@id=sonatype.snapshots@snapshots",
-			},
 		},
 	}
 
@@ -78,90 +75,134 @@ func TestMavenRepositories(t *testing.T) {
 	err = injectDependencies(&ctx)
 	assert.Nil(t, err)
 
-	assert.Equal(t, 2, len(ctx.Project.Repositories))
-	assert.Equal(t, 2, len(ctx.Project.PluginRepositories))
+	assert.Equal(t, 1, len(ctx.Maven.Project.DependencyManagement.Dependencies))
+	assert.Equal(t, "org.apache.camel", ctx.Maven.Project.DependencyManagement.Dependencies[0].GroupID)
+	assert.Equal(t, "camel-bom", ctx.Maven.Project.DependencyManagement.Dependencies[0].ArtifactID)
+	assert.Equal(t, catalog.Version, ctx.Maven.Project.DependencyManagement.Dependencies[0].Version)
+	assert.Equal(t, "pom", ctx.Maven.Project.DependencyManagement.Dependencies[0].Type)
+	assert.Equal(t, "import", ctx.Maven.Project.DependencyManagement.Dependencies[0].Scope)
 
-	assert.Contains(t, ctx.Project.Repositories, maven.Repository{
-		ID:        "apache.snapshots",
-		URL:       "https://repository.apache.org/content/repositories/snapshots",
-		Snapshots: maven.RepositoryPolicy{Enabled: true},
-		Releases:  maven.RepositoryPolicy{Enabled: false},
+	assert.Equal(t, 4, len(ctx.Maven.Project.Dependencies))
+	assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
+		GroupID:    "org.apache.camel.k",
+		ArtifactID: "camel-k-runtime-jvm",
+		Version:    defaults.RuntimeVersion,
+		Type:       "jar",
 	})
-
-	assert.Contains(t, ctx.Project.Repositories, maven.Repository{
-		ID:        "sonatype.snapshots",
-		URL:       "https://oss.sonatype.org/content/repositories/snapshots/",
-		Snapshots: maven.RepositoryPolicy{Enabled: true},
-		Releases:  maven.RepositoryPolicy{Enabled: true},
+	assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
+		GroupID:    "org.apache.camel",
+		ArtifactID: "camel-core",
 	})
-
-	assert.Contains(t, ctx.Project.PluginRepositories, maven.Repository{
-		ID:        "apache.snapshots",
-		URL:       "https://repository.apache.org/content/repositories/snapshots",
-		Snapshots: maven.RepositoryPolicy{Enabled: true},
-		Releases:  maven.RepositoryPolicy{Enabled: false},
+	assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
+		GroupID:    "org.apache.camel.k",
+		ArtifactID: "camel-k-adapter-camel-2",
 	})
-
-	assert.Contains(t, ctx.Project.PluginRepositories, maven.Repository{
-		ID:        "sonatype.snapshots",
-		URL:       "https://oss.sonatype.org/content/repositories/snapshots/",
-		Snapshots: maven.RepositoryPolicy{Enabled: true},
-		Releases:  maven.RepositoryPolicy{Enabled: true},
+	assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
+		GroupID:    "org.apache.logging.log4j",
+		ArtifactID: "log4j-slf4j-impl",
+		Version:    "2.11.2",
+		Scope:      "runtime",
 	})
 }
 
-func TestGenerateJvmProject(t *testing.T) {
+func TestMavenSettingsFromConfigMap(t *testing.T) {
 	catalog, err := test.DefaultCatalog()
 	assert.Nil(t, err)
 
+	c, err := test.NewFakeClient(
+		&corev1.ConfigMap{
+			TypeMeta: metav1.TypeMeta{
+				APIVersion: "v1",
+				Kind:       "ConfigMap",
+			},
+			ObjectMeta: metav1.ObjectMeta{
+				Namespace: "ns",
+				Name:      "maven-settings",
+			},
+			Data: map[string]string{
+				"settings.xml": "setting-data",
+			},
+		},
+	)
+
 	ctx := Context{
-		Catalog: catalog,
+		Catalog:   catalog,
+		Client:    c,
+		Namespace: "ns",
 		Build: v1alpha1.BuildSpec{
 			RuntimeVersion: defaults.RuntimeVersion,
 			Platform: v1alpha1.IntegrationPlatformSpec{
 				Build: v1alpha1.IntegrationPlatformBuildSpec{
 					CamelVersion: catalog.Version,
+					Maven: v1alpha1.MavenSpec{
+						Settings: v1alpha1.ValueSource{
+							ConfigMapKeyRef: &corev1.ConfigMapKeySelector{
+								LocalObjectReference: corev1.LocalObjectReference{
+									Name: "maven-settings",
+								},
+								Key: "settings.xml",
+							},
+						},
+					},
 				},
 			},
-			Dependencies: []string{
-				"runtime:jvm",
-			},
 		},
 	}
 
-	err = generateProject(&ctx)
+	err = generateProjectSettings(&ctx)
 	assert.Nil(t, err)
-	err = injectDependencies(&ctx)
+
+	assert.Equal(t, []byte("setting-data"), ctx.Maven.SettingsData)
+}
+
+func TestMavenSettingsFromSecret(t *testing.T) {
+	catalog, err := test.DefaultCatalog()
 	assert.Nil(t, err)
 
-	assert.Equal(t, 1, len(ctx.Project.DependencyManagement.Dependencies))
-	assert.Equal(t, "org.apache.camel", ctx.Project.DependencyManagement.Dependencies[0].GroupID)
-	assert.Equal(t, "camel-bom", ctx.Project.DependencyManagement.Dependencies[0].ArtifactID)
-	assert.Equal(t, catalog.Version, ctx.Project.DependencyManagement.Dependencies[0].Version)
-	assert.Equal(t, "pom", ctx.Project.DependencyManagement.Dependencies[0].Type)
-	assert.Equal(t, "import", ctx.Project.DependencyManagement.Dependencies[0].Scope)
+	c, err := test.NewFakeClient(
+		&corev1.Secret{
+			TypeMeta: metav1.TypeMeta{
+				APIVersion: "v1",
+				Kind:       "Secret",
+			},
+			ObjectMeta: metav1.ObjectMeta{
+				Namespace: "ns",
+				Name:      "maven-settings",
+			},
+			Data: map[string][]byte{
+				"settings.xml": []byte("setting-data"),
+			},
+		},
+	)
 
-	assert.Equal(t, 4, len(ctx.Project.Dependencies))
-	assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
-		GroupID:    "org.apache.camel.k",
-		ArtifactID: "camel-k-runtime-jvm",
-		Version:    defaults.RuntimeVersion,
-		Type:       "jar",
-	})
-	assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
-		GroupID:    "org.apache.camel",
-		ArtifactID: "camel-core",
-	})
-	assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
-		GroupID:    "org.apache.camel.k",
-		ArtifactID: "camel-k-adapter-camel-2",
-	})
-	assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
-		GroupID:    "org.apache.logging.log4j",
-		ArtifactID: "log4j-slf4j-impl",
-		Version:    "2.11.2",
-		Scope:      "runtime",
-	})
+	ctx := Context{
+		Catalog:   catalog,
+		Client:    c,
+		Namespace: "ns",
+		Build: v1alpha1.BuildSpec{
+			RuntimeVersion: defaults.RuntimeVersion,
+			Platform: v1alpha1.IntegrationPlatformSpec{
+				Build: v1alpha1.IntegrationPlatformBuildSpec{
+					CamelVersion: catalog.Version,
+					Maven: v1alpha1.MavenSpec{
+						Settings: v1alpha1.ValueSource{
+							SecretKeyRef: &corev1.SecretKeySelector{
+								LocalObjectReference: corev1.LocalObjectReference{
+									Name: "maven-settings",
+								},
+								Key: "settings.xml",
+							},
+						},
+					},
+				},
+			},
+		},
+	}
+
+	err = generateProjectSettings(&ctx)
+	assert.Nil(t, err)
+
+	assert.Equal(t, []byte("setting-data"), ctx.Maven.SettingsData)
 }
 
 func TestGenerateGroovyProject(t *testing.T) {
@@ -188,40 +229,40 @@ func TestGenerateGroovyProject(t *testing.T) {
 	err = injectDependencies(&ctx)
 	assert.Nil(t, err)
 
-	assert.Equal(t, 1, len(ctx.Project.DependencyManagement.Dependencies))
-	assert.Equal(t, "org.apache.camel", ctx.Project.DependencyManagement.Dependencies[0].GroupID)
-	assert.Equal(t, "camel-bom", ctx.Project.DependencyManagement.Dependencies[0].ArtifactID)
-	assert.Equal(t, catalog.Version, ctx.Project.DependencyManagement.Dependencies[0].Version)
-	assert.Equal(t, "pom", ctx.Project.DependencyManagement.Dependencies[0].Type)
-	assert.Equal(t, "import", ctx.Project.DependencyManagement.Dependencies[0].Scope)
+	assert.Equal(t, 1, len(ctx.Maven.Project.DependencyManagement.Dependencies))
+	assert.Equal(t, "org.apache.camel", ctx.Maven.Project.DependencyManagement.Dependencies[0].GroupID)
+	assert.Equal(t, "camel-bom", ctx.Maven.Project.DependencyManagement.Dependencies[0].ArtifactID)
+	assert.Equal(t, catalog.Version, ctx.Maven.Project.DependencyManagement.Dependencies[0].Version)
+	assert.Equal(t, "pom", ctx.Maven.Project.DependencyManagement.Dependencies[0].Type)
+	assert.Equal(t, "import", ctx.Maven.Project.DependencyManagement.Dependencies[0].Scope)
 
-	assert.Equal(t, 6, len(ctx.Project.Dependencies))
+	assert.Equal(t, 6, len(ctx.Maven.Project.Dependencies))
 
-	assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+	assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
 		GroupID:    "org.apache.camel.k",
 		ArtifactID: "camel-k-runtime-jvm",
 		Version:    defaults.RuntimeVersion,
 		Type:       "jar",
 	})
-	assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+	assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
 		GroupID:    "org.apache.camel.k",
 		ArtifactID: "camel-k-runtime-groovy",
 		Version:    defaults.RuntimeVersion,
 		Type:       "jar",
 	})
-	assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+	assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
 		GroupID:    "org.apache.camel",
 		ArtifactID: "camel-core",
 	})
-	assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+	assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
 		GroupID:    "org.apache.camel.k",
 		ArtifactID: "camel-k-adapter-camel-2",
 	})
-	assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+	assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
 		GroupID:    "org.apache.camel",
 		ArtifactID: "camel-groovy",
 	})
-	assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+	assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
 		GroupID:    "org.apache.logging.log4j",
 		ArtifactID: "log4j-slf4j-impl",
 		Version:    "2.11.2",
@@ -229,46 +270,6 @@ func TestGenerateGroovyProject(t *testing.T) {
 	})
 }
 
-func TestGenerateProjectWithRepositories(t *testing.T) {
-	catalog, err := test.DefaultCatalog()
-	assert.Nil(t, err)
-
-	ctx := Context{
-		Catalog: catalog,
-		Build: v1alpha1.BuildSpec{
-			Platform: v1alpha1.IntegrationPlatformSpec{
-				Build: v1alpha1.IntegrationPlatformBuildSpec{
-					CamelVersion: catalog.Version,
-				},
-			},
-			Repositories: []string{
-				"https://repository.apache.org/content/groups/snapshots-group@id=apache-snapshots@snapshots@noreleases",
-				"https://oss.sonatype.org/content/repositories/ops4j-snapshots@id=ops4j-snapshots@snapshots@noreleases",
-			},
-		},
-	}
-
-	err = generateProject(&ctx)
-	assert.Nil(t, err)
-	err = injectDependencies(&ctx)
-	assert.Nil(t, err)
-
-	assert.Equal(t, 1, len(ctx.Project.DependencyManagement.Dependencies))
-	assert.Equal(t, "org.apache.camel", ctx.Project.DependencyManagement.Dependencies[0].GroupID)
-	assert.Equal(t, "camel-bom", ctx.Project.DependencyManagement.Dependencies[0].ArtifactID)
-	assert.Equal(t, catalog.Version, ctx.Project.DependencyManagement.Dependencies[0].Version)
-	assert.Equal(t, "pom", ctx.Project.DependencyManagement.Dependencies[0].Type)
-	assert.Equal(t, "import", ctx.Project.DependencyManagement.Dependencies[0].Scope)
-
-	assert.Equal(t, 2, len(ctx.Project.Repositories))
-	assert.Equal(t, "apache-snapshots", ctx.Project.Repositories[0].ID)
-	assert.False(t, ctx.Project.Repositories[0].Releases.Enabled)
-	assert.True(t, ctx.Project.Repositories[0].Snapshots.Enabled)
-	assert.Equal(t, "ops4j-snapshots", ctx.Project.Repositories[1].ID)
-	assert.False(t, ctx.Project.Repositories[1].Releases.Enabled)
-	assert.True(t, ctx.Project.Repositories[1].Snapshots.Enabled)
-}
-
 func TestSanitizeDependencies(t *testing.T) {
 	catalog, err := test.DefaultCatalog()
 	assert.Nil(t, err)
@@ -298,23 +299,23 @@ func TestSanitizeDependencies(t *testing.T) {
 	err = sanitizeDependencies(&ctx)
 	assert.Nil(t, err)
 
-	assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+	assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
 		GroupID:    "org.apache.camel.k",
 		ArtifactID: "camel-k-runtime-jvm",
 		Version:    defaults.RuntimeVersion,
 		Type:       "jar",
 	})
-	assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+	assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
 		GroupID:    "org.apache.camel",
 		ArtifactID: "camel-core",
 		Type:       "jar",
 	})
-	assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+	assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
 		GroupID:    "org.apache.camel",
 		ArtifactID: "camel-undertow",
 		Type:       "jar",
 	})
-	assert.Contains(t, ctx.Project.Dependencies, maven.Dependency{
+	assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
 		GroupID:    "com.mycompany",
 		ArtifactID: "my-dep",
 		Version:    "1.2.3",
diff --git a/pkg/builder/builder_types.go b/pkg/builder/builder_types.go
index 9cf17d1..549e9aa 100644
--- a/pkg/builder/builder_types.go
+++ b/pkg/builder/builder_types.go
@@ -107,13 +107,18 @@ type Context struct {
 	PublicImage       string
 	Error             error
 	Namespace         string
-	Project           maven.Project
 	Path              string
 	Artifacts         []v1alpha1.Artifact
 	SelectedArtifacts []v1alpha1.Artifact
 	Archive           string
 	ContextFilter     func(integrationContext *v1alpha1.IntegrationContext) bool
 	Resources         []Resource
+
+	Maven struct {
+		Project      maven.Project
+		Settings     *maven.Settings
+		SettingsData []byte
+	}
 }
 
 // HasRequiredImage --
diff --git a/pkg/builder/builder_utils.go b/pkg/builder/builder_utils.go
index 2093566..571bece 100644
--- a/pkg/builder/builder_utils.go
+++ b/pkg/builder/builder_utils.go
@@ -18,8 +18,6 @@ limitations under the License.
 package builder
 
 import (
-	"encoding/xml"
-	"fmt"
 	"strings"
 
 	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
@@ -28,6 +26,7 @@ import (
 	"github.com/apache/camel-k/pkg/util/maven"
 )
 
+// StepIDsFor --
 func StepIDsFor(steps ...Step) []string {
 	IDs := make([]string, 0)
 	for _, step := range steps {
@@ -46,8 +45,8 @@ func artifactIDs(artifacts []v1alpha1.Artifact) []string {
 	return result
 }
 
-// NewProject --
-func NewProject(ctx *Context) (maven.Project, error) {
+// NewMavenProject --
+func NewMavenProject(ctx *Context) (maven.Project, error) {
 	//
 	// Catalog
 	//
@@ -60,19 +59,11 @@ func NewProject(ctx *Context) (maven.Project, error) {
 		ctx.Catalog = c
 	}
 
-	p := maven.Project{
-		XMLName:              xml.Name{Local: "project"},
-		XMLNs:                "http://maven.apache.org/POM/4.0.0",
-		XMLNsXsi:             "http://www.w3.org/2001/XMLSchema-instance",
-		XsiSchemaLocation:    "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd",
-		ModelVersion:         "4.0.0",
-		GroupID:              "org.apache.camel.k.integration",
-		ArtifactID:           "camel-k-integration",
-		Version:              defaults.Version,
-		Properties:           ctx.Build.Platform.Build.Properties,
-		DependencyManagement: maven.DependencyManagement{Dependencies: make([]maven.Dependency, 0)},
-		Dependencies:         make([]maven.Dependency, 0),
-	}
+	p := maven.NewProjectWithGAV("org.apache.camel.k.integration", "camel-k-integration", defaults.Version)
+	p.Properties = ctx.Build.Platform.Build.Properties
+	p.DependencyManagement = maven.DependencyManagement{Dependencies: make([]maven.Dependency, 0)}
+	p.Dependencies = make([]maven.Dependency, 0)
+
 	//
 	// DependencyManagement
 	//
@@ -103,23 +94,6 @@ func NewProject(ctx *Context) (maven.Project, error) {
 			})
 		}
 	}
-	//p.DependencyManagement.Dependencies = dm
-
-	//
-	// Repositories
-	//
-	p.Repositories = make([]maven.Repository, 0, len(ctx.Build.Repositories))
-	p.PluginRepositories = make([]maven.Repository, 0, len(ctx.Build.Repositories))
-
-	for i, r := range ctx.Build.Repositories {
-		repo := maven.NewRepository(r)
-		if repo.ID == "" {
-			repo.ID = fmt.Sprintf("repo-%03d", i)
-		}
-
-		p.Repositories = append(p.Repositories, repo)
-		p.PluginRepositories = append(p.PluginRepositories, repo)
-	}
 
 	return p, nil
 }
diff --git a/pkg/builder/builder_utils_test.go b/pkg/builder/builder_utils_test.go
index 1491d51..5bd0075 100644
--- a/pkg/builder/builder_utils_test.go
+++ b/pkg/builder/builder_utils_test.go
@@ -52,22 +52,22 @@ func TestNewProject(t *testing.T) {
 	err = generateProject(&ctx)
 	assert.Nil(t, err)
 
-	assert.Len(t, ctx.Project.DependencyManagement.Dependencies, 3)
-	assert.Contains(t, ctx.Project.DependencyManagement.Dependencies, maven.Dependency{
+	assert.Len(t, ctx.Maven.Project.DependencyManagement.Dependencies, 3)
+	assert.Contains(t, ctx.Maven.Project.DependencyManagement.Dependencies, maven.Dependency{
 		GroupID:    "org.apache.camel",
 		ArtifactID: "camel-bom",
 		Version:    ctx.Catalog.Version,
 		Type:       "pom",
 		Scope:      "import",
 	})
-	assert.Contains(t, ctx.Project.DependencyManagement.Dependencies, maven.Dependency{
+	assert.Contains(t, ctx.Maven.Project.DependencyManagement.Dependencies, maven.Dependency{
 		GroupID:    "my.company",
 		ArtifactID: "my-artifact-1",
 		Version:    "1.0.0",
 		Type:       "pom",
 		Scope:      "import",
 	})
-	assert.Contains(t, ctx.Project.DependencyManagement.Dependencies, maven.Dependency{
+	assert.Contains(t, ctx.Maven.Project.DependencyManagement.Dependencies, maven.Dependency{
 		GroupID:    "my.company",
 		ArtifactID: "my-artifact-2",
 		Version:    "2.0.0",
diff --git a/pkg/builder/kaniko/kaniko.go b/pkg/builder/kaniko/kaniko.go
index 858799e..f5e53cb 100644
--- a/pkg/builder/kaniko/kaniko.go
+++ b/pkg/builder/kaniko/kaniko.go
@@ -29,6 +29,7 @@ type steps struct {
 	Publisher builder.Step
 }
 
+// Steps --
 var Steps = steps{
 	Publisher: builder.NewStep(
 		builder.ApplicationPublishPhase,
@@ -39,6 +40,7 @@ var Steps = steps{
 // DefaultSteps --
 var DefaultSteps = []builder.Step{
 	builder.Steps.GenerateProject,
+	builder.Steps.GenerateProjectSettings,
 	builder.Steps.InjectDependencies,
 	builder.Steps.SanitizeDependencies,
 	builder.Steps.ComputeDependencies,
diff --git a/pkg/builder/s2i/s2i.go b/pkg/builder/s2i/s2i.go
index 3089a21..d323233 100644
--- a/pkg/builder/s2i/s2i.go
+++ b/pkg/builder/s2i/s2i.go
@@ -30,6 +30,7 @@ type steps struct {
 	ReplaceHost builder.Step
 }
 
+// Steps --
 var Steps = steps{
 	Publisher: builder.NewStep(
 		builder.ApplicationPublishPhase,
@@ -44,6 +45,7 @@ var Steps = steps{
 // DefaultSteps --
 var DefaultSteps = []builder.Step{
 	builder.Steps.GenerateProject,
+	builder.Steps.GenerateProjectSettings,
 	builder.Steps.InjectDependencies,
 	builder.Steps.SanitizeDependencies,
 	builder.Steps.ComputeDependencies,
diff --git a/pkg/cmd/install.go b/pkg/cmd/install.go
index 1a9a9fe..bb93c09 100644
--- a/pkg/cmd/install.go
+++ b/pkg/cmd/install.go
@@ -19,9 +19,14 @@ package cmd
 
 import (
 	"fmt"
+	"regexp"
 	"strings"
 	"time"
 
+	"github.com/apache/camel-k/pkg/util"
+
+	"github.com/apache/camel-k/pkg/util/maven"
+
 	"github.com/apache/camel-k/deploy"
 	"github.com/apache/camel-k/pkg/apis"
 	"go.uber.org/multierr"
@@ -36,7 +41,9 @@ import (
 	"github.com/pkg/errors"
 	"github.com/spf13/cobra"
 
+	corev1 "k8s.io/api/core/v1"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
 func newCmdInstall(rootCmdOptions *RootCmdOptions) *cobra.Command {
@@ -61,9 +68,6 @@ func newCmdInstall(rootCmdOptions *RootCmdOptions) *cobra.Command {
 	cmd.Flags().StringVar(&impl.registry.Address, "registry", "", "A Docker registry that can be used to publish images")
 	cmd.Flags().StringVar(&impl.registry.Secret, "registry-secret", "", "A secret used to push/pull images to the Docker registry")
 	cmd.Flags().BoolVar(&impl.registry.Insecure, "registry-insecure", false, "Configure to configure registry access in insecure mode or not")
-	cmd.Flags().StringSliceVar(&impl.repositories, "repository", nil, "Add a maven repository")
-	cmd.Flags().BoolVar(&impl.snapshotRepositories, "snapshot-repositories", false, "Automatically include known snapshot repositories")
-	cmd.Flags().StringVar(&impl.localRepository, "local-repository", "", "Location of the local maven repository")
 	cmd.Flags().StringSliceVarP(&impl.properties, "property", "p", nil, "Add a camel property")
 	cmd.Flags().StringVar(&impl.camelVersion, "camel-version", "", "Set the camel version")
 	cmd.Flags().StringVar(&impl.runtimeVersion, "runtime-version", "", "Set the camel-k runtime version")
@@ -73,6 +77,11 @@ func newCmdInstall(rootCmdOptions *RootCmdOptions) *cobra.Command {
 	cmd.Flags().StringVar(&impl.buildStrategy, "build-strategy", "", "Set the build strategy")
 	cmd.Flags().StringVar(&impl.buildTimeout, "build-timeout", "", "Set how long the build process can last")
 
+	// maven settings
+	cmd.Flags().StringVar(&impl.localRepository, "local-repository", "", "Location of the local maven repository")
+	cmd.Flags().StringVar(&impl.mavenSettings, "maven-settings", "", "Configure the source of the maven settings (configmap|secret:name[/key])")
+	cmd.Flags().StringSliceVar(&impl.mavenRpositories, "maven-repository", nil, "Add a maven repository")
+
 	// completion support
 	configureBashAnnotationForFlag(
 		&cmd,
@@ -87,23 +96,23 @@ func newCmdInstall(rootCmdOptions *RootCmdOptions) *cobra.Command {
 
 type installCmdOptions struct {
 	*RootCmdOptions
-	wait                 bool
-	clusterSetupOnly     bool
-	skipClusterSetup     bool
-	exampleSetup         bool
-	snapshotRepositories bool
-	outputFormat         string
-	camelVersion         string
-	runtimeVersion       string
-	baseImage            string
-	operatorImage        string
-	localRepository      string
-	buildStrategy        string
-	buildTimeout         string
-	repositories         []string
-	properties           []string
-	contexts             []string
-	registry             v1alpha1.IntegrationPlatformRegistrySpec
+	wait             bool
+	clusterSetupOnly bool
+	skipClusterSetup bool
+	exampleSetup     bool
+	outputFormat     string
+	camelVersion     string
+	runtimeVersion   string
+	baseImage        string
+	operatorImage    string
+	localRepository  string
+	buildStrategy    string
+	buildTimeout     string
+	mavenRpositories []string
+	mavenSettings    string
+	properties       []string
+	contexts         []string
+	registry         v1alpha1.IntegrationPlatformRegistrySpec
 }
 
 // nolint: gocyclo
@@ -164,23 +173,6 @@ func (o *installCmdOptions) install(_ *cobra.Command, _ []string) error {
 		if o.localRepository != "" {
 			platform.Spec.Build.LocalRepository = o.localRepository
 		}
-		if len(o.repositories) > 0 {
-			platform.Spec.Build.Repositories = o.repositories
-		}
-		if o.snapshotRepositories {
-			if platform.Spec.Build.Repositories == nil {
-				platform.Spec.Build.Repositories = make([]string, 0)
-			}
-
-			platform.Spec.Build.Repositories = append(
-				platform.Spec.Build.Repositories,
-				"https://repository.apache.org/content/repositories/snapshots@id=apache.snapshots@snapshots",
-			)
-			platform.Spec.Build.Repositories = append(
-				platform.Spec.Build.Repositories,
-				"https://oss.sonatype.org/content/repositories/snapshots/@id=sonatype.snapshots@snapshots",
-			)
-		}
 		if o.camelVersion != "" {
 			platform.Spec.Build.CamelVersion = o.camelVersion
 		}
@@ -209,6 +201,68 @@ func (o *installCmdOptions) install(_ *cobra.Command, _ []string) error {
 			platform.Spec.Build.Timeout.Duration = d
 		}
 
+		if len(o.mavenRpositories) > 0 {
+			o.mavenSettings = fmt.Sprintf("configmap:%s-maven-settings/settings.xml", platform.Name)
+
+			settings := maven.NewSettings()
+			repositories := make([]maven.Repository, 0, len(o.mavenRpositories))
+
+			for i, r := range o.mavenRpositories {
+				repository := maven.NewRepository(r)
+				if repository.ID == "" {
+					repository.ID = fmt.Sprintf("repository-%03d", i)
+				}
+
+				repositories = append(repositories, repository)
+			}
+
+			settings.Profiles = []maven.Profile{
+				{
+					ID: "maven-settings",
+					Activation: maven.Activation{
+						ActiveByDefault: true,
+					},
+					Repositories: repositories,
+				},
+			}
+
+			data, err := util.EncodeXML(settings)
+			if err != nil {
+				return err
+			}
+
+			cm := corev1.ConfigMap{
+				TypeMeta: metav1.TypeMeta{
+					Kind:       "ConfigMap",
+					APIVersion: "v1",
+				},
+				ObjectMeta: metav1.ObjectMeta{
+					Name:      platform.Name + "-maven-settings",
+					Namespace: namespace,
+					Labels: map[string]string{
+						"app": "camel-k",
+					},
+				},
+				Data: map[string]string{
+					"settings.xml": string(data),
+				},
+			}
+
+			err = install.RuntimeObjectOrCollect(o.Context, c, namespace, collection, &cm)
+			if err != nil {
+				return err
+			}
+		}
+
+		if o.mavenSettings != "" {
+			mavenSettings, err := decodeMavenSettings(o.mavenSettings)
+			if err != nil {
+				return err
+			}
+
+			platform.Spec.Build.Maven.Settings = mavenSettings
+		}
+
 		platform.Spec.Resources.Contexts = o.contexts
 
 		err = install.RuntimeObjectOrCollect(o.Context, c, namespace, collection, platform)
@@ -301,6 +355,11 @@ func (o *installCmdOptions) validate(_ *cobra.Command, _ []string) error {
 		err := errorIfContextIsNotAvailable(schema, context)
 		result = multierr.Append(result, err)
 	}
+
+	if len(o.mavenRpositories) > 0 && o.mavenSettings != "" {
+		result = fmt.Errorf("incompatible options combinations: you canno set both mavenRpository and mavenSettings")
+	}
+
 	return result
 }
 
@@ -322,3 +381,48 @@ func errorIfContextIsNotAvailable(schema *runtime.Scheme, context string) error
 	}
 	return errors.Errorf("Unknown context '%s'", context)
 }
+
+func decodeMavenSettings(mavenSettings string) (v1alpha1.ValueSource, error) {
+	sub := make([]string, 0)
+	rex := regexp.MustCompile(`^(configmap|secret):([a-zA-Z0-9][a-zA-Z0-9-]*)(/([a-zA-Z0-9].*))?$`)
+	hits := rex.FindAllStringSubmatch(mavenSettings, -1)
+
+	for _, hit := range hits {
+		if len(hit) > 1 {
+			for _, match := range hit[1:] {
+				sub = append(sub, match)
+			}
+		}
+	}
+
+	if len(sub) >= 2 {
+		key := "settings.xml"
+
+		if len(sub) == 4 {
+			key = sub[3]
+		}
+
+		if sub[0] == "configmap" {
+			return v1alpha1.ValueSource{
+				ConfigMapKeyRef: &corev1.ConfigMapKeySelector{
+					LocalObjectReference: corev1.LocalObjectReference{
+						Name: sub[1],
+					},
+					Key: key,
+				},
+			}, nil
+		}
+		if sub[0] == "secret" {
+			return v1alpha1.ValueSource{
+				SecretKeyRef: &corev1.SecretKeySelector{
+					LocalObjectReference: corev1.LocalObjectReference{
+						Name: sub[1],
+					},
+					Key: key,
+				},
+			}, nil
+		}
+	}
+
+	return v1alpha1.ValueSource{}, fmt.Errorf("illegal maven setting definition, syntax: configmap|secret:resource-name[/settings path]")
+}
diff --git a/pkg/cmd/install_test.go b/pkg/cmd/install_test.go
new file mode 100644
index 0000000..27a8473
--- /dev/null
+++ b/pkg/cmd/install_test.go
@@ -0,0 +1,69 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package cmd
+
+import (
+	"testing"
+
+	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestDecodeMavenSettings(t *testing.T) {
+	var err error
+	var val v1alpha1.ValueSource
+
+	//
+	// ConfigMap
+	//
+	val, err = decodeMavenSettings("configmap:maven-settings/s.xml")
+	assert.Nil(t, err)
+	assert.Nil(t, val.SecretKeyRef)
+	assert.Equal(t, "maven-settings", val.ConfigMapKeyRef.Name)
+	assert.Equal(t, "s.xml", val.ConfigMapKeyRef.Key)
+
+	val, err = decodeMavenSettings("configmap:maven-settings")
+	assert.Nil(t, err)
+	assert.Nil(t, val.SecretKeyRef)
+	assert.Equal(t, "maven-settings", val.ConfigMapKeyRef.Name)
+	assert.Empty(t, val.ConfigMapKeyRef.Key)
+
+	//
+	// Secrets
+	//
+	val, err = decodeMavenSettings("secret:maven-settings-secret/s.xml")
+	assert.Nil(t, err)
+	assert.Nil(t, val.ConfigMapKeyRef)
+	assert.Equal(t, "maven-settings-secret", val.SecretKeyRef.Name)
+	assert.Equal(t, "s.xml", val.SecretKeyRef.Key)
+
+	val, err = decodeMavenSettings("secret:maven-settings-secret")
+	assert.Nil(t, err)
+	assert.Nil(t, val.ConfigMapKeyRef)
+	assert.Equal(t, "maven-settings-secret", val.SecretKeyRef.Name)
+	assert.Empty(t, val.SecretKeyRef.Key)
+
+	//
+	// Errors
+	//
+	_, err = decodeMavenSettings("something:maven-settings-secret/s.xml")
+	assert.NotNil(t, err)
+	_, err = decodeMavenSettings("secret")
+	assert.NotNil(t, err)
+}
diff --git a/pkg/controller/integrationcontext/build.go b/pkg/controller/integrationcontext/build.go
index 37051bd..65d3b36 100644
--- a/pkg/controller/integrationcontext/build.go
+++ b/pkg/controller/integrationcontext/build.go
@@ -32,7 +32,6 @@ import (
 
 	"github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
 	"github.com/apache/camel-k/pkg/builder"
-	"github.com/apache/camel-k/pkg/platform"
 	"github.com/apache/camel-k/pkg/trait"
 )
 
@@ -75,20 +74,12 @@ func (action *buildAction) handleBuildSubmitted(ctx context.Context, ictx *v1alp
 		build.Status.Phase == v1alpha1.BuildPhaseError ||
 		build.Status.Phase == v1alpha1.BuildPhaseInterrupted ||
 		build.Status.Phase == v1alpha1.BuildPhaseSucceeded {
-		p, err := platform.GetCurrentPlatform(ctx, action.client, ictx.Namespace)
-		if err != nil {
-			return err
-		}
+
 		env, err := trait.Apply(ctx, action.client, nil, ictx)
 		if err != nil {
 			return err
 		}
 
-		// assume there's no duplication nor conflict for now
-		repositories := make([]string, 0, len(ictx.Spec.Repositories)+len(p.Spec.Build.Repositories))
-		repositories = append(repositories, ictx.Spec.Repositories...)
-		repositories = append(repositories, p.Spec.Build.Repositories...)
-
 		if env.CamelCatalog == nil {
 			return errors.New("undefined camel catalog")
 		}
@@ -108,7 +99,6 @@ func (action *buildAction) handleBuildSubmitted(ctx context.Context, ictx *v1alp
 				RuntimeVersion: env.RuntimeVersion,
 				Platform:       env.Platform.Spec,
 				Dependencies:   ictx.Spec.Dependencies,
-				Repositories:   repositories,
 				Steps:          builder.StepIDsFor(env.Steps...),
 				BuildDir:       env.BuildDir,
 			},
diff --git a/pkg/controller/integrationplatform/initialize.go b/pkg/controller/integrationplatform/initialize.go
index 4c93551..f8c2f9b 100644
--- a/pkg/controller/integrationplatform/initialize.go
+++ b/pkg/controller/integrationplatform/initialize.go
@@ -133,14 +133,6 @@ func (action *initializeAction) Handle(ctx context.Context, ip *v1alpha1.Integra
 	action.L.Infof("LocalRepository set to %s", target.Spec.Build.LocalRepository)
 	action.L.Infof("Timeout set to %s", target.Spec.Build.Timeout)
 
-	for i, r := range target.Spec.Build.Repositories {
-		if i == 0 {
-			action.L.Info("Repositories:")
-		}
-
-		action.L.Infof("%d - %s", i, r)
-	}
-
 	err = action.client.Update(ctx, target)
 	if err != nil {
 		return err
diff --git a/pkg/trait/builder_test.go b/pkg/trait/builder_test.go
index 9f62dca..52bf4ab 100644
--- a/pkg/trait/builder_test.go
+++ b/pkg/trait/builder_test.go
@@ -87,7 +87,7 @@ func TestS2IBuilderTrait(t *testing.T) {
 	assert.NotEmpty(t, env.ExecutedTraits)
 	assert.NotNil(t, env.GetTrait(ID("builder")))
 	assert.NotEmpty(t, env.Steps)
-	assert.Len(t, env.Steps, 6)
+	assert.Len(t, env.Steps, 7)
 	assert.Condition(t, func() bool {
 		for _, s := range env.Steps {
 			if s == s2i.Steps.Publisher && s.Phase() == builder.ApplicationPublishPhase {
@@ -107,7 +107,7 @@ func TestKanikoBuilderTrait(t *testing.T) {
 	assert.NotEmpty(t, env.ExecutedTraits)
 	assert.NotNil(t, env.GetTrait(ID("builder")))
 	assert.NotEmpty(t, env.Steps)
-	assert.Len(t, env.Steps, 6)
+	assert.Len(t, env.Steps, 7)
 	assert.Condition(t, func() bool {
 		for _, s := range env.Steps {
 			if s == kaniko.Steps.Publisher && s.Phase() == builder.ApplicationPublishPhase {
diff --git a/pkg/trait/rest-dsl.go b/pkg/trait/rest-dsl.go
index 41a32bb..71cd6b7 100644
--- a/pkg/trait/rest-dsl.go
+++ b/pkg/trait/rest-dsl.go
@@ -18,7 +18,6 @@ limitations under the License.
 package trait
 
 import (
-	"encoding/xml"
 	"errors"
 	"fmt"
 	"io/ioutil"
@@ -28,6 +27,8 @@ import (
 	"strconv"
 	"strings"
 
+	"github.com/apache/camel-k/pkg/util/kubernetes"
+
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
@@ -106,22 +107,25 @@ func (t *restDslTrait) Apply(e *Environment) error {
 			return err
 		}
 
-		opts := make([]string, 0, 4)
-		opts = append(opts, maven.ExtraOptions(e.Platform.Spec.Build.LocalRepository)...)
-		opts = append(opts, "-Dopenapi.spec="+in)
-		opts = append(opts, "-Ddsl.out="+out)
-
-		project, err := t.generateProject(e)
+		project, err := t.generateMavenProject(e)
 		if err != nil {
 			return err
 		}
 
-		err = maven.CreateStructure(tmpDir, project)
+		mc := maven.NewContext(tmpDir, project)
+		mc.AddArguments(maven.ExtraOptions(e.Platform.Spec.Build.LocalRepository)...)
+		mc.AddArgument("-Dopenapi.spec=" + in)
+		mc.AddArgument("-Ddsl.out=" + out)
+
+		settings, err := kubernetes.ResolveValueSource(e.C, e.Client, e.Integration.Namespace, &e.Platform.Spec.Build.Maven.Settings)
 		if err != nil {
 			return err
 		}
+		if settings != "" {
+			mc.SettingsData = []byte(settings)
+		}
 
-		err = maven.Run(tmpDir, opts...)
+		err = maven.Run(mc)
 		if err != nil {
 			return err
 		}
@@ -202,61 +206,35 @@ func (t *restDslTrait) Apply(e *Environment) error {
 	return nil
 }
 
-func (t *restDslTrait) generateProject(e *Environment) (maven.Project, error) {
+func (t *restDslTrait) generateMavenProject(e *Environment) (maven.Project, error) {
 	if e.CamelCatalog == nil {
 		return maven.Project{}, errors.New("unknown camel catalog")
 	}
 
-	p := maven.Project{
-		XMLName:           xml.Name{Local: "project"},
-		XMLNs:             "http://maven.apache.org/POM/4.0.0",
-		XMLNsXsi:          "http://www.w3.org/2001/XMLSchema-instance",
-		XsiSchemaLocation: "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd",
-		ModelVersion:      "4.0.0",
-		GroupID:           "org.apache.camel.k.integration",
-		ArtifactID:        "camel-k-red-dsl-generator",
-		Version:           defaults.Version,
-		Build: maven.Build{
-			DefaultGoal: "generate-resources",
-			Plugins: []maven.Plugin{
+	p := maven.NewProjectWithGAV("org.apache.camel.k.integration", "camel-k-rest-dsl-generator", defaults.Version)
+	p.Build.DefaultGoal = "generate-resources"
+	p.Build.Plugins = []maven.Plugin{
+		{
+			GroupID:    "org.apache.camel.k",
+			ArtifactID: "camel-k-maven-plugin",
+			Version:    e.RuntimeVersion,
+			Executions: []maven.Execution{
 				{
-					GroupID:    "org.apache.camel.k",
-					ArtifactID: "camel-k-maven-plugin",
-					Version:    e.RuntimeVersion,
-					Executions: []maven.Execution{
-						{
-							Phase: "generate-resources",
-							Goals: []string{
-								"generate-rest-xml",
-							},
-						},
-					},
-					Dependencies: []maven.Dependency{
-						{
-							GroupID:    "org.apache.camel",
-							ArtifactID: "camel-swagger-rest-dsl-generator",
-							Version:    e.CamelCatalog.Version,
-						},
+					Phase: "generate-resources",
+					Goals: []string{
+						"generate-rest-xml",
 					},
 				},
 			},
+			Dependencies: []maven.Dependency{
+				{
+					GroupID:    "org.apache.camel",
+					ArtifactID: "camel-swagger-rest-dsl-generator",
+					Version:    e.CamelCatalog.Version,
+				},
+			},
 		},
 	}
 
-	//
-	// Repositories
-	//
-
-	p.Repositories = make([]maven.Repository, 0, len(e.Platform.Spec.Build.Repositories))
-
-	for i, r := range e.Platform.Spec.Build.Repositories {
-		repo := maven.NewRepository(r)
-		if repo.ID == "" {
-			repo.ID = fmt.Sprintf("repo-%03d", i)
-		}
-
-		p.Repositories = append(p.Repositories, repo)
-	}
-
 	return p, nil
 }
diff --git a/pkg/util/kubernetes/util.go b/pkg/util/kubernetes/util.go
index 2ecb761..45b8a59 100644
--- a/pkg/util/kubernetes/util.go
+++ b/pkg/util/kubernetes/util.go
@@ -237,3 +237,47 @@ func LookUpResources(ctx context.Context, client client.Client, namespace string
 	}
 	return res, nil
 }
+
+// GetSecretRefValue returns the value of a secret in the supplied namespace --
+func GetSecretRefValue(ctx context.Context, client client.Client, namespace string, selector *corev1.SecretKeySelector) (string, error) {
+	secret, err := GetSecret(ctx, client, selector.Name, namespace)
+	if err != nil {
+		return "", err
+	}
+
+	if data, ok := secret.Data[selector.Key]; ok {
+		return string(data), nil
+	}
+
+	return "", fmt.Errorf("key %s not found in secret %s", selector.Key, selector.Name)
+
+}
+
+// GetConfigMapRefValue returns the value of a configmap in the supplied namespace
+func GetConfigMapRefValue(ctx context.Context, client client.Client, namespace string, selector *corev1.ConfigMapKeySelector) (string, error) {
+	cm, err := GetConfigMap(ctx, client, selector.Name, namespace)
+	if err != nil {
+		return "", err
+	}
+
+	if data, ok := cm.Data[selector.Key]; ok {
+		return data, nil
+	}
+
+	return "", fmt.Errorf("key %s not found in config map %s", selector.Key, selector.Name)
+}
+
+// ResolveValueSource --
+func ResolveValueSource(ctx context.Context, client client.Client, namespace string, valueSource *v1alpha1.ValueSource) (string, error) {
+	if valueSource.ConfigMapKeyRef != nil && valueSource.SecretKeyRef != nil {
+		return "", fmt.Errorf("value source has bot config map and secret configuired")
+	}
+	if valueSource.ConfigMapKeyRef != nil {
+		return GetConfigMapRefValue(ctx, client, namespace, valueSource.ConfigMapKeyRef)
+	}
+	if valueSource.SecretKeyRef != nil {
+		return GetSecretRefValue(ctx, client, namespace, valueSource.SecretKeyRef)
+	}
+
+	return "", nil
+}
diff --git a/pkg/util/maven/maven.go b/pkg/util/maven/maven.go
index 485d074..3e28d18 100644
--- a/pkg/util/maven/maven.go
+++ b/pkg/util/maven/maven.go
@@ -18,11 +18,12 @@ limitations under the License.
 package maven
 
 import (
-	"bytes"
-	"encoding/xml"
 	"fmt"
+	"io"
+	"io/ioutil"
 	"os"
 	"os/exec"
+	"path"
 	"regexp"
 	"strings"
 
@@ -35,50 +36,75 @@ import (
 // Log --
 var Log = log.WithName("maven")
 
-// GeneratePomContent generate a pom.xml file from the given project definition
-func GeneratePomContent(project Project) (string, error) {
-	w := &bytes.Buffer{}
-	w.WriteString(xml.Header)
-
-	e := xml.NewEncoder(w)
-	e.Indent("", "  ")
-
-	err := e.Encode(project)
-	if err != nil {
-		return "", err
+// GenerateProjectStructure --
+func GenerateProjectStructure(context Context) error {
+	if err := util.WriteFileWithBytesMarshallerContent(context.Path, "pom.xml", context.Project); err != nil {
+		return err
 	}
 
-	return w.String(), nil
-}
-
-// CreateStructure --
-func CreateStructure(buildDir string, project Project) error {
-	Log.Infof("write project: %+v", project)
-
-	pom, err := GeneratePomContent(project)
-	if err != nil {
-		return err
+	if context.SettingsData != nil {
+		if err := util.WriteFileWithContent(context.Path, "settings.xml", context.SettingsData); err != nil {
+			return err
+		}
+	} else if context.Settings != nil {
+		if err := util.WriteFileWithBytesMarshallerContent(context.Path, "settings.xml", context.Settings); err != nil {
+			return err
+		}
 	}
 
-	err = util.WriteFileWithContent(buildDir, "pom.xml", pom)
-	if err != nil {
-		return err
+	for k, v := range context.AdditionalEntries {
+		var bytes []byte
+		var err error
+
+		if dc, ok := v.([]byte); ok {
+			bytes = dc
+		} else if dc, ok := v.(io.Reader); ok {
+			bytes, err = ioutil.ReadAll(dc)
+			if err != nil {
+				return err
+			}
+		} else {
+			return fmt.Errorf("unknown content type: name=%s, content=%+v", k, v)
+		}
+
+		if len(bytes) > 0 {
+			Log.Infof("write entry: %s (%d bytes)", k, len(bytes))
+
+			err = util.WriteFileWithContent(context.Path, k, bytes)
+			if err != nil {
+				return err
+			}
+		}
 	}
 
 	return nil
 }
 
 // Run --
-func Run(buildDir string, args ...string) error {
+func Run(context Context) error {
+	if err := GenerateProjectStructure(context); err != nil {
+		return err
+	}
+
 	mvnCmd := "mvn"
 	if c, ok := os.LookupEnv("MAVEN_CMD"); ok {
 		mvnCmd = c
 	}
 
-	args = append(args, "--batch-mode")
+	args := append(context.AdditionalArguments, "--batch-mode")
+
+	settingsPath := path.Join(context.Path, "settings.xml")
+	settingsExists, err := util.FileExists(settingsPath)
+	if err != nil {
+		return err
+	}
+
+	if settingsExists {
+		args = append(args, "--settings", settingsPath)
+	}
 
 	cmd := exec.Command(mvnCmd, args...)
-	cmd.Dir = buildDir
+	cmd.Dir = context.Path
 	cmd.Stdout = os.Stdout
 	cmd.Stderr = os.Stderr
 
diff --git a/pkg/util/maven/maven_project.go b/pkg/util/maven/maven_project.go
index 7c536cb..541414f 100644
--- a/pkg/util/maven/maven_project.go
+++ b/pkg/util/maven/maven_project.go
@@ -18,9 +18,48 @@ limitations under the License.
 package maven
 
 import (
+	"bytes"
+	"encoding/xml"
 	"strings"
 )
 
+// NewProject --
+func NewProject() Project {
+	return Project{
+		XMLName:           xml.Name{Local: "project"},
+		XMLNs:             "http://maven.apache.org/POM/4.0.0",
+		XMLNsXsi:          "http://www.w3.org/2001/XMLSchema-instance",
+		XsiSchemaLocation: "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd",
+		ModelVersion:      "4.0.0",
+	}
+}
+
+// NewProjectWithGAV --
+func NewProjectWithGAV(group string, artifact string, version string) Project {
+	p := NewProject()
+	p.GroupID = group
+	p.ArtifactID = artifact
+	p.Version = version
+
+	return p
+}
+
+// MarshalBytes --
+func (p Project) MarshalBytes() ([]byte, error) {
+	w := &bytes.Buffer{}
+	w.WriteString(xml.Header)
+
+	e := xml.NewEncoder(w)
+	e.Indent("", "  ")
+
+	err := e.Encode(p)
+	if err != nil {
+		return []byte{}, err
+	}
+
+	return w.Bytes(), nil
+}
+
 // LookupDependency --
 func (p *Project) LookupDependency(dep Dependency) *Dependency {
 	for i := range p.Dependencies {
diff --git a/pkg/util/maven/maven_test.go b/pkg/util/maven/maven_project_test.go
similarity index 78%
rename from pkg/util/maven/maven_test.go
rename to pkg/util/maven/maven_project_test.go
index 3115f9e..cbb7daa 100644
--- a/pkg/util/maven/maven_test.go
+++ b/pkg/util/maven/maven_project_test.go
@@ -18,9 +18,10 @@ limitations under the License.
 package maven
 
 import (
-	"encoding/xml"
 	"testing"
 
+	"github.com/apache/camel-k/pkg/util"
+
 	"github.com/stretchr/testify/assert"
 )
 
@@ -81,67 +82,58 @@ const expectedPom = `<?xml version="1.0" encoding="UTF-8"?>
 </project>`
 
 func TestPomGeneration(t *testing.T) {
-	project := Project{
-		XMLName:           xml.Name{Local: "project"},
-		XMLNs:             "http://maven.apache.org/POM/4.0.0",
-		XMLNsXsi:          "http://www.w3.org/2001/XMLSchema-instance",
-		XsiSchemaLocation: "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd",
-		ModelVersion:      "4.0.0",
-		GroupID:           "org.apache.camel.k.integration",
-		ArtifactID:        "camel-k-integration",
-		Version:           "1.0.0",
-		DependencyManagement: DependencyManagement{
-			Dependencies: []Dependency{
-				{
-					GroupID:    "org.apache.camel",
-					ArtifactID: "camel-bom",
-					Version:    "2.22.1",
-					Type:       "pom",
-					Scope:      "import",
-				},
-			},
-		},
+	project := NewProjectWithGAV("org.apache.camel.k.integration", "camel-k-integration", "1.0.0")
+	project.DependencyManagement = DependencyManagement{
 		Dependencies: []Dependency{
 			{
-				GroupID:    "org.apache.camel.k",
-				ArtifactID: "camel-k-runtime-jvm",
-				Version:    "1.0.0",
+				GroupID:    "org.apache.camel",
+				ArtifactID: "camel-bom",
+				Version:    "2.22.1",
+				Type:       "pom",
+				Scope:      "import",
 			},
 		},
-		Repositories: []Repository{
-			{
-				ID:  "central",
-				URL: "https://repo.maven.apache.org/maven2",
-				Snapshots: RepositoryPolicy{
-					Enabled: false,
-				},
-				Releases: RepositoryPolicy{
-					Enabled:      true,
-					UpdatePolicy: "never",
-				},
+	}
+	project.Dependencies = []Dependency{
+		{
+			GroupID:    "org.apache.camel.k",
+			ArtifactID: "camel-k-runtime-jvm",
+			Version:    "1.0.0",
+		},
+	}
+	project.Repositories = []Repository{
+		{
+			ID:  "central",
+			URL: "https://repo.maven.apache.org/maven2",
+			Snapshots: RepositoryPolicy{
+				Enabled: false,
+			},
+			Releases: RepositoryPolicy{
+				Enabled:      true,
+				UpdatePolicy: "never",
 			},
 		},
-		PluginRepositories: []Repository{
-			{
-				ID:  "central",
-				URL: "https://repo.maven.apache.org/maven2",
-				Snapshots: RepositoryPolicy{
-					Enabled: false,
-				},
-				Releases: RepositoryPolicy{
-					Enabled:      true,
-					UpdatePolicy: "never",
-				},
+	}
+	project.PluginRepositories = []Repository{
+		{
+			ID:  "central",
+			URL: "https://repo.maven.apache.org/maven2",
+			Snapshots: RepositoryPolicy{
+				Enabled: false,
+			},
+			Releases: RepositoryPolicy{
+				Enabled:      true,
+				UpdatePolicy: "never",
 			},
 		},
 	}
 
-	pom, err := GeneratePomContent(project)
+	pom, err := util.EncodeXML(project)
 
 	assert.Nil(t, err)
 	assert.NotNil(t, pom)
 
-	assert.Equal(t, expectedPom, pom)
+	assert.Equal(t, expectedPom, string(pom))
 }
 
 func TestParseSimpleGAV(t *testing.T) {
diff --git a/pkg/builder/kaniko/kaniko.go b/pkg/util/maven/maven_settings.go
similarity index 55%
copy from pkg/builder/kaniko/kaniko.go
copy to pkg/util/maven/maven_settings.go
index 858799e..16f96b7 100644
--- a/pkg/builder/kaniko/kaniko.go
+++ b/pkg/util/maven/maven_settings.go
@@ -15,36 +15,16 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package kaniko
-
-import (
-	"github.com/apache/camel-k/pkg/builder"
-)
-
-func init() {
-	builder.RegisterSteps(Steps)
+package maven
+
+import "encoding/xml"
+
+// NewSettings --
+func NewSettings() Settings {
+	return Settings{
+		XMLName:           xml.Name{Local: "settings"},
+		XMLNs:             "http://maven.apache.org/SETTINGS/1.0.0",
+		XMLNsXsi:          "http://www.w3.org/2001/XMLSchema-instance",
+		XsiSchemaLocation: "http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd",
+	}
 }
-
-type steps struct {
-	Publisher builder.Step
-}
-
-var Steps = steps{
-	Publisher: builder.NewStep(
-		builder.ApplicationPublishPhase,
-		publisher,
-	),
-}
-
-// DefaultSteps --
-var DefaultSteps = []builder.Step{
-	builder.Steps.GenerateProject,
-	builder.Steps.InjectDependencies,
-	builder.Steps.SanitizeDependencies,
-	builder.Steps.ComputeDependencies,
-	builder.Steps.IncrementalPackager,
-	Steps.Publisher,
-}
-
-// BuildDir is the directory where to build artifacts (shared with the Kaniko pod)
-var BuildDir = "/workspace"
diff --git a/pkg/util/maven/maven_settings_test.go b/pkg/util/maven/maven_settings_test.go
new file mode 100644
index 0000000..8bd25a3
--- /dev/null
+++ b/pkg/util/maven/maven_settings_test.go
@@ -0,0 +1,86 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package maven
+
+import (
+  "testing"
+
+  "github.com/apache/camel-k/pkg/util"
+  "github.com/stretchr/testify/assert"
+)
+
+const expectedSettings = `<?xml version="1.0" encoding="UTF-8"?>
+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ` +
+  `xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
+  <localRepository>/tmp/artifacts/m2</localRepository>
+  <profiles>
+    <profile>
+      <id>my-profile</id>
+      <activation>
+        <activeByDefault>true</activeByDefault>
+      </activation>
+      <repositories>
+        <repository>
+          <id>central</id>
+          <url>https://repo.maven.apache.org/maven2</url>
+          <snapshots>
+            <enabled>false</enabled>
+          </snapshots>
+          <releases>
+            <enabled>true</enabled>
+            <updatePolicy>never</updatePolicy>
+          </releases>
+        </repository>
+      </repositories>
+      <pluginRepositories></pluginRepositories>
+    </profile>
+  </profiles>
+</settings>`
+
+func TestSettingsGeneration(t *testing.T) {
+  settings := NewSettings()
+  settings.LocalRepository = "/tmp/artifacts/m2"
+  settings.Profiles = []Profile{
+    {
+      ID: "my-profile",
+      Activation: Activation{
+        ActiveByDefault: true,
+      },
+      Repositories: []Repository{
+        {
+          ID:  "central",
+          URL: "https://repo.maven.apache.org/maven2",
+          Snapshots: RepositoryPolicy{
+            Enabled: false,
+          },
+          Releases: RepositoryPolicy{
+            Enabled:      true,
+            UpdatePolicy: "never",
+          },
+        },
+      },
+    },
+  }
+
+  content, err := util.EncodeXML(settings)
+
+  assert.Nil(t, err)
+  assert.NotNil(t, settings)
+
+  assert.Equal(t, expectedSettings, string(content))
+}
diff --git a/pkg/util/maven/maven_project_types.go b/pkg/util/maven/maven_types.go
similarity index 63%
rename from pkg/util/maven/maven_project_types.go
rename to pkg/util/maven/maven_types.go
index e95b484..24ff0a3 100644
--- a/pkg/util/maven/maven_project_types.go
+++ b/pkg/util/maven/maven_types.go
@@ -18,49 +18,11 @@ limitations under the License.
 package maven
 
 import (
+	"bytes"
 	"encoding/xml"
+	"fmt"
 )
 
-// Project represent a maven project
-type Project struct {
-	XMLName              xml.Name
-	XMLNs                string               `xml:"xmlns,attr"`
-	XMLNsXsi             string               `xml:"xmlns:xsi,attr"`
-	XsiSchemaLocation    string               `xml:"xsi:schemaLocation,attr"`
-	ModelVersion         string               `xml:"modelVersion"`
-	GroupID              string               `xml:"groupId"`
-	ArtifactID           string               `xml:"artifactId"`
-	Version              string               `xml:"version"`
-	Properties           Properties           `xml:"properties,omitempty"`
-	DependencyManagement DependencyManagement `xml:"dependencyManagement"`
-	Dependencies         []Dependency         `xml:"dependencies>dependency,omitempty"`
-	Repositories         []Repository         `xml:"repositories>repository,omitempty"`
-	PluginRepositories   []Repository         `xml:"pluginRepositories>pluginRepository,omitempty"`
-	Build                Build                `xml:"build,omitempty"`
-}
-
-// Exclusion represent a maven's dependency exlucsion
-type Exclusion struct {
-	GroupID    string `xml:"groupId" yaml:"groupId"`
-	ArtifactID string `xml:"artifactId" yaml:"artifactId"`
-}
-
-// DependencyManagement represent maven's dependency management block
-type DependencyManagement struct {
-	Dependencies []Dependency `xml:"dependencies>dependency,omitempty"`
-}
-
-// Dependency represent a maven's dependency
-type Dependency struct {
-	GroupID    string       `xml:"groupId" yaml:"groupId"`
-	ArtifactID string       `xml:"artifactId" yaml:"artifactId"`
-	Version    string       `xml:"version,omitempty" yaml:"version,omitempty"`
-	Type       string       `xml:"type,omitempty" yaml:"type,omitempty"`
-	Classifier string       `xml:"classifier,omitempty" yaml:"classifier,omitempty"`
-	Scope      string       `xml:"scope,omitempty" yaml:"scope,omitempty"`
-	Exclusions *[]Exclusion `xml:"exclusions>exclusion,omitempty" yaml:"exclusions,omitempty"`
-}
-
 // Repository --
 type Repository struct {
 	ID        string           `xml:"id"`
@@ -125,3 +87,134 @@ func (m Properties) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
 
 	return e.EncodeToken(start.End())
 }
+
+// NewContext --
+func NewContext(buildDir string, project Project) Context {
+	return Context{
+		Path:                buildDir,
+		Project:             project,
+		AdditionalArguments: make([]string, 0),
+		AdditionalEntries:   make(map[string]interface{}),
+	}
+}
+
+// Context --
+type Context struct {
+	Path                string
+	Project             Project
+	Settings            *Settings
+	SettingsData        []byte
+	AdditionalArguments []string
+	AdditionalEntries   map[string]interface{}
+}
+
+// AddEntry --
+func (c *Context) AddEntry(id string, entry interface{}) {
+	if c.AdditionalEntries == nil {
+		c.AdditionalEntries = make(map[string]interface{})
+	}
+
+	c.AdditionalEntries[id] = entry
+}
+
+// AddArgument --
+func (c *Context) AddArgument(argument string) {
+	c.AdditionalArguments = append(c.AdditionalArguments, argument)
+}
+
+// AddArgumentf --
+func (c *Context) AddArgumentf(format string, args ...interface{}) {
+	c.AdditionalArguments = append(c.AdditionalArguments, fmt.Sprintf(format, args...))
+}
+
+// AddArguments --
+func (c *Context) AddArguments(arguments ...string) {
+	c.AdditionalArguments = append(c.AdditionalArguments, arguments...)
+}
+
+// Settings represent a maven settings
+type Settings struct {
+	XMLName           xml.Name
+	XMLNs             string    `xml:"xmlns,attr"`
+	XMLNsXsi          string    `xml:"xmlns:xsi,attr"`
+	XsiSchemaLocation string    `xml:"xsi:schemaLocation,attr"`
+	LocalRepository   string    `xml:"localRepository"`
+	Profiles          []Profile `xml:"profiles>profile,omitempty"`
+}
+
+// MarshalBytes --
+func (s Settings) MarshalBytes() ([]byte, error) {
+	w := &bytes.Buffer{}
+	w.WriteString(xml.Header)
+
+	e := xml.NewEncoder(w)
+	e.Indent("", "  ")
+
+	err := e.Encode(s)
+	if err != nil {
+		return []byte{}, err
+	}
+
+	return w.Bytes(), nil
+}
+
+// Project represent a maven project
+type Project struct {
+	XMLName              xml.Name
+	XMLNs                string               `xml:"xmlns,attr"`
+	XMLNsXsi             string               `xml:"xmlns:xsi,attr"`
+	XsiSchemaLocation    string               `xml:"xsi:schemaLocation,attr"`
+	ModelVersion         string               `xml:"modelVersion"`
+	GroupID              string               `xml:"groupId"`
+	ArtifactID           string               `xml:"artifactId"`
+	Version              string               `xml:"version"`
+	Properties           Properties           `xml:"properties,omitempty"`
+	DependencyManagement DependencyManagement `xml:"dependencyManagement"`
+	Dependencies         []Dependency         `xml:"dependencies>dependency,omitempty"`
+	Repositories         []Repository         `xml:"repositories>repository,omitempty"`
+	PluginRepositories   []Repository         `xml:"pluginRepositories>pluginRepository,omitempty"`
+	Build                Build                `xml:"build,omitempty"`
+}
+
+// Exclusion represent a maven's dependency exlucsion
+type Exclusion struct {
+	GroupID    string `xml:"groupId" yaml:"groupId"`
+	ArtifactID string `xml:"artifactId" yaml:"artifactId"`
+}
+
+// DependencyManagement represent maven's dependency management block
+type DependencyManagement struct {
+	Dependencies []Dependency `xml:"dependencies>dependency,omitempty"`
+}
+
+// Dependency represent a maven's dependency
+type Dependency struct {
+	GroupID    string       `xml:"groupId" yaml:"groupId"`
+	ArtifactID string       `xml:"artifactId" yaml:"artifactId"`
+	Version    string       `xml:"version,omitempty" yaml:"version,omitempty"`
+	Type       string       `xml:"type,omitempty" yaml:"type,omitempty"`
+	Classifier string       `xml:"classifier,omitempty" yaml:"classifier,omitempty"`
+	Scope      string       `xml:"scope,omitempty" yaml:"scope,omitempty"`
+	Exclusions *[]Exclusion `xml:"exclusions>exclusion,omitempty" yaml:"exclusions,omitempty"`
+}
+
+// Profile --
+type Profile struct {
+	ID                 string       `xml:"id"`
+	Activation         Activation   `xml:"activation,omitempty"`
+	Properties         Properties   `xml:"properties,omitempty"`
+	Repositories       []Repository `xml:"repositories>repository,omitempty"`
+	PluginRepositories []Repository `xml:"pluginRepositories>pluginRepository,omitempty"`
+}
+
+// Activation --
+type Activation struct {
+	ActiveByDefault bool                `xml:"activeByDefault"`
+	Property        *PropertyActivation `xml:"property,omitempty"`
+}
+
+// PropertyActivation --
+type PropertyActivation struct {
+	Name  string `xml:"name"`
+	Value string `xml:"value"`
+}
diff --git a/pkg/util/util.go b/pkg/util/util.go
index 4ab515f..542e7cf 100644
--- a/pkg/util/util.go
+++ b/pkg/util/util.go
@@ -18,14 +18,14 @@ limitations under the License.
 package util
 
 import (
+	"bytes"
+	"encoding/xml"
 	"os"
 	"os/signal"
 	"path"
 	"regexp"
 	"syscall"
 
-	"github.com/magiconair/properties"
-
 	"github.com/scylladb/go-set/strset"
 
 	corev1 "k8s.io/api/core/v1"
@@ -104,8 +104,24 @@ func WaitForSignal(sig chan os.Signal, exit func(int)) {
 	}()
 }
 
+// EncodeXML --
+func EncodeXML(content interface{}) ([]byte, error) {
+	w := &bytes.Buffer{}
+	w.WriteString(xml.Header)
+
+	e := xml.NewEncoder(w)
+	e.Indent("", "  ")
+
+	err := e.Encode(content)
+	if err != nil {
+		return []byte{}, err
+	}
+
+	return w.Bytes(), nil
+}
+
 // WriteFileWithContent --
-func WriteFileWithContent(buildDir string, relativePath string, content string) error {
+func WriteFileWithContent(buildDir string, relativePath string, content []byte) error {
 	filePath := path.Join(buildDir, relativePath)
 	fileDir := path.Dir(filePath)
 	// Create dir if not present
@@ -120,13 +136,23 @@ func WriteFileWithContent(buildDir string, relativePath string, content string)
 	}
 	defer file.Close()
 
-	_, err = file.WriteString(content)
+	_, err = file.Write(content)
 	if err != nil {
 		return errors.Wrap(err, "could not write to file "+relativePath)
 	}
 	return nil
 }
 
+// WriteFileWithBytesMarshallerContent --
+func WriteFileWithBytesMarshallerContent(buildDir string, relativePath string, content BytesMarshaller) error {
+	data, err := content.MarshalBytes()
+	if err != nil {
+		return err
+	}
+
+	return WriteFileWithContent(buildDir, relativePath, data)
+}
+
 // LookupEnvVar --
 func LookupEnvVar(vars []corev1.EnvVar, name string) *corev1.EnvVar {
 	for _, e := range vars {
@@ -156,40 +182,17 @@ func FindAllDistinctStringSubmatch(data string, regexps ...*regexp.Regexp) []str
 	return submatchs.List()
 }
 
-// ExtractApplicationPropertiesString --
-func ExtractApplicationPropertiesString(data map[string]string, consumer func(string, string)) error {
-	pstr, ok := data["application.properties"]
-	if !ok {
-		return nil
-	}
-
-	p, err := properties.LoadString(pstr)
-	if err != nil {
-		return err
-	}
-
-	for _, k := range p.Keys() {
-		consumer(k, p.MustGet(k))
+// FileExists --
+func FileExists(name string) (bool, error) {
+	info, err := os.Stat(name)
+	if os.IsNotExist(err) {
+		return false, nil
 	}
 
-	return nil
+	return !info.IsDir(), err
 }
 
-// ExtractApplicationPropertiesBytes --
-func ExtractApplicationPropertiesBytes(data map[string][]byte, consumer func(string, string)) error {
-	pstr, ok := data["application.properties"]
-	if !ok {
-		return nil
-	}
-
-	p, err := properties.Load(pstr, properties.UTF8)
-	if err != nil {
-		return err
-	}
-
-	for _, k := range p.Keys() {
-		consumer(k, p.MustGet(k))
-	}
-
-	return nil
+// MarshalBytes --
+type BytesMarshaller interface {
+	MarshalBytes() ([]byte, error)
 }