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

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

commit bbf9b3ad1f1211c09d8aaedb01aa294877317965
Author: Antonin Stefanutti <[email protected]>
AuthorDate: Tue Oct 15 19:20:58 2019 +0200

    feat(quarkus): Initial Quarkus support
---
 pkg/builder/builder_steps.go                       | 129 ++++-------
 pkg/builder/builder_steps_test.go                  | 171 +-------------
 pkg/builder/builder_utils.go                       |  65 ------
 pkg/builder/builder_utils_test.go                  |  87 -------
 pkg/builder/kaniko/kaniko.go                       |  10 +-
 pkg/builder/{builder_utils.go => runtime/main.go}  |  99 ++++----
 .../main_test.go}                                  | 251 ++++++---------------
 pkg/builder/runtime/quarkus.go                     | 142 ++++++++++++
 .../{kaniko/kaniko.go => runtime/runtime.go}       |  45 ++--
 pkg/builder/s2i/s2i.go                             |  10 +-
 pkg/trait/builder.go                               |  17 +-
 pkg/trait/dependencies.go                          |  45 ++--
 pkg/trait/dependencies_test.go                     |   5 +
 pkg/trait/environment.go                           |   8 +-
 pkg/trait/quarkus.go                               |  94 ++++++++
 pkg/trait/rest-dsl.go                              |   6 +-
 pkg/trait/trait_catalog.go                         |   6 +
 pkg/util/maven/maven.go                            |  11 +-
 pkg/util/maven/maven_types.go                      |   2 +
 19 files changed, 498 insertions(+), 705 deletions(-)

diff --git a/pkg/builder/builder_steps.go b/pkg/builder/builder_steps.go
index b46d0c2..3e935e3 100644
--- a/pkg/builder/builder_steps.go
+++ b/pkg/builder/builder_steps.go
@@ -19,23 +19,17 @@ package builder
 
 import (
        "fmt"
-       "io/ioutil"
        "os"
        "path"
        "reflect"
        "strings"
 
-       "github.com/apache/camel-k/pkg/util/kubernetes"
-
        k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
 
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+       "github.com/apache/camel-k/pkg/util/kubernetes"
        "github.com/apache/camel-k/pkg/util/maven"
        "github.com/apache/camel-k/pkg/util/tar"
-
-       yaml2 "gopkg.in/yaml.v2"
-
-       "github.com/pkg/errors"
 )
 
 var stepsByID = make(map[string]Step)
@@ -45,21 +39,15 @@ func init() {
 }
 
 type steps struct {
-       GenerateProject         Step
        GenerateProjectSettings Step
        InjectDependencies      Step
        SanitizeDependencies    Step
-       ComputeDependencies     Step
        StandardPackager        Step
        IncrementalPackager     Step
 }
 
 // Steps --
 var Steps = steps{
-       GenerateProject: NewStep(
-               ProjectGenerationPhase,
-               generateProject,
-       ),
        GenerateProjectSettings: NewStep(
                ProjectGenerationPhase+1,
                generateProjectSettings,
@@ -72,10 +60,6 @@ var Steps = steps{
                ProjectGenerationPhase+3,
                sanitizeDependencies,
        ),
-       ComputeDependencies: NewStep(
-               ProjectBuildPhase,
-               computeDependencies,
-       ),
        StandardPackager: NewStep(
                ApplicationPackagePhase,
                standardPackager,
@@ -86,6 +70,14 @@ var Steps = steps{
        ),
 }
 
+// DefaultSteps --
+var DefaultSteps = []Step{
+       Steps.GenerateProjectSettings,
+       Steps.InjectDependencies,
+       Steps.SanitizeDependencies,
+       Steps.IncrementalPackager,
+}
+
 // RegisterSteps --
 func RegisterSteps(steps interface{}) {
        v := reflect.ValueOf(steps)
@@ -112,17 +104,39 @@ func registerStep(steps ...Step) {
        }
 }
 
-// generateProject --
-func generateProject(ctx *Context) error {
-       p, err := NewMavenProject(ctx)
+// 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)
+       }
 
-       ctx.Maven.Project = p
+       return nil
+}
 
+func injectDependencies(ctx *Context) error {
+       // Add dependencies from build
        for _, d := range ctx.Build.Dependencies {
                switch {
+               case strings.HasPrefix(d, "bom:"):
+                       mid := strings.TrimPrefix(d, "bom:")
+                       gav := strings.Replace(mid, "/", ":", -1)
+
+                       d, err := maven.ParseGAV(gav)
+                       if err != nil {
+                               return err
+                       }
+
+                       ctx.Maven.Project.DependencyManagement.Dependencies = 
append(ctx.Maven.Project.DependencyManagement.Dependencies, maven.Dependency{
+                               GroupID:    d.GroupID,
+                               ArtifactID: d.ArtifactID,
+                               Version:    d.Version,
+                               Type:       "pom",
+                               Scope:      "import",
+                       })
                case strings.HasPrefix(d, "camel:"):
                        artifactID := strings.TrimPrefix(d, "camel:")
 
@@ -144,33 +158,12 @@ func generateProject(ctx *Context) error {
                        gav := strings.Replace(mid, "/", ":", -1)
 
                        ctx.Maven.Project.AddEncodedDependencyGAV(gav)
-               case strings.HasPrefix(d, "bom:"):
-                       // no-op
                default:
                        return fmt.Errorf("unknown dependency type: %s", d)
                }
        }
 
-       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.Maven.Project.Dependencies))
        copy(deps, ctx.Maven.Project.Dependencies)
 
@@ -195,9 +188,8 @@ func injectDependencies(ctx *Context) error {
                        }
                }
        }
-       //
-       // post process dependencies
-       //
+
+       // Post process dependencies
        deps = make([]maven.Dependency, len(ctx.Maven.Project.Dependencies))
        copy(deps, ctx.Maven.Project.Dependencies)
 
@@ -243,49 +235,7 @@ func sanitizeDependencies(ctx *Context) error {
        return nil
 }
 
