You can’t teach an old dog new tricks, but you can wrap it in an API compatibility layer. In this post, you’ll learn how to use older versions of Heroku Buildpacks with the Pack CLI by wrapping them in a Cloud Native Buildpack shim that’s as easy as:»
Spring Boot 2.3.0 introduced a new feature you can use to package your app into a Docker image with Cloud Native Buildpacks (CNB). In this post, you’ll learn how to use this mechanism with Heroku buildpacks to create an image you can run on any cloud platform.»
Choosing a Java runtime to install has become… interesting. Simon Ritter of Azul and Matt Raible of Okta have done great write-ups on how to select the right JDK, and in this post you’ll learn how to use a few of those options on Heroku.»
Java libraries that invoke native code (i.e. code written in C/C++ and compiled for a specific platform) via the Java Native Interface (JNI) can allocate memory that is nearly invisible to standard JVM monitoring tools. This creates the potential for very mysterious memory leaks because JNI does not automatically garbage collect or track the non-JVM memory resources allocated on the native side.»
Did you know version 2.8.8 of Jackson Databind (a popular JSON library) has a deserialization vulnerability that can be used to execute any code or command on your system? If you’re using this version you need to update your app immediately.»
Restarts happen, but your users shouldn’t notice them. Every user request should run to completion before the server processing them shuts itself down. This is known as draining requests, and it’s described in the Disposability principle of the 12-factor app. At a high level, here’s what should happen:»
Java heap memory does not make up 100-percent of a JVM process’s memory
allocation. There are many categories of non-heap memory in a JVM process
that often account for more RAM than the heap when they are summed up. It’s possible to set your maximum heap size to 512 MB,
-Xmx512m, and have your process consume more than 1 gigabyte of RAM
Kotlin reminds me of a young Harry Potter. It’s fresh, full of zeal, and has the support of a great institution. Harry had Hogworts, but Kotlin has the entire JVM ecosystem to nurture its growth.»
./gradlew build command should produce the exact same output each time you run it–even when
you run it on someone else’s computer. But the use of dependency version ranges in Gradle
makes it possible for
./gradlew build to resolve different versions of dependencies
during each execution, which makes the output of your builds unpredictable.
Google’s Firebase Realtime Database makes a great backend for mobile apps. It can sync data across clients in realtime, and remains available when your app goes offline.»
In the previous post, you learned how to add a database to your backend service and consume it with Retrofit in an Android app. But you exposed the services without any authentication or authorization. In this post, you’ll learn how to protected those services and add a complete user mangement system to your app with Stormpath.»
In my last post, you learned how to invoke a service from an Android app with Retrofit. Now you’ll extend that example to consume RESTful JSON-based services that are backed by a database on the server.»
This post walks you through the process of creating a backend server API for an Android app, running that API on Heroku, and invoking it from Android with Square Retrofit.»
The Heroku Java Agent is a lightweight tool you can attach to a running Java process to log heap and non-heap memory usage. It is a simple, but powerful reporting mechanism that can provide essential information at critical moments.»
Java apps have traditionally managed TrustStores and KeyStores as regular files on the filesystem in JKS format with
This mechanism was fine when the state-of-the-art in system administration required copying files from server to server.
But in the era of the cloud, our apps need a better system.