Categories
00 - Cloud-Native App Dev

How to accelerate your cloud-native AppDev with knative Java and OpenShift

Quarkus is the bright new star in the cloud-native App Dev universe! Quarkus is Red Hat’s upstream stack for Kubernetes native Java. Its characteristics are simple:

  • Quarkus is small!
  • Quarkus is fast!
  • Quarkus is familiar!

… and Quarkus makes Java relevant again in the cloud-native world where everyone talks about lightweight architectures, event-driven paradigms, container platforms and languages other than Java. Why? Languages like Go and Node.js are supposed to fit better the requirements that come along with it.

Let’s see if this still holds true …

Getting Started – The Quarkus Maven Plugin

Let’s get started and let’s create an example from scratch. We first start with … hmmmm … what’s exactly our first step? Copy a skeleton from some older project? Search the web for some examples? Tailor the copied code until it fits our needs? Crossing fingers to hit a current Maven POM with the latest dependencies? But is it exactly what we need?

Quarkus was built with Developer Joy in mind! We simply do what a developer is used to do: use Maven! Quarkus provides you a Maven plugin to make your life easier:

mvn io.quarkus:quarkus-maven-plugin:1.9.0.Final:help
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- quarkus-maven-plugin:1.9.0.Final:help (default-cli) @ standalone-pom ---
[INFO] Quarkus - Maven Plugin 1.9.0.Final
  Build parent to bring in required dependencies

This plugin has 18 goals:

quarkus:add-extension
  Allow adding an extension to an existing pom.xml file. Because you can add one
  or several extension in one go, there are 2 mojos: add-extensions and
  add-extension. Both supports the extension and extensions parameters.

quarkus:add-extensions
  Allow adding extensions to an existing pom.xml file. Because you can add one
  or several extension in one go, there are 2 mojos: add-extensions and
  add-extension. Both supports the extension and extensions parameters.

quarkus:analyze-call-tree
  Analyze call tree of a method or a class based on an existing report produced
  by Substrate when using -H:+PrintAnalysisCallTree, and does a more meaningful
  analysis of what is causing a type to be retained.

quarkus:build
  Build the application.
  You can build a native application runner with native-image

quarkus:create
  This goal helps in setting up Quarkus Maven project with quarkus-maven-plugin,
  with sensible defaults

quarkus:create-extension
  Creates a triple of stub Maven modules (Parent, Runtime and Deployment) to
  implement a new Quarkus Extension.
  Adding into an established source tree
  If this Mojo is executed in a directory that contains a pom.xml file with
  packaging pom the newly created Parent module is added as a child module to
  the existing pom.xml file.
  
  Creating a source tree from scratch
  Executing this Mojo in an empty directory is not supported yet.

quarkus:dev
  The dev mojo, that runs a quarkus app in a forked process. A background
  compilation process is launched and any changes are automatically reflected in
  your running application.
  You can use this dev mode in a remote container environment with remote-dev.

quarkus:generate-code

quarkus:generate-code-tests

quarkus:generate-config
  Generates an example application-config.properties, with all properties
  commented out If this is already present then it will be appended too,
  although only properties that were not already present

quarkus:help
  Display help information on quarkus-maven-plugin.
  Call mvn quarkus:help -Ddetail=true -Dgoal=<goal-name> to display parameter
  details.

quarkus:list-extensions
  List the available extensions. You can add one or several extensions in one
  go, with the 2 following mojos: add-extensions and add-extension. You can list
  all extension or just installable. Choose between 3 output formats: name,
  concise and full.

quarkus:native-image
  Deprecated. No reason given

quarkus:prepare

quarkus:prepare-tests

quarkus:remote-dev
  The dev mojo, that connects to a remote host.

quarkus:remove-extension
  Allow removing an extension from an existing pom.xml file. Because you can
  remove one or several extension in one go, there are 2 mojos:
  remove-extensions and remove-extension. Both supports the extension and
  extensions parameters.

quarkus:remove-extensions
  Allow removing extensions to an existing pom.xml file. Because you can remove
  one or several extension in one go, there are 2 mojos: remove-extensions and
  remove-extension. Both supports the extension and extensions parameters.