-func computeDependencies(ctx *Context) error {
-       mc := maven.NewContext(path.Join(ctx.Path, "maven"), ctx.Maven.Project)
-       mc.SettingsContent = ctx.Maven.SettingsData
-       mc.LocalRepository = ctx.Build.Platform.Build.LocalRepository
-       mc.Timeout = ctx.Build.Platform.Build.Maven.Timeout.Duration
-       
mc.AddArgumentf("org.apache.camel.k:camel-k-maven-plugin:%s:generate-dependency-list",
 ctx.Catalog.RuntimeVersion)
-
-       if err := maven.Run(mc); err != nil {
-               return errors.Wrap(err, "failure while determining classpath")
-       }
-
-       dependencies := path.Join(mc.Path, "target", "dependencies.yaml")
-       content, err := ioutil.ReadFile(dependencies)
-       if err != nil {
-               return err
-       }
-
-       cp := make(map[string][]v1alpha1.Artifact)
-       err = yaml2.Unmarshal(content, &cp)
-       if err != nil {
-               return err
-       }
-
-       for _, e := range cp["dependencies"] {
-               _, fileName := path.Split(e.Location)
-
-               gav, err := maven.ParseGAV(e.ID)
-               if err != nil {
-                       return nil
-               }
-
-               ctx.Artifacts = append(ctx.Artifacts, v1alpha1.Artifact{
-                       ID:       e.ID,
-                       Location: e.Location,
-                       Target:   path.Join("dependencies", 
gav.GroupID+"."+fileName),
-               })
-       }
-
-       return nil
-}
-
-// ArtifactsSelector --
-type ArtifactsSelector func(ctx *Context) error
+type artifactsSelector func(ctx *Context) error
 
 func standardPackager(ctx *Context) error {
        return packager(ctx, func(ctx *Context) error {
@@ -330,8 +280,7 @@ func incrementalPackager(ctx *Context) error {
        })
 }
 
-// ClassPathPackager --
-func packager(ctx *Context, selector ArtifactsSelector) error {
+func packager(ctx *Context, selector artifactsSelector) error {
        err := selector(ctx)
        if err != nil {
                return err
diff --git a/pkg/builder/builder_steps_test.go 
b/pkg/builder/builder_steps_test.go
index d21564d..c950477 100644
--- a/pkg/builder/builder_steps_test.go
+++ b/pkg/builder/builder_steps_test.go
@@ -25,7 +25,6 @@ import (
 
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
        "github.com/apache/camel-k/pkg/util/cancellable"
-       "github.com/apache/camel-k/pkg/util/maven"
        "github.com/apache/camel-k/pkg/util/test"
 
        "github.com/stretchr/testify/assert"
@@ -50,63 +49,6 @@ func TestRegisterDuplicatedSteps(t *testing.T) {
        })
 }
 
-func TestGenerateJvmProject(t *testing.T) {
-       catalog, err := test.DefaultCatalog()
-       assert.Nil(t, err)
-
-       ctx := Context{
-               Catalog: catalog,
-               Build: v1alpha1.BuildSpec{
-                       RuntimeVersion: catalog.RuntimeVersion,
-                       Platform: v1alpha1.IntegrationPlatformSpec{
-                               Build: v1alpha1.IntegrationPlatformBuildSpec{
-                                       CamelVersion: catalog.Version,
-                               },
-                       },
-                       Dependencies: []string{
-                               "camel-k:runtime-main",
-                       },
-               },
-       }
-
-       err = generateProject(&ctx)
-       assert.Nil(t, err)
-       err = injectDependencies(&ctx)
-       assert.Nil(t, err)
-
-       assert.ElementsMatch(
-               t,
-               ctx.Maven.Project.DependencyManagement.Dependencies,
-               []maven.Dependency{
-                       {
-                               GroupID:    "org.apache.camel",
-                               ArtifactID: "camel-bom",
-                               Version:    catalog.Version,
-                               Type:       "pom",
-                               Scope:      "import",
-                       },
-                       {
-                               GroupID:    "org.apache.camel.k",
-                               ArtifactID: "camel-k-runtime-bom",
-                               Version:    catalog.RuntimeVersion,
-                               Type:       "pom",
-                               Scope:      "import",
-                       },
-               },
-       )
-
-       assert.ElementsMatch(
-               t,
-               ctx.Maven.Project.Dependencies,
-               []maven.Dependency{
-                       {GroupID: "org.apache.camel.k", ArtifactID: 
"camel-k-runtime-main"},
-                       {GroupID: "org.apache.camel", ArtifactID: 
"camel-core-engine"},
-                       {GroupID: "org.apache.camel", ArtifactID: "camel-main"},
-                       {GroupID: "org.apache.camel", ArtifactID: 
"camel-properties"},
-               },
-       )
-}
-
 func TestMavenSettingsFromConfigMap(t *testing.T) {
        catalog, err := test.DefaultCatalog()
        assert.Nil(t, err)
@@ -153,7 +95,7 @@ func TestMavenSettingsFromConfigMap(t *testing.T) {
                },
        }
 
-       err = generateProjectSettings(&ctx)
+       err = Steps.GenerateProjectSettings.Execute(&ctx)
        assert.Nil(t, err)
 
        assert.Equal(t, []byte("setting-data"), ctx.Maven.SettingsData)
@@ -205,121 +147,12 @@ func TestMavenSettingsFromSecret(t *testing.T) {
                },
        }
 
-       err = generateProjectSettings(&ctx)
+       err = Steps.GenerateProjectSettings.Execute(&ctx)
        assert.Nil(t, err)
 
        assert.Equal(t, []byte("setting-data"), ctx.Maven.SettingsData)
 }
 
-func TestGenerateGroovyProject(t *testing.T) {
-       catalog, err := test.DefaultCatalog()
-       assert.Nil(t, err)
-
-       ctx := Context{
-               Catalog: catalog,
-               Build: v1alpha1.BuildSpec{
-                       RuntimeVersion: catalog.RuntimeVersion,
-                       Platform: v1alpha1.IntegrationPlatformSpec{
-                               Build: v1alpha1.IntegrationPlatformBuildSpec{
-                                       CamelVersion: catalog.Version,
-                               },
-                       },
-                       Dependencies: []string{
-                               "camel-k:runtime-main",
-                               "camel-k:loader-groovy",
-                       },
-               },
-       }
-
-       err = generateProject(&ctx)
-       assert.Nil(t, err)
-       err = injectDependencies(&ctx)
-       assert.Nil(t, err)
-
-       assert.ElementsMatch(
-               t,
-               ctx.Maven.Project.DependencyManagement.Dependencies,
-               []maven.Dependency{
-                       {
-                               GroupID:    "org.apache.camel",
-                               ArtifactID: "camel-bom",
-                               Version:    catalog.Version,
-                               Type:       "pom",
-                               Scope:      "import",
-                       },
-                       {
-                               GroupID:    "org.apache.camel.k",
-                               ArtifactID: "camel-k-runtime-bom",
-                               Version:    catalog.RuntimeVersion,
-                               Type:       "pom",
-                               Scope:      "import",
-                       },
-               },
-       )
-
-       assert.ElementsMatch(
-               t,
-               ctx.Maven.Project.Dependencies,
-               []maven.Dependency{
-                       {GroupID: "org.apache.camel.k", ArtifactID: 
"camel-k-runtime-main"},
-                       {GroupID: "org.apache.camel.k", ArtifactID: 
"camel-k-loader-groovy"},
-                       {GroupID: "org.apache.camel", ArtifactID: 
"camel-core-engine"},
-                       {GroupID: "org.apache.camel", ArtifactID: "camel-main"},
-                       {GroupID: "org.apache.camel", ArtifactID: 
"camel-groovy"},
-                       {GroupID: "org.apache.camel", ArtifactID: 
"camel-properties"},
-                       {GroupID: "org.apache.camel", ArtifactID: 
"camel-endpointdsl"},
-               },
-       )
-}
-
-func TestSanitizeDependencies(t *testing.T) {
-       catalog, err := test.DefaultCatalog()
-       assert.Nil(t, err)
-
-       ctx := Context{
-               Catalog: catalog,
-               Build: v1alpha1.BuildSpec{
-                       RuntimeVersion: catalog.RuntimeVersion,
-                       Platform: v1alpha1.IntegrationPlatformSpec{
-                               Build: v1alpha1.IntegrationPlatformBuildSpec{
-                                       CamelVersion: catalog.Version,
-                               },
-                       },
-                       Dependencies: []string{
-                               "camel:undertow",
-                               "mvn:org.apache.camel/camel-core/2.18.0",
-                               
"mvn:org.apache.camel.k/camel-k-runtime-main/1.0.0",
-                               "mvn:com.mycompany/my-dep/1.2.3",
-                       },
-               },
-       }
-
-       err = generateProject(&ctx)
-       assert.Nil(t, err)
-       err = injectDependencies(&ctx)
-       assert.Nil(t, err)
-       err = sanitizeDependencies(&ctx)
-       assert.Nil(t, err)
-
-       assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
-               GroupID:    "org.apache.camel.k",
-               ArtifactID: "camel-k-runtime-main",
-       })
-       assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
-               GroupID:    "org.apache.camel",
-               ArtifactID: "camel-core",
-       })
-       assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
-               GroupID:    "org.apache.camel",
-               ArtifactID: "camel-undertow",
-       })
-       assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
-               GroupID:    "com.mycompany",
-               ArtifactID: "my-dep",
-               Version:    "1.2.3",
-       })
-}
-
 func TestListPublishedImages(t *testing.T) {
        catalog, err := test.DefaultCatalog()
        assert.Nil(t, err)
diff --git a/pkg/builder/builder_utils.go b/pkg/builder/builder_utils.go
index e6516dd..5098e5a 100644
--- a/pkg/builder/builder_utils.go
+++ b/pkg/builder/builder_utils.go
@@ -18,12 +18,7 @@ limitations under the License.
 package builder
 
 import (
-       "strings"
-
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
-       "github.com/apache/camel-k/pkg/util/camel"
-       "github.com/apache/camel-k/pkg/util/defaults"
-       "github.com/apache/camel-k/pkg/util/maven"
 )
 
 // StepIDsFor --
@@ -44,63 +39,3 @@ func artifactIDs(artifacts []v1alpha1.Artifact) []string {
 
        return result
 }
-
-// NewMavenProject --
-func NewMavenProject(ctx *Context) (maven.Project, error) {
-       //
-       // Catalog
-       //
-       if ctx.Catalog == nil {
-               c, err := camel.LoadCatalog(ctx.C, ctx.Client, ctx.Namespace, 
ctx.Build.Platform.Build.CamelVersion, ctx.Build.Platform.Build.RuntimeVersion)
-               if err != nil {
-                       return maven.Project{}, err
-               }
-
-               ctx.Catalog = c
-       }
-
-       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
-       //
-       p.DependencyManagement.Dependencies = 
append(p.DependencyManagement.Dependencies, maven.Dependency{
-               GroupID:    "org.apache.camel",
-               ArtifactID: "camel-bom",
-               Version:    ctx.Catalog.Version,
-               Type:       "pom",
-               Scope:      "import",
-       })
-       p.DependencyManagement.Dependencies = 
append(p.DependencyManagement.Dependencies, maven.Dependency{
-               GroupID:    "org.apache.camel.k",
-               ArtifactID: "camel-k-runtime-bom",
-               Version:    ctx.Catalog.RuntimeVersion,
-               Type:       "pom",
-               Scope:      "import",
-       })
-
-       for _, d := range ctx.Build.Dependencies {
-               if strings.HasPrefix(d, "bom:") {
-                       mid := strings.TrimPrefix(d, "bom:")
-                       gav := strings.Replace(mid, "/", ":", -1)
-
-                       d, err := maven.ParseGAV(gav)
-                       if err != nil {
-                               return maven.Project{}, err
-                       }
-
-                       p.DependencyManagement.Dependencies = 
append(p.DependencyManagement.Dependencies, maven.Dependency{
-                               GroupID:    d.GroupID,
-                               ArtifactID: d.ArtifactID,
-                               Version:    d.Version,
-                               Type:       "pom",
-                               Scope:      "import",
-                       })
-               }
-       }
-
-       return p, nil
-}
diff --git a/pkg/builder/builder_utils_test.go 
b/pkg/builder/builder_utils_test.go
deleted file mode 100644
index 951d035..0000000
--- a/pkg/builder/builder_utils_test.go
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
-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 builder
-
-import (
-       "testing"
-
-       "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
-       "github.com/apache/camel-k/pkg/util/maven"
-       "github.com/apache/camel-k/pkg/util/test"
-
-       "github.com/stretchr/testify/assert"
-)
-
-func TestNewProject(t *testing.T) {
-       catalog, err := test.DefaultCatalog()
-       assert.Nil(t, err)
-
-       ctx := Context{
-               Catalog: catalog,
-               Build: v1alpha1.BuildSpec{
-                       RuntimeVersion: catalog.RuntimeVersion,
-                       Platform: v1alpha1.IntegrationPlatformSpec{
-                               Build: v1alpha1.IntegrationPlatformBuildSpec{
-                                       CamelVersion: catalog.Version,
-                               },
-                       },
-                       Dependencies: []string{
-                               "camel-k:runtime-main",
-                               "bom:my.company/my-artifact-1/1.0.0",
-                               "bom:my.company/my-artifact-2/2.0.0",
-                       },
-               },
-       }
-
-       err = generateProject(&ctx)
-       assert.Nil(t, err)
-       assert.ElementsMatch(
-               t,
-               ctx.Maven.Project.DependencyManagement.Dependencies,
-               []maven.Dependency{
-                       {
-                               GroupID:    "org.apache.camel",
-                               ArtifactID: "camel-bom",
-                               Version:    ctx.Catalog.Version,
-                               Type:       "pom",
-                               Scope:      "import",
-                       },
-                       {
-                               GroupID:    "org.apache.camel.k",
-                               ArtifactID: "camel-k-runtime-bom",
-                               Version:    catalog.RuntimeVersion,
-                               Type:       "pom",
-                               Scope:      "import",
-                       },
-                       {
-                               GroupID:    "my.company",
-                               ArtifactID: "my-artifact-1",
-                               Version:    "1.0.0",
-                               Type:       "pom",
-                               Scope:      "import",
-                       },
-                       {
-                               GroupID:    "my.company",
-                               ArtifactID: "my-artifact-2",
-                               Version:    "2.0.0",
-                               Type:       "pom",
-                               Scope:      "import",
-                       },
-               },
-       )
-}
diff --git a/pkg/builder/kaniko/kaniko.go b/pkg/builder/kaniko/kaniko.go
index f5e53cb..efc0291 100644
--- a/pkg/builder/kaniko/kaniko.go
+++ b/pkg/builder/kaniko/kaniko.go
@@ -37,14 +37,8 @@ var Steps = steps{
        ),
 }
 
