We all know and love the Java Buildpack - the workhorse for pushing majority of our applications to Cloud Foundry. There is also another gem of a buildpack called the TomEE buildpack. As you can guess from the name it is a close cousin of the Tomcat buildpack with the added enhancement that it supports the JavaEE WebProfile, Full profile* and supports the push of ear files.
Wait a Minute !!!!!!!!!!!!!!!!!
We can push web profile and full profile applications* packaged as ear and war files to Cloud Foundry and not just plain vanilla spring apps that run on Tomcat ?
Yes siree bob ....
These are the buildpacks we often use in replatforming to move JavaEE apps to Cloud Foundry with minimal changes.
- TomEE Buildpack since ver. 4.2 commit
- JBOSS Buildpack
- WebSphere Liberty Profile Buildpack
So why go through all this rigmarole and not just push Docker images ?
Well I contend that pushing ear and war files are better than pushing well formed Docker images because a proper Docker CI image pipeline starts looking like what a buildpack does. So skip all the preamble and discovery and leverage the power of buildpacks. Why transmogrify your app to include OS bits and layers etc ? Deal with the currency you are familiar with i.e. jar, war and ear files.
All these buildpacks also have magic in the form of auto-configuration to wire and map your Cloud Foundry bound managed and CUPS services into existing data-sources so that JNDI lookups in your application source don't have to change. This allows for external service configuration to be consumed seamlessly by your data and messaging layers.
Finally if everything else fails then there is always Docker ...
You have my attention now ?? Which buildpacks should I use ?
See that depends on three things 1. What is in the apps and 2. Which app server are they coming from
In general if possible we recommend bootifying your application and leveraging the most useful framework components of the JavaEE stack and running your app using the Java Buildpack. If this is not feasible then your first step is to cf push the app using the buildpack of your application server. This will minimize changes needed to your application.
Thereafter I would proceed to nuke ALL the server specific deployment descriptors such that you can run the app on a generic EE server like TomEE or Payara. If you don't like buildpacks and prefer the fat jar or the uber jar approach instead then bundle the app server within the app and push using the Java Buildpack.
Well now you have me thoroughly confused ...
Don't worry here is a picture that will sort you out ...
I end this blog on a cautious note - There are NO silver bullets in software development.
The benefits from the cloud are maximized form the agility gained from running lighter weight, smaller scale well bounded cloud native apps. Moving monolithic apps to the platform without modernization will yield a benefit that you should invest back into modernizing your application along the 15 factor continuum.
* Note full profile app support in TomEE is not default. You have to do some acrobatics to bundle the right TomEE distribution into the TomEE offline/online buildpack
* Also note some aspects of JavaEE will NOT work in the cloud for instance if there are any 2pc transactions then those transaction managers will obviously not work in a platform that has ephemeral containers and file system.