[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.982 s
[INFO] Finished at: 2020-10-23T16:31:54+02:00
[INFO] ------------------------------------------------------------------------

If you need more information for each of the Maven goals you can use this command to get detailed output:

mvn quarkus:help -Ddetail=true -Dgoal=<goal-name>

The create Maven goal simply allows us to create a skeleton project which is tailored to our use case:

mvn io.quarkus:quarkus-maven-plugin:1.9.0.Final:create \
-DprojectGroupId=com.redhat \
-DprojectArtifactId=greeting-quarkus \
-DprojectVersion=1.0-SNAPSHOT \
-DclassName="com.redhat.GreetingResource"
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- quarkus-maven-plugin:1.9.0.Final:create (default-cli) @ standalone-pom ---
[INFO] 
[INFO] Maven Wrapper version 0.5.6 has been successfully set up for your project.
[INFO] Using Apache Maven: 3.6.3
[INFO] Repo URL in properties file: https://repo.maven.apache.org/maven2
[INFO] 
[INFO] 
[INFO] ========================================================================================
[INFO] Your new application has been created in /home/torben/development/greeting-quarkus
[INFO] Navigate into this directory and launch your application with mvn quarkus:dev
[INFO] Your application will be accessible on http://localhost:8080
[INFO] ========================================================================================
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.400 s
[INFO] Finished at: 2020-10-23T16:29:36+02:00
[INFO] ------------------------------------------------------------------------

You can also use the graphical tool at https://code.quarkus.io/ as an alternative to create such a skeleton project.

Ready For Hacking – The Live Coding Mode

One of the adorable features among a few others is the live coding mode. Literally speaking this is a shortcut from the unpopular code-compile-stop-deploy-restart-test cycle to just code-and-test!

Quarkus Live Coding Mode

This is by far not limited to just strings. It also includes structural changes to a class, changes to the Maven POM or adding properties to the one and only single properties file for configuration.

We all know and remember the times when we devs complained about slow hardware, CPU upgrades badly needed, regular SSDs too slow, NVMe is the new standard! Or my all time favourite: “There’s not enough time for writing automated tests! Schedule’s too tight, dev lifecycle takes too much time!”, etc. Sounds familiar?

Sorry folks! No excuses anymore!

Open to the world – OpenShift Deployment Made Easy

Once we’re done with local development we are gonna deploy it to a Kubernetes driven platform.
“But, wait!??!! Kubernetes? I’ve heard there’s a lot of YAML to hack before being able to deploy to such environments.” And yes, you’re right, but Quarkus is here to help you out:

We need to add a dependency to our project which will take care of all the Kubernetes YAML stuff:

./mvnw quarkus:add-extension -Dextension=openshift
[INFO] Scanning for projects...
[INFO] 
[INFO] --------------------< com.redhat:greeting-quarkus >---------------------
[INFO] Building greeting-quarkus 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- quarkus-maven-plugin:1.9.0.Final:add-extension (default-cli) @ greeting-quarkus ---
✅ Extension io.quarkus:quarkus-openshift has been installed
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.357 s
[INFO] Finished at: 2020-10-23T21:33:44+02:00
[INFO] ------------------------------------------------------------------------

Then we’re going to create a new project in OpenShift:

oc new-project greeting
Now using project "greeting" on server "https://api.cloud.cligg.me:6443".

You can add applications to this project with the 'new-app' command. For example, try:

    oc new-app ruby~https://github.com/sclorg/ruby-ex.git

to build a new example application in Ruby. Or use kubectl to deploy a simple Kubernetes application:

    kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node

After we have created our namespace on OpenShift we are now ready to start the deployment. This is as easy as using this ordinary Maven command:

./mvnw clean package -Dquarkus.kubernetes.deploy=true
Quarkus Maven Deployment to OpenShift
[INFO] Scanning for projects...
[INFO] 
[INFO] --------------------< com.redhat:greeting-quarkus >---------------------
[INFO] Building greeting-quarkus 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ greeting-quarkus ---
[INFO] Deleting /home/torben/development/greeting-quarkus/target
[INFO] 
[INFO] --- quarkus-maven-plugin:1.9.0.Final:generate-code (default) @ greeting-quarkus ---
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ greeting-quarkus ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 2 resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ greeting-quarkus ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /home/torben/development/greeting-quarkus/target/classes
[INFO] 
[INFO] --- quarkus-maven-plugin:1.9.0.Final:generate-code-tests (default) @ greeting-quarkus ---
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ greeting-quarkus ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /home/torben/development/greeting-quarkus/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ greeting-quarkus ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to /home/torben/development/greeting-quarkus/target/test-classes
[INFO] 
[INFO] --- maven-surefire-plugin:3.0.0-M5:test (default-test) @ greeting-quarkus ---
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.redhat.GreetingResourceTest
2020-10-23 21:54:23,936 WARN  [io.qua.config] (main) Unrecognized configuration key "quarkus.kubernetes.deploy" was provided; it will be ignored; verify that the dependency extension for this configuration is set or you did not make a typo
2020-10-23 21:54:24,253 INFO  [io.quarkus] (main) Quarkus 1.9.0.Final on JVM started in 1.439s. Listening on: http://0.0.0.0:8081
2020-10-23 21:54:24,253 INFO  [io.quarkus] (main) Profile test activated. 
2020-10-23 21:54:24,253 INFO  [io.quarkus] (main) Installed features: [cdi, kubernetes, resteasy]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.279 s - in com.redhat.GreetingResourceTest
2020-10-23 21:54:25,503 INFO  [io.quarkus] (main) Quarkus stopped in 0.036s
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ greeting-quarkus ---
[INFO] Building jar: /home/torben/development/greeting-quarkus/target/greeting-quarkus-1.0-SNAPSHOT.jar
[INFO] 
[INFO] --- quarkus-maven-plugin:1.9.0.Final:build (default) @ greeting-quarkus ---
[INFO] [org.jboss.threads] JBoss Threads version 3.1.1.Final
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Deploying target 'openshift' since it has the highest priority among the implicitly enabled deployment targets
[INFO] [io.quarkus.deployment.pkg.steps.JarResultBuildStep] Building thin jar: /home/torben/development/greeting-quarkus/target/greeting-quarkus-1.0-SNAPSHOT-runner.jar
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeploy] Kubernetes API Server at 'https://api.cloud.cligg.me:6443/' successfully contacted.
[WARNING] [io.quarkus.kubernetes.deployment.KubernetesProcessor] No registry was set for the container image, so 'ImagePullPolicy' is being force-set to 'IfNotPresent'.
[INFO] Checking for existing resources in: /home/torben/development/greeting-quarkus/src/main/kubernetes.
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Performing openshift binary build with jar on server: https://api.cloud.cligg.me:6443/ in namespace:greeting.
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Applied: ImageStream greeting-quarkus
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Applied: ImageStream openjdk-11
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Applied: BuildConfig greeting-quarkus
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Receiving source from STDIN as archive ...
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Caching blobs under "/var/cache/blobs".
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Getting image source signatures
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Copying blob sha256:fe52369f78c0954b0d74bda583fd6663df6d99ff904da578246f33b65c0c47ac
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Copying blob sha256:41e1474940d5ff346fa62b08d2edcf116482c0b9fdf549dd4ce3a9cfcf0d3fa2
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Copying blob sha256:396754cf27f9e418ecbecce2f78b337f7bae4b1cd33a7d1c8926c54898cadf2f
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Copying config sha256:e502114b0d20d65cbf149b45981f6abdce5594d6ead476dc45aa0e3ad0c26e76
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Writing manifest to image destination
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Storing signatures
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Generating dockerfile with builder image registry.access.redhat.com/ubi8/openjdk-11@sha256:84915c452a97f8a45630944a03a2c2f362ddad712b5ebb470e22e8aa0b734552
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] STEP 1: FROM registry.access.redhat.com/ubi8/openjdk-11@sha256:84915c452a97f8a45630944a03a2c2f362ddad712b5ebb470e22e8aa0b734552
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] STEP 2: LABEL "io.openshift.s2i.destination"="/tmp"       "io.openshift.build.image"="registry.access.redhat.com/ubi8/openjdk-11@sha256:84915c452a97f8a45630944a03a2c2f362ddad712b5ebb470e22e8aa0b734552"       "io.openshift.build.source-location"="/tmp/build/inputs"
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] STEP 3: ENV OPENSHIFT_BUILD_NAME="greeting-quarkus-1"     OPENSHIFT_BUILD_NAMESPACE="greeting"
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] STEP 4: USER root
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] STEP 5: COPY upload/src /tmp/src
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] STEP 6: RUN chown -R 185:0 /tmp/src
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] STEP 7: USER 185
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] STEP 8: RUN /usr/local/s2i/assemble
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] INFO S2I source build with plain binaries detected
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] INFO Copying binaries from /tmp/src to /deployments ...
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/greeting-quarkus-1.0-SNAPSHOT-runner.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/com.fasterxml.jackson.core.jackson-core-2.11.3.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/com.ibm.async.asyncutil-0.1.0.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/com.sun.activation.jakarta.activation-1.2.1.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.netty.netty-buffer-4.1.49.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.netty.netty-codec-4.1.49.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.netty.netty-codec-dns-4.1.49.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.netty.netty-codec-http-4.1.49.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.netty.netty-codec-http2-4.1.49.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.netty.netty-codec-socks-4.1.49.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.netty.netty-common-4.1.49.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.netty.netty-handler-4.1.49.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.netty.netty-handler-proxy-4.1.49.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.netty.netty-resolver-4.1.49.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.netty.netty-resolver-dns-4.1.49.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.netty.netty-transport-4.1.49.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.quarkus.arc.arc-1.9.0.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.quarkus.quarkus-arc-1.9.0.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.quarkus.quarkus-bootstrap-runner-1.9.0.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.quarkus.quarkus-core-1.9.0.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.quarkus.quarkus-development-mode-spi-1.9.0.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.quarkus.quarkus-kubernetes-client-internal-1.9.0.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.quarkus.quarkus-netty-1.9.0.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.quarkus.quarkus-openshift-1.9.0.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.quarkus.quarkus-resteasy-1.9.0.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.quarkus.quarkus-resteasy-common-1.9.0.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.quarkus.quarkus-resteasy-server-common-1.9.0.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.quarkus.quarkus-security-runtime-spi-1.9.0.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.quarkus.quarkus-vertx-core-1.9.0.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.quarkus.quarkus-vertx-http-1.9.0.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.quarkus.security.quarkus-security-1.1.3.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.smallrye.common.smallrye-common-annotation-1.4.0.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.smallrye.common.smallrye-common-classloader-1.4.0.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.smallrye.common.smallrye-common-constraint-1.4.0.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.smallrye.common.smallrye-common-expression-1.4.0.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.smallrye.common.smallrye-common-function-1.4.0.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.smallrye.config.smallrye-config-1.9.1.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.smallrye.config.smallrye-config-common-1.9.1.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.smallrye.reactive.mutiny-0.9.0.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.vertx.vertx-auth-common-3.9.3.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.vertx.vertx-bridge-common-3.9.3.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.vertx.vertx-core-3.9.3.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.vertx.vertx-web-3.9.3.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/io.vertx.vertx-web-common-3.9.3.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/jakarta.annotation.jakarta.annotation-api-1.3.5.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/jakarta.ejb.jakarta.ejb-api-3.2.6.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/jakarta.el.jakarta.el-api-3.0.3.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/jakarta.enterprise.jakarta.enterprise.cdi-api-2.0.2.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/jakarta.inject.jakarta.inject-api-1.0.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/jakarta.interceptor.jakarta.interceptor-api-1.2.5.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/jakarta.transaction.jakarta.transaction-api-1.3.3.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/jakarta.validation.jakarta.validation-api-2.0.2.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/org.eclipse.microprofile.config.microprofile-config-api-1.4.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/org.eclipse.microprofile.context-propagation.microprofile-context-propagation-api-1.0.1.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/org.graalvm.sdk.graal-sdk-20.2.0.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/org.jboss.logging.jboss-logging-3.4.1.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/org.jboss.logging.jboss-logging-annotations-2.1.0.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/org.jboss.logmanager.jboss-logmanager-embedded-1.0.5.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/org.jboss.resteasy.resteasy-core-4.5.8.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/org.jboss.resteasy.resteasy-core-spi-4.5.8.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/org.jboss.slf4j.slf4j-jboss-logging-1.2.0.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/org.jboss.spec.javax.ws.rs.jboss-jaxrs-api_2.1_spec-2.0.1.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/org.jboss.spec.javax.xml.bind.jboss-jaxb-api_2.3_spec-2.0.0.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/org.jboss.threads.jboss-threads-3.1.1.Final.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/org.ow2.asm.asm-8.0.1.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/org.reactivestreams.reactive-streams-1.0.3.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/org.slf4j.slf4j-api-1.7.30.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] target/lib/org.wildfly.common.wildfly-common-1.5.4.Final-format-001.jar
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] STEP 9: CMD /usr/local/s2i/run
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] STEP 10: COMMIT temp.builder.openshift.io/greeting/greeting-quarkus-1:4005ebb5
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Getting image source signatures
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Copying blob sha256:f9ddbcc4e7954a705b700c35c5e5beceabd86af121a6e561d86437a8512a6be6
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Copying blob sha256:90c2e42f948b524cf98005073e0b0aa2065160abf9e8b314976c064e270d92ac
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Copying blob sha256:7b08010864ba4c7ce9dfe1b90244b459b77c0387051659d37454783d10ab1113
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Copying blob sha256:076c167f9549f813e80bc2580e6a3cda40e7318a74dd4fe02f894f7531c96d1a
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Copying config sha256:834f1cb1de5d781b9162050e7cda57aff8c8e712cb5ceed394bf4aacb2e0b44c
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Writing manifest to image destination
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Storing signatures
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] --> 834f1cb1de5
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] 834f1cb1de5d781b9162050e7cda57aff8c8e712cb5ceed394bf4aacb2e0b44c
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Getting image source signatures
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] 
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Pushing image image-registry.openshift-image-registry.svc:5000/greeting/greeting-quarkus:1.0-SNAPSHOT ...
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Copying blob sha256:41e1474940d5ff346fa62b08d2edcf116482c0b9fdf549dd4ce3a9cfcf0d3fa2
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Copying blob sha256:396754cf27f9e418ecbecce2f78b337f7bae4b1cd33a7d1c8926c54898cadf2f
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Copying blob sha256:fe52369f78c0954b0d74bda583fd6663df6d99ff904da578246f33b65c0c47ac
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Copying blob sha256:076c167f9549f813e80bc2580e6a3cda40e7318a74dd4fe02f894f7531c96d1a
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Copying config sha256:834f1cb1de5d781b9162050e7cda57aff8c8e712cb5ceed394bf4aacb2e0b44c
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Writing manifest to image destination
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Storing signatures
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Successfully pushed image-registry.openshift-image-registry.svc:5000/greeting/greeting-quarkus@sha256:fd4a506590b7bd18dc787786142861856890a3dcd4ad2ba37a785abc276e98b7
[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Push successful
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Deploying to openshift server: https://api.cloud.cligg.me:6443/ in namespace: greeting.
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Applied: Service greeting-quarkus.
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Applied: ImageStream greeting-quarkus.
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Applied: ImageStream openjdk-11.
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Applied: BuildConfig greeting-quarkus.
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Applied: DeploymentConfig greeting-quarkus.
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 49942ms
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  58.573 s
[INFO] Finished at: 2020-10-23T21:55:15+02:00
[INFO] ------------------------------------------------------------------------

In around 60 seconds you made your service available globally without hacking a single line of YAML. I’d call that a piece of cake!

You might say: “I don’t have OpenShift!”

No worries! We’ve got you covered. There are multiple options to even get you started for free. Please check out all options at https://www.openshift.com/try

See you next time

Next post will be about the Quarkus extensions and how they can help you in easily leveraging the benefits of using a Kubernetes orchestration engine like OpenShift.

Please let us know if you want to read about something specifically. We do our best to incorporate that into our publishing plan.

Till then, stay safe, take care, good bye!

By Torben Jäger

Torben is a Principal Specialist Solution Architect at Red Hat and a Subject Matter Expert for OpenShift Container Platform.
With a 20 years background in Software Development, Consulting and DevOps Torben is right now guiding Red Hat customers on their Digital Transformation journey, applying Modern AppDev principles to build a lightweight cloud-native architecture using container technology.

3 replies on “How to accelerate your cloud-native AppDev with knative Java and OpenShift”