-// DefaultSteps --
-var DefaultSteps = []builder.Step{
-       builder.Steps.GenerateProject,
-       builder.Steps.GenerateProjectSettings,
-       builder.Steps.InjectDependencies,
-       builder.Steps.SanitizeDependencies,
-       builder.Steps.ComputeDependencies,
-       builder.Steps.IncrementalPackager,
+// KanikoSteps --
+var KanikoSteps = []builder.Step{
        Steps.Publisher,
 }
 
diff --git a/pkg/builder/builder_utils.go b/pkg/builder/runtime/main.go
similarity index 58%
copy from pkg/builder/builder_utils.go
copy to pkg/builder/runtime/main.go
index e6516dd..dbf6668 100644
--- a/pkg/builder/builder_utils.go
+++ b/pkg/builder/runtime/main.go
@@ -15,45 +15,35 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 */
 
-package builder
+package runtime
 
 import (
-       "strings"
+       "io/ioutil"
+       "path"
+
+       "github.com/pkg/errors"
+
+       yaml2 "gopkg.in/yaml.v2"
 
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+       "github.com/apache/camel-k/pkg/builder"
        "github.com/apache/camel-k/pkg/util/camel"
        "github.com/apache/camel-k/pkg/util/defaults"
        "github.com/apache/camel-k/pkg/util/maven"
 )
 
-// StepIDsFor --
-func StepIDsFor(steps ...Step) []string {
-       IDs := make([]string, 0)
-       for _, step := range steps {
-               IDs = append(IDs, step.ID())
-       }
-       return IDs
+// MainSteps --
+var MainSteps = []builder.Step{
+       Steps.GenerateProject,
+       Steps.ComputeDependencies,
 }
 
-func artifactIDs(artifacts []v1alpha1.Artifact) []string {
-       result := make([]string, 0, len(artifacts))
-
-       for _, a := range artifacts {
-               result = append(result, a.ID)
-       }
-
-       return result
-}
-
-// NewMavenProject --
-func NewMavenProject(ctx *Context) (maven.Project, error) {
-       //
+func generateProject(ctx *builder.Context) error {
        // Catalog
-       //
        if ctx.Catalog == nil {
                c, err := camel.LoadCatalog(ctx.C, ctx.Client, ctx.Namespace, 
ctx.Build.Platform.Build.CamelVersion, ctx.Build.Platform.Build.RuntimeVersion)
                if err != nil {
-                       return maven.Project{}, err
+                       return err
                }
 
                ctx.Catalog = c
@@ -64,9 +54,7 @@ func NewMavenProject(ctx *Context) (maven.Project, error) {
        p.DependencyManagement = &maven.DependencyManagement{Dependencies: 
make([]maven.Dependency, 0)}
        p.Dependencies = make([]maven.Dependency, 0)
 
-       //
        // DependencyManagement
-       //
        p.DependencyManagement.Dependencies = 
append(p.DependencyManagement.Dependencies, maven.Dependency{
                GroupID:    "org.apache.camel",
                ArtifactID: "camel-bom",
@@ -82,25 +70,48 @@ func NewMavenProject(ctx *Context) (maven.Project, error) {
                Scope:      "import",
        })
 
-       for _, d := range ctx.Build.Dependencies {
-               if strings.HasPrefix(d, "bom:") {
-                       mid := strings.TrimPrefix(d, "bom:")
-                       gav := strings.Replace(mid, "/", ":", -1)
-
-                       d, err := maven.ParseGAV(gav)
-                       if err != nil {
-                               return maven.Project{}, err
-                       }
-
-                       p.DependencyManagement.Dependencies = 
append(p.DependencyManagement.Dependencies, maven.Dependency{
-                               GroupID:    d.GroupID,
-                               ArtifactID: d.ArtifactID,
-                               Version:    d.Version,
-                               Type:       "pom",
-                               Scope:      "import",
-                       })
+       ctx.Maven.Project = p
+
+       return nil
+}
+
+func computeDependencies(ctx *builder.Context) error {
+       mc := maven.NewContext(path.Join(ctx.Path, "maven"), ctx.Maven.Project)
+       mc.SettingsContent = ctx.Maven.SettingsData
+       mc.LocalRepository = ctx.Build.Platform.Build.LocalRepository
+       mc.Timeout = ctx.Build.Platform.Build.Maven.Timeout.Duration
+       
mc.AddArgumentf("org.apache.camel.k:camel-k-maven-plugin:%s:generate-dependency-list",
 ctx.Catalog.RuntimeVersion)
+
+       if err := maven.Run(mc); err != nil {
+               return errors.Wrap(err, "failure while determining classpath")
+       }
+
+       dependencies := path.Join(mc.Path, "target", "dependencies.yaml")
+       content, err := ioutil.ReadFile(dependencies)
+       if err != nil {
+               return err
+       }
+
+       cp := make(map[string][]v1alpha1.Artifact)
+       err = yaml2.Unmarshal(content, &cp)
+       if err != nil {
+               return err
+       }
+
+       for _, e := range cp["dependencies"] {
+               _, fileName := path.Split(e.Location)
+
+               gav, err := maven.ParseGAV(e.ID)
+               if err != nil {
+                       return nil
                }
+
+               ctx.Artifacts = append(ctx.Artifacts, v1alpha1.Artifact{
+                       ID:       e.ID,
+                       Location: e.Location,
+                       Target:   path.Join("dependencies", 
gav.GroupID+"."+fileName),
+               })
        }
 
-       return p, nil
+       return nil
 }
diff --git a/pkg/builder/builder_steps_test.go 
b/pkg/builder/runtime/main_test.go
similarity index 55%
copy from pkg/builder/builder_steps_test.go
copy to pkg/builder/runtime/main_test.go
index d21564d..e98b813 100644
--- a/pkg/builder/builder_steps_test.go
+++ b/pkg/builder/runtime/main_test.go
@@ -15,46 +15,24 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 */
 
-package builder
+package runtime
 
 import (
        "testing"
 
-       corev1 "k8s.io/api/core/v1"
-       metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+       "github.com/stretchr/testify/assert"
 
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
-       "github.com/apache/camel-k/pkg/util/cancellable"
+       "github.com/apache/camel-k/pkg/builder"
        "github.com/apache/camel-k/pkg/util/maven"
        "github.com/apache/camel-k/pkg/util/test"
-
-       "github.com/stretchr/testify/assert"
 )
 
-type testSteps struct {
-       TestStep Step
-}
-
-func TestRegisterDuplicatedSteps(t *testing.T) {
-       steps := testSteps{
-               TestStep: NewStep(
-                       ApplicationPublishPhase,
-                       func(context *Context) error {
-                               return nil
-                       },
-               ),
-       }
-       RegisterSteps(steps)
-       assert.Panics(t, func() {
-               RegisterSteps(steps)
-       })
-}
-
-func TestGenerateJvmProject(t *testing.T) {
+func TestNewProject(t *testing.T) {
        catalog, err := test.DefaultCatalog()
        assert.Nil(t, err)
 
-       ctx := Context{
+       ctx := builder.Context{
                Catalog: catalog,
                Build: v1alpha1.BuildSpec{
                        RuntimeVersion: catalog.RuntimeVersion,
@@ -65,13 +43,15 @@ func TestGenerateJvmProject(t *testing.T) {
                        },
                        Dependencies: []string{
                                "camel-k:runtime-main",
+                               "bom:my.company/my-artifact-1/1.0.0",
+                               "bom:my.company/my-artifact-2/2.0.0",
                        },
                },
        }
 
-       err = generateProject(&ctx)
+       err = Steps.GenerateProject.Execute(&ctx)
        assert.Nil(t, err)
-       err = injectDependencies(&ctx)
+       err = builder.Steps.InjectDependencies.Execute(&ctx)
        assert.Nil(t, err)
 
        assert.ElementsMatch(
@@ -81,7 +61,7 @@ func TestGenerateJvmProject(t *testing.T) {
                        {
                                GroupID:    "org.apache.camel",
                                ArtifactID: "camel-bom",
-                               Version:    catalog.Version,
+                               Version:    ctx.Catalog.Version,
                                Type:       "pom",
                                Scope:      "import",
                        },
@@ -92,130 +72,86 @@ func TestGenerateJvmProject(t *testing.T) {
                                Type:       "pom",
                                Scope:      "import",
                        },
-               },
-       )
-
-       assert.ElementsMatch(
-               t,
-               ctx.Maven.Project.Dependencies,
-               []maven.Dependency{
-                       {GroupID: "org.apache.camel.k", ArtifactID: 
"camel-k-runtime-main"},
-                       {GroupID: "org.apache.camel", ArtifactID: 
"camel-core-engine"},
-                       {GroupID: "org.apache.camel", ArtifactID: "camel-main"},
-                       {GroupID: "org.apache.camel", ArtifactID: 
"camel-properties"},
-               },
-       )
-}
-
-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",
+                       {
+                               GroupID:    "my.company",
+                               ArtifactID: "my-artifact-1",
+                               Version:    "1.0.0",
+                               Type:       "pom",
+                               Scope:      "import",
                        },
-                       Data: map[string]string{
-                               "settings.xml": "setting-data",
+                       {
+                               GroupID:    "my.company",
+                               ArtifactID: "my-artifact-2",
+                               Version:    "2.0.0",
+                               Type:       "pom",
+                               Scope:      "import",
                        },
                },
        )
+}
 
+func TestGenerateJvmProject(t *testing.T) {
+       catalog, err := test.DefaultCatalog()
        assert.Nil(t, err)
 
-       ctx := Context{
-               Catalog:   catalog,
-               Client:    c,
-               Namespace: "ns",
+       ctx := builder.Context{
+               Catalog: catalog,
                Build: v1alpha1.BuildSpec{
                        RuntimeVersion: catalog.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{
+                               "camel-k:runtime-main",
+                       },
                },
        }
 
-       err = generateProjectSettings(&ctx)
+       err = Steps.GenerateProject.Execute(&ctx)
        assert.Nil(t, err)
-
-       assert.Equal(t, []byte("setting-data"), ctx.Maven.SettingsData)
-}
-
-func TestMavenSettingsFromSecret(t *testing.T) {
-       catalog, err := test.DefaultCatalog()
+       err = builder.Steps.InjectDependencies.Execute(&ctx)
        assert.Nil(t, err)
 
-       c, err := test.NewFakeClient(
-               &corev1.Secret{
-                       TypeMeta: metav1.TypeMeta{
-                               APIVersion: "v1",
-                               Kind:       "Secret",
-                       },
-                       ObjectMeta: metav1.ObjectMeta{
-                               Namespace: "ns",
-                               Name:      "maven-settings",
+       assert.ElementsMatch(
+               t,
+               ctx.Maven.Project.DependencyManagement.Dependencies,
+               []maven.Dependency{
+                       {
+                               GroupID:    "org.apache.camel",
+                               ArtifactID: "camel-bom",
+                               Version:    catalog.Version,
+                               Type:       "pom",
+                               Scope:      "import",
                        },
-                       Data: map[string][]byte{
-                               "settings.xml": []byte("setting-data"),
+                       {
+                               GroupID:    "org.apache.camel.k",
+                               ArtifactID: "camel-k-runtime-bom",
+                               Version:    catalog.RuntimeVersion,
+                               Type:       "pom",
+                               Scope:      "import",
                        },
                },
        )
 
-       assert.Nil(t, err)
-
-       ctx := Context{
-               Catalog:   catalog,
-               Client:    c,
-               Namespace: "ns",
-               Build: v1alpha1.BuildSpec{
-                       RuntimeVersion: catalog.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",
-                                                       },
-                                               },
-                                       },
-                               },
-                       },
+       assert.ElementsMatch(
+               t,
+               ctx.Maven.Project.Dependencies,
+               []maven.Dependency{
+                       {GroupID: "org.apache.camel.k", ArtifactID: 
"camel-k-runtime-main"},
+                       {GroupID: "org.apache.camel", ArtifactID: 
"camel-core-engine"},
+                       {GroupID: "org.apache.camel", ArtifactID: "camel-main"},
+                       {GroupID: "org.apache.camel", ArtifactID: 
"camel-properties"},
                },
-       }
-
-       err = generateProjectSettings(&ctx)
-       assert.Nil(t, err)
-
-       assert.Equal(t, []byte("setting-data"), ctx.Maven.SettingsData)
+       )
 }
 
 func TestGenerateGroovyProject(t *testing.T) {
        catalog, err := test.DefaultCatalog()
        assert.Nil(t, err)
 
-       ctx := Context{
+       ctx := builder.Context{
                Catalog: catalog,
                Build: v1alpha1.BuildSpec{
                        RuntimeVersion: catalog.RuntimeVersion,
@@ -231,9 +167,9 @@ func TestGenerateGroovyProject(t *testing.T) {
                },
        }
 
-       err = generateProject(&ctx)
+       err = Steps.GenerateProject.Execute(&ctx)
        assert.Nil(t, err)
-       err = injectDependencies(&ctx)
+       err = builder.Steps.InjectDependencies.Execute(&ctx)
        assert.Nil(t, err)
 
        assert.ElementsMatch(
@@ -276,7 +212,7 @@ func TestSanitizeDependencies(t *testing.T) {
        catalog, err := test.DefaultCatalog()
        assert.Nil(t, err)
 
-       ctx := Context{
+       ctx := builder.Context{
                Catalog: catalog,
                Build: v1alpha1.BuildSpec{
                        RuntimeVersion: catalog.RuntimeVersion,
@@ -294,11 +230,11 @@ func TestSanitizeDependencies(t *testing.T) {
                },
        }
 
-       err = generateProject(&ctx)
+       err = Steps.GenerateProject.Execute(&ctx)
        assert.Nil(t, err)
-       err = injectDependencies(&ctx)
+       err = builder.Steps.InjectDependencies.Execute(&ctx)
        assert.Nil(t, err)
-       err = sanitizeDependencies(&ctx)
+       err = builder.Steps.SanitizeDependencies.Execute(&ctx)
        assert.Nil(t, err)
 
        assert.Contains(t, ctx.Maven.Project.Dependencies, maven.Dependency{
@@ -319,62 +255,3 @@ func TestSanitizeDependencies(t *testing.T) {
                Version:    "1.2.3",
        })
 }
-
-func TestListPublishedImages(t *testing.T) {
-       catalog, err := test.DefaultCatalog()
-       assert.Nil(t, err)
-
-       c, err := test.NewFakeClient(
-               &v1alpha1.IntegrationKit{
-                       TypeMeta: metav1.TypeMeta{
-                               APIVersion: 
v1alpha1.SchemeGroupVersion.String(),
-                               Kind:       v1alpha1.IntegrationKindKind,
-                       },
-                       ObjectMeta: metav1.ObjectMeta{
-                               Namespace: "ns",
-                               Name:      "my-kit-1",
-                               Labels: map[string]string{
-                                       "camel.apache.org/kit.type": 
v1alpha1.IntegrationKitTypePlatform,
-                               },
-                       },
-                       Status: v1alpha1.IntegrationKitStatus{
-                               Phase:          
v1alpha1.IntegrationKitPhaseError,
-                               Image:          "image-1",
-                               CamelVersion:   catalog.Version,
-                               RuntimeVersion: catalog.RuntimeVersion,
-                       },
-               },
-               &v1alpha1.IntegrationKit{
-                       TypeMeta: metav1.TypeMeta{
-                               APIVersion: 
v1alpha1.SchemeGroupVersion.String(),
-                               Kind:       v1alpha1.IntegrationKindKind,
-                       },
-                       ObjectMeta: metav1.ObjectMeta{
-                               Namespace: "ns",
-                               Name:      "my-kit-2",
-                               Labels: map[string]string{
-                                       "camel.apache.org/kit.type": 
v1alpha1.IntegrationKitTypePlatform,
-                               },
-                       },
-                       Status: v1alpha1.IntegrationKitStatus{
-                               Phase:          
v1alpha1.IntegrationKitPhaseReady,
-                               Image:          "image-2",
-                               CamelVersion:   catalog.Version,
-                               RuntimeVersion: catalog.RuntimeVersion,
-                       },
-               },
-       )
-
-       assert.Nil(t, err)
-       assert.NotNil(t, c)
-
-       i, err := listPublishedImages(&Context{
-               Client:  c,
-               Catalog: catalog,
-               C:       cancellable.NewContext(),
-       })
-
-       assert.Nil(t, err)
-       assert.Len(t, i, 1)
-       assert.Equal(t, "image-2", i[0].Image)
-}
diff --git a/pkg/builder/runtime/quarkus.go b/pkg/builder/runtime/quarkus.go
new file mode 100644
index 0000000..ddca59e
--- /dev/null
+++ b/pkg/builder/runtime/quarkus.go
@@ -0,0 +1,142 @@
+package runtime
+
+import (
+       "bufio"
+       "bytes"
+       "os"
+       "path"
+
+       "github.com/pkg/errors"
+
+       "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+       "github.com/apache/camel-k/pkg/builder"
+       "github.com/apache/camel-k/pkg/util/camel"
+       "github.com/apache/camel-k/pkg/util/defaults"
+       "github.com/apache/camel-k/pkg/util/maven"
+)
+
+// QuarkusSteps --
+var QuarkusSteps = []builder.Step{
+       Steps.GenerateQuarkusProject,
+       Steps.ComputeQuarkusDependencies,
+}
+
+func generateQuarkusProject(ctx *builder.Context) error {
+       // Catalog
+       if ctx.Catalog == nil {
+               c, err := camel.LoadCatalog(ctx.C, ctx.Client, ctx.Namespace, 
ctx.Build.Platform.Build.CamelVersion, ctx.Build.Platform.Build.RuntimeVersion)
+               if err != nil {
+                       return err
+               }
+
+               ctx.Catalog = c
+       }
+
+       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)
+       p.Build = &maven.Build{Plugins: make([]maven.Plugin, 0)}
+
+       // DependencyManagement
+       p.DependencyManagement.Dependencies = 
append(p.DependencyManagement.Dependencies,
+               maven.Dependency{
+                       GroupID:    "org.apache.camel.quarkus",
+                       ArtifactID: "camel-quarkus-bom",
+                       Version:    "0.2.0",
+                       //Version:    ctx.Catalog.Version,
+                       Type:  "pom",
+                       Scope: "import",
+               },
+               maven.Dependency{
+                       GroupID:    "org.apache.camel.k",
+                       ArtifactID: "camel-k-runtime-bom",
+                       Version:    ctx.Catalog.RuntimeVersion,
+                       Type:       "pom",
+                       Scope:      "import",
+               },
+       )
+
+       // Plugins
+       p.Build.Plugins = append(p.Build.Plugins,
+               maven.Plugin{
+                       GroupID:    "io.quarkus",
+                       ArtifactID: "quarkus-bootstrap-maven-plugin",
+                       // TODO: must be the same as the version required by 
camel-k-runtime
+                       Version: "0.21.2",
+               },
+               maven.Plugin{
+                       GroupID:    "io.quarkus",
+                       ArtifactID: "quarkus-maven-plugin",
+                       // TODO: must be the same as the version required by 
camel-k-runtime
+                       Version: "0.21.2",
+                       Executions: []maven.Execution{
+                               {
+                                       Goals: []string{
+                                               "build",
+                                       },
+                               },
+                       },
+               },
+       )
+
+       ctx.Maven.Project = p
+
+       return nil
+}
+
+func computeQuarkusDependencies(ctx *builder.Context) error {
+       mc := maven.NewContext(path.Join(ctx.Path, "maven"), ctx.Maven.Project)
+       mc.SettingsContent = ctx.Maven.SettingsData
+       mc.LocalRepository = ctx.Build.Platform.Build.LocalRepository
+       mc.Timeout = ctx.Build.Platform.Build.Maven.Timeout.Duration
+
+       // Build the project, as the quarkus-bootstrap plugin build-tree goal
+       // requires the artifact to be installed
+       mc.AddArgument("package")
+       if err := maven.Run(mc); err != nil {
+               return errors.Wrap(err, "failure while building project")
+       }
+
+       // Call the Quarkus dependencies plugin
+       mc.AdditionalArguments = nil
+       mc.AddArguments("quarkus-bootstrap:build-tree")
+       output := new(bytes.Buffer)
+       mc.Stdout = output
+       if err := maven.Run(mc); err != nil {
+               return errors.Wrap(err, "failure while determining 
dependencies")
+       }
+
+       scanner := bufio.NewScanner(output)
+       scanner.Split(bufio.ScanLines)
+       for scanner.Scan() {
+               gav, err := maven.ParseGAV(scanner.Text())
+               if err != nil {
+                       continue
+               }
+
+               fileName := gav.GroupID + "." + gav.ArtifactID + "-" + 
gav.Version + "." + gav.Type
+               location := path.Join(mc.Path, "target", "lib", fileName)
+               _, err = os.Stat(location)
+               // We check that the dependency actually exists in the lib 
directory as the
+               // quarkus-bootstrap Maven plugin reports deployment 
dependencies as well
+               if os.IsNotExist(err) {
+                       continue
+               }
+
+               ctx.Artifacts = append(ctx.Artifacts, v1alpha1.Artifact{
+                       ID:       fileName,
+                       Location: location,
+                       Target:   path.Join("lib", fileName),
+               })
+       }
+
+       runner := "camel-k-integration-" + defaults.Version + "-runner.jar"
+       ctx.Artifacts = append(ctx.Artifacts, v1alpha1.Artifact{
+               ID:       runner,
+               Location: path.Join(mc.Path, "target", runner),
+               Target:   runner,
+       })
+
+       return nil
+}
diff --git a/pkg/builder/kaniko/kaniko.go b/pkg/builder/runtime/runtime.go
similarity index 58%
copy from pkg/builder/kaniko/kaniko.go
copy to pkg/builder/runtime/runtime.go
index f5e53cb..22106e0 100644
--- a/pkg/builder/kaniko/kaniko.go
+++ b/pkg/builder/runtime/runtime.go
@@ -15,7 +15,7 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 */
 
-package kaniko
+package runtime
 
 import (
        "github.com/apache/camel-k/pkg/builder"
@@ -25,28 +25,33 @@ func init() {
        builder.RegisterSteps(Steps)
 }
 
+// TODO: organise runtime steps into nested structs
 type steps struct {
-       Publisher builder.Step
+       // Main
+       GenerateProject     builder.Step
+       ComputeDependencies builder.Step
+       // Quarkus
+       GenerateQuarkusProject     builder.Step
+       ComputeQuarkusDependencies builder.Step
 }
 
-// Steps --
 var Steps = steps{
-       Publisher: builder.NewStep(
-               builder.ApplicationPublishPhase,
-               publisher,
+       // Main
+       GenerateProject: builder.NewStep(
+               builder.ProjectGenerationPhase,
+               generateProject,
+       ),
+       ComputeDependencies: builder.NewStep(
+               builder.ProjectBuildPhase,
+               computeDependencies,
+       ),
+       // Quarkus
+       GenerateQuarkusProject: builder.NewStep(
+               builder.ProjectGenerationPhase,
+               generateQuarkusProject,
+       ),
+       ComputeQuarkusDependencies: builder.NewStep(
+               builder.ProjectBuildPhase,
+               computeQuarkusDependencies,
        ),
 }
-
-// DefaultSteps --
-var DefaultSteps = []builder.Step{
-       builder.Steps.GenerateProject,
-       builder.Steps.GenerateProjectSettings,
-       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/builder/s2i/s2i.go b/pkg/builder/s2i/s2i.go
index b1a3bd8..8ccb13e 100644
--- a/pkg/builder/s2i/s2i.go
+++ b/pkg/builder/s2i/s2i.go
@@ -37,13 +37,7 @@ var Steps = steps{
        ),
 }
 
-// DefaultSteps --
-var DefaultSteps = []builder.Step{
-       builder.Steps.GenerateProject,
-       builder.Steps.GenerateProjectSettings,
-       builder.Steps.InjectDependencies,
-       builder.Steps.SanitizeDependencies,
-       builder.Steps.ComputeDependencies,
-       builder.Steps.IncrementalPackager,
+// S2iSteps --
+var S2iSteps = []builder.Step{
        Steps.Publisher,
 }
diff --git a/pkg/trait/builder.go b/pkg/trait/builder.go
index 7b167ff..a017cc2 100644
--- a/pkg/trait/builder.go
+++ b/pkg/trait/builder.go
@@ -19,7 +19,9 @@ package trait
 
 import (
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+       "github.com/apache/camel-k/pkg/builder"
        "github.com/apache/camel-k/pkg/builder/kaniko"
+       "github.com/apache/camel-k/pkg/builder/runtime"
        "github.com/apache/camel-k/pkg/builder/s2i"
        "github.com/apache/camel-k/pkg/platform"
 )
@@ -44,12 +46,23 @@ func (t *builderTrait) Configure(e *Environment) (bool, 
error) {
 }
 
 func (t *builderTrait) Apply(e *Environment) error {
+       e.Steps = append(e.Steps, builder.DefaultSteps...)
        if platform.SupportsS2iPublishStrategy(e.Platform) {
-               e.Steps = s2i.DefaultSteps
+               e.Steps = append(e.Steps, s2i.S2iSteps...)
        } else if platform.SupportsKanikoPublishStrategy(e.Platform) {
-               e.Steps = kaniko.DefaultSteps
+               e.Steps = append(e.Steps, kaniko.KanikoSteps...)
                e.BuildDir = kaniko.BuildDir
        }
 
+       quarkus := e.Catalog.GetTrait("quarkus").(*quarkusTrait)
+
+       if quarkus.isEnabled() {
+               // Add build steps for Quarkus runtime
+               quarkus.addBuildSteps(e)
+       } else {
+               // Add build steps for default runtime
+               e.Steps = append(e.Steps, runtime.MainSteps...)
+       }
+
        return nil
 }
diff --git a/pkg/trait/dependencies.go b/pkg/trait/dependencies.go
index 9659577..69fb824 100644
--- a/pkg/trait/dependencies.go
+++ b/pkg/trait/dependencies.go
@@ -51,41 +51,54 @@ func (t *dependenciesTrait) Apply(e *Environment) error {
                        util.StringSliceUniqueAdd(&dependencies, dep)
                }
        }
+
+       quarkus := e.Catalog.GetTrait("quarkus").(*quarkusTrait)
+       if quarkus.isEnabled() {
+               err := quarkus.addRuntimeDependencies(e, &dependencies)
+               if err != nil {
+                       return err
+               }
+       } else {
+               addDefaultRuntimeDependencies(e, &dependencies)
+       }
+
+       // sort the dependencies to get always the same list if they don't 
change
+       sort.Strings(dependencies)
+       e.Integration.Status.Dependencies = dependencies
+       return nil
+}
+
+func addDefaultRuntimeDependencies(e *Environment, dependencies *[]string) {
        for _, s := range e.Integration.Sources() {
                meta := metadata.Extract(e.CamelCatalog, s)
 
                switch s.InferLanguage() {
                case v1alpha1.LanguageGroovy:
-                       util.StringSliceUniqueAdd(&dependencies, 
"mvn:org.apache.camel.k/camel-k-loader-groovy")
+                       util.StringSliceUniqueAdd(dependencies, 
"mvn:org.apache.camel.k/camel-k-loader-groovy")
                case v1alpha1.LanguageKotlin:
-                       util.StringSliceUniqueAdd(&dependencies, 
"mvn:org.apache.camel.k/camel-k-loader-kotlin")
+                       util.StringSliceUniqueAdd(dependencies, 
"mvn:org.apache.camel.k/camel-k-loader-kotlin")
                case v1alpha1.LanguageYaml:
-                       util.StringSliceUniqueAdd(&dependencies, 
"mvn:org.apache.camel.k/camel-k-loader-yaml")
+                       util.StringSliceUniqueAdd(dependencies, 
"mvn:org.apache.camel.k/camel-k-loader-yaml")
                case v1alpha1.LanguageXML:
-                       util.StringSliceUniqueAdd(&dependencies, 
"mvn:org.apache.camel.k/camel-k-loader-xml")
+                       util.StringSliceUniqueAdd(dependencies, 
"mvn:org.apache.camel.k/camel-k-loader-xml")
                case v1alpha1.LanguageJavaScript:
-                       util.StringSliceUniqueAdd(&dependencies, 
"mvn:org.apache.camel.k/camel-k-loader-js")
+                       util.StringSliceUniqueAdd(dependencies, 
"mvn:org.apache.camel.k/camel-k-loader-js")
                case v1alpha1.LanguageJavaClass:
-                       util.StringSliceUniqueAdd(&dependencies, 
"mvn:org.apache.camel.k/camel-k-loader-java")
+                       util.StringSliceUniqueAdd(dependencies, 
"mvn:org.apache.camel.k/camel-k-loader-java")
                case v1alpha1.LanguageJavaSource:
-                       util.StringSliceUniqueAdd(&dependencies, 
"mvn:org.apache.camel.k/camel-k-loader-java")
+                       util.StringSliceUniqueAdd(dependencies, 
"mvn:org.apache.camel.k/camel-k-loader-java")
                }
 
                if strings.HasPrefix(s.Loader, "knative-source") {
-                       util.StringSliceUniqueAdd(&dependencies, 
"mvn:org.apache.camel.k/camel-k-loader-knative")
-                       util.StringSliceUniqueAdd(&dependencies, 
"mvn:org.apache.camel.k/camel-k-runtime-knative")
+                       util.StringSliceUniqueAdd(dependencies, 
"mvn:org.apache.camel.k/camel-k-loader-knative")
+                       util.StringSliceUniqueAdd(dependencies, 
"mvn:org.apache.camel.k/camel-k-runtime-knative")
                }
 
                // main required by default
-               util.StringSliceUniqueAdd(&dependencies, 
"mvn:org.apache.camel.k/camel-k-runtime-main")
+               util.StringSliceUniqueAdd(dependencies, 
"mvn:org.apache.camel.k/camel-k-runtime-main")
 
                for _, d := range meta.Dependencies.List() {
-                       util.StringSliceUniqueAdd(&dependencies, d)
+                       util.StringSliceUniqueAdd(dependencies, d)
                }
        }
-
-       // sort the dependencies to get always the same list if they don't 
change
-       sort.Strings(dependencies)
-       e.Integration.Status.Dependencies = dependencies
-       return nil
 }
diff --git a/pkg/trait/dependencies_test.go b/pkg/trait/dependencies_test.go
index fed00c9..8e75159 100644
--- a/pkg/trait/dependencies_test.go
+++ b/pkg/trait/dependencies_test.go
@@ -27,6 +27,7 @@ import (
 
 func TestDependenciesTraitApplicability(t *testing.T) {
        e := &Environment{
+               Catalog:     NewEnvironmentTestCatalog(),
                Integration: &v1alpha1.Integration{},
        }
 
@@ -51,6 +52,7 @@ func TestIntegrationDefaultDeps(t *testing.T) {
        assert.Nil(t, err)
 
        e := &Environment{
+               Catalog:      NewEnvironmentTestCatalog(),
                CamelCatalog: catalog,
                Integration: &v1alpha1.Integration{
                        Spec: v1alpha1.IntegrationSpec{
@@ -93,6 +95,7 @@ func TestIntegrationCustomDeps(t *testing.T) {
        assert.Nil(t, err)
 
        e := &Environment{
+               Catalog:      NewEnvironmentTestCatalog(),
                CamelCatalog: catalog,
                Integration: &v1alpha1.Integration{
                        Spec: v1alpha1.IntegrationSpec{
@@ -140,6 +143,7 @@ func TestIntegrationAutoGeneratedDeps(t *testing.T) {
        assert.Nil(t, err)
 
        e := &Environment{
+               Catalog:      NewEnvironmentTestCatalog(),
                CamelCatalog: catalog,
                Integration: &v1alpha1.Integration{
                        Spec: v1alpha1.IntegrationSpec{
@@ -193,6 +197,7 @@ func TestIntegrationCustomLoader(t *testing.T) {
        assert.Nil(t, err)
 
        e := &Environment{
+               Catalog:      NewEnvironmentTestCatalog(),
                CamelCatalog: catalog,
                Integration: &v1alpha1.Integration{
                        Spec: v1alpha1.IntegrationSpec{
diff --git a/pkg/trait/environment.go b/pkg/trait/environment.go
index c282e34..fb73bcf 100644
--- a/pkg/trait/environment.go
+++ b/pkg/trait/environment.go
@@ -35,6 +35,7 @@ const (
        envVarCamelKRuntimeVersion = "CAMEL_K_RUNTIME_VERSION"
        envVarCamelVersion         = "CAMEL_VERSION"
        envVarMainClass            = "JAVA_MAIN_CLASS"
+       envVarAppJAR               = "JAVA_APP_JAR"
        defaultMainClass           = "org.apache.camel.k.main.Application"
 )
 
@@ -63,7 +64,12 @@ func (t *environmentTrait) Apply(e *Environment) error {
                envvar.SetValFrom(&e.EnvVars, envVarPodName, "metadata.name")
        }
 
-       envvar.SetVal(&e.EnvVars, envVarMainClass, defaultMainClass)
+       quarkus := e.Catalog.GetTrait("quarkus").(*quarkusTrait)
+       if quarkus.isEnabled() {
+               quarkus.addContainerEnvironment(e)
+       } else {
+               envvar.SetVal(&e.EnvVars, envVarMainClass, defaultMainClass)
+       }
 
        return nil
 }
diff --git a/pkg/trait/quarkus.go b/pkg/trait/quarkus.go
new file mode 100644
index 0000000..8b70b11
--- /dev/null
+++ b/pkg/trait/quarkus.go
@@ -0,0 +1,94 @@
+/*
+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 trait
+
+import (
+       "fmt"
+       "strings"
+
+       "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+       "github.com/apache/camel-k/pkg/builder/runtime"
+       "github.com/apache/camel-k/pkg/metadata"
+       "github.com/apache/camel-k/pkg/util"
+       "github.com/apache/camel-k/pkg/util/defaults"
+       "github.com/apache/camel-k/pkg/util/envvar"
+)
+
+type quarkusTrait struct {
+       BaseTrait `property:",squash"`
+}
+
+func newQuarkusTrait() *quarkusTrait {
+       return &quarkusTrait{
+               BaseTrait: newBaseTrait("quarkus"),
+       }
+}
+
+func (t *quarkusTrait) isEnabled() bool {
+       return t.Enabled != nil && *t.Enabled
+}
+
+func (t *quarkusTrait) Configure(e *Environment) (bool, error) {
+       return t.isEnabled(), nil
+}
+
+func (t *quarkusTrait) Apply(e *Environment) error {
+       return nil
+}
+
+func (t *quarkusTrait) addBuildSteps(e *Environment) {
+       e.Steps = append(e.Steps, runtime.QuarkusSteps...)
+}
+
+func (t *quarkusTrait) addRuntimeDependencies(e *Environment, dependencies 
*[]string) error {
+       for _, s := range e.Integration.Sources() {
+               meta := metadata.Extract(e.CamelCatalog, s)
+
+               switch language := s.InferLanguage(); language {
+               case v1alpha1.LanguageYaml:
+                       addRuntimeDependency("camel-k-quarkus-loader-yaml", 
dependencies)
+               case v1alpha1.LanguageXML:
+                       addRuntimeDependency("camel-k-quarkus-loader-xml", 
dependencies)
+               case v1alpha1.LanguageJavaScript:
+                       addRuntimeDependency("camel-k-quarkus-loader-js", 
dependencies)
+               default:
+                       return fmt.Errorf("unsupported language for Quarkus 
runtime: %s", language)
+               }
+
+               if strings.HasPrefix(s.Loader, "knative-source") {
+                       addRuntimeDependency("camel-k-quarkus-loader-knative", 
dependencies)
+                       addRuntimeDependency("camel-k-quarkus-knative", 
dependencies)
+               }
+
+               // main required by default
+               addRuntimeDependency("camel-k-runtime-quarkus", dependencies)
+
+               for _, d := range meta.Dependencies.List() {
+                       util.StringSliceUniqueAdd(dependencies, d)
+               }
+       }
+       return nil
+}
+
+func (t *quarkusTrait) addContainerEnvironment(e *Environment) {
+       envvar.SetVal(&e.EnvVars, envVarAppJAR, 
"camel-k-integration-"+defaults.Version+"-runner.jar")
+}
+
+func addRuntimeDependency(dependency string, dependencies *[]string) {
+       util.StringSliceUniqueAdd(dependencies, 
fmt.Sprintf("mvn:org.apache.camel.k/%s", dependency))
+}
diff --git a/pkg/trait/rest-dsl.go b/pkg/trait/rest-dsl.go
index ef6b22b..6a03ad4 100644
--- a/pkg/trait/rest-dsl.go
+++ b/pkg/trait/rest-dsl.go
@@ -27,15 +27,13 @@ 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"
 
-       "github.com/apache/camel-k/pkg/gzip"
-
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
+       "github.com/apache/camel-k/pkg/gzip"
        "github.com/apache/camel-k/pkg/util/defaults"
+       "github.com/apache/camel-k/pkg/util/kubernetes"
        "github.com/apache/camel-k/pkg/util/maven"
 )
 
diff --git a/pkg/trait/trait_catalog.go b/pkg/trait/trait_catalog.go
index b682314..96b6862 100644
--- a/pkg/trait/trait_catalog.go
+++ b/pkg/trait/trait_catalog.go
@@ -52,6 +52,7 @@ type Catalog struct {
        tClasspath        Trait
        tRestDsl          Trait
        tProbes           Trait
+       tQuarkus          Trait
        tContainer        Trait
 }
 
@@ -80,6 +81,7 @@ func NewCatalog(ctx context.Context, c client.Client) 
*Catalog {
                tEnvironment:      newEnvironmentTrait(),
                tClasspath:        newClasspathTrait(),
                tProbes:           newProbesTrait(),
+               tQuarkus:          newQuarkusTrait(),
                tContainer:        newContainerTrait(),
        }
 
@@ -117,6 +119,7 @@ func (c *Catalog) allTraits() []Trait {
                c.tEnvironment,
                c.tClasspath,
                c.tProbes,
+               c.tQuarkus,
                c.tContainer,
        }
 }
@@ -133,6 +136,7 @@ func (c *Catalog) traitsFor(environment *Environment) 
[]Trait {
                        c.tRestDsl,
                        c.tDependencies,
                        c.tBuilder,
+                       c.tQuarkus,
                        c.tEnvironment,
                        c.tDeployer,
                        c.tDeployment,
@@ -155,6 +159,7 @@ func (c *Catalog) traitsFor(environment *Environment) 
[]Trait {
                        c.tRestDsl,
                        c.tDependencies,
                        c.tBuilder,
+                       c.tQuarkus,
                        c.tEnvironment,
                        c.tDeployer,
                        c.tDeployment,
@@ -178,6 +183,7 @@ func (c *Catalog) traitsFor(environment *Environment) 
[]Trait {
                        c.tKnative,
                        c.tDependencies,
                        c.tBuilder,
+                       c.tQuarkus,
                        c.tEnvironment,
                        c.tDeployer,
                        c.tDeployment,
diff --git a/pkg/util/maven/maven.go b/pkg/util/maven/maven.go
index a881bd4..067feca 100644
--- a/pkg/util/maven/maven.go
+++ b/pkg/util/maven/maven.go
@@ -90,7 +90,6 @@ func Run(ctx Context) error {
        }
 
        args := make([]string, 0)
-       args = append(args, ctx.AdditionalArguments...)
        args = append(args, "--batch-mode")
 
        if ctx.LocalRepository == "" {
@@ -109,6 +108,8 @@ func Run(ctx Context) error {
                args = append(args, "--settings", settingsPath)
        }
 
+       args = append(args, ctx.AdditionalArguments...)
+
        timeout := ctx.Timeout
        if timeout == 0 {
                timeout = math.MaxInt64
@@ -120,7 +121,11 @@ func Run(ctx Context) error {
        cmd := exec.CommandContext(c, mvnCmd, args...)
        cmd.Dir = ctx.Path
        cmd.Stderr = os.Stderr
-       cmd.Stdout = os.Stdout
+       if ctx.Stdout != nil {
+               cmd.Stdout = ctx.Stdout
+       } else {
+               cmd.Stdout = os.Stdout
+       }
 
        Log.WithValues("timeout", timeout.String()).Infof("executing: %s", 
strings.Join(cmd.Args, " "))
 
@@ -139,8 +144,6 @@ func ParseGAV(gav string) (Dependency, error) {
        rex := regexp.MustCompile("([^: ]+):([^: ]+)(:([^: ]*)(:([^: 
]+))?)?(:([^: ]+))?")
        res := rex.FindStringSubmatch(gav)
 
-       fmt.Println(res, len(res))
-
        if res == nil || len(res) < 9 {
                return Dependency{}, errors.New("GAV must match 
<groupId>:<artifactId>[:<packagingType>[:<classifier>]]:(<version>|'?')")
        }
diff --git a/pkg/util/maven/maven_types.go b/pkg/util/maven/maven_types.go
index 6adbd06..0bd31f4 100644
--- a/pkg/util/maven/maven_types.go
+++ b/pkg/util/maven/maven_types.go
@@ -21,6 +21,7 @@ import (
        "bytes"
        "encoding/xml"
        "fmt"
+       "io"
        "time"
 )
 
@@ -109,6 +110,7 @@ type Context struct {
        AdditionalEntries   map[string]interface{}
        Timeout             time.Duration
        LocalRepository     string
+       Stdout              io.Writer
 }
 
 // AddEntry --

Reply via email to