Java 14 support for AWS Lambda

Toni Epple
3 min readSep 26, 2020

--

AWS is currently the most popular choice for serverless applications, but the Java Runtime is hopelessly outdated. Why wait for Amazon to fix this, when theres’s a much better solution? The frgaal project is ready to give you all of that in a safe and simple way.

It’s been less than a year that Amazon finally updated it’s Java Lambda runtime to Java 11 and nothing happened since then. Apparently only LTS versions will be supported. If the trend continues, we’ll get a Java 15 Lambda runtime sometime in 2022. Until then, you’ll either have to work with an ancient SDK 11, or wait for Amazon to update their runtime before you can use all the nice new features introduced in versions 12,13,14, and 15 of the SDK. Fortunately there’s now a third option…

frgaal — Babel for Java

JavaScript developers have babeljs, a smart retrofitting compiler that allows them to use all the latest language features without caring about browser compatibility. For Java runtime compatibility wasn’t a big problem so far, because you usually control the runtime. But there are places where you either aren’t allowed to update the version ( common in banks or insurance companies ), or the platform doesn’t support it as in case of AWS Lambda (unless you want to go through the hazzle of rolling your own custom runtime).

frgaal is a retrofitting compiler for Java based on the OpenJDK version of javac. frgaal can run on Java 8 itself and can produce compatible bytecode for Java versions as old as Java 8.

Usage

Let’s try this with the examples from the AWS Developers Guide. There’s a Github repository with instructions to build and deploy the minimal sample. The sample doesn’t even use the latest Lambda Runtime, but the older Java 8 runtime instead. Make sure you meet the requirements for running the sample. We’ll follow the tutorial, but make some changes before building and deploying the app. Let’s follow the instructions for the setup first:

Clone the repository:

$ git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
$ cd aws-lambda-developer-guide/sample-apps/java-basic

And create a Bucket for the deployment artifacts:

java-basic$ ./1-create-bucket.sh
make_bucket: lambda-artifacts-a5e4xmplb5b22e0d

Before we build and deploy we’ll modify the the pom.xml. If you open the pom, you’ll find this section:

Replace it with this to use the frgaal compiler:

We’ll also change the code in Handler.java and replace the response with a multiline text block, which were introduced in Java 13:

Deployment

Now you can continue with the deployment steps from the original tutorial. make sure you build with Maven:

run 2-deploy.sh mvn:

java-basic$ ./2-deploy.sh mvn
[INFO] Scanning for projects...
[INFO] -----------------------< com.example:java-basic >-----------------------
[INFO] Building java-basic-function 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
...

Testing

The final step is to invoke the test to see if it worked:

To do so run the script3-invoke.sh.

java-basic$ ./3-invoke.sh
{
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
"200 OK\nLook at this multiline text\n..."

The script will continue invoking the lambda, just pressCRTL+C to exit.

Summary

That’s it. Just a small change in your Maven pom.xml and you can use the latest Java features in your lambda. There’s no need to roll your own custom runtime or wait for the next release. You can keep your code up to date and you won’t need to catchup with all the new developments when a new version comes out. And the best part is, as soon as the runtime for JDK 15 is out, you can simply update this section of the pom to use the regular compiler again, or continue using frgaal to access even newer features which will have been available by then. For more info on the scope and limitations of the project checkout the frgaal project on Github.

--

--