Sorry, what? I was out clearing some jungle off of my bamboo airplane -- convinced this is why the cans of SPAM stopped falling out of the sky.
Currently, our "monolithic" EAR is 140MB. Gorged with jars from who knows where. Obviously that doesn't include the Glassfish runtime. While we don't have bandwidth issues here at the office, the remote folks do, so since we ship branches of SVN for our code, for those folks we simply build on the remote servers and deploy directly from there.
I can't promise anything, but ideally my future projects with micro services won't be 140MB large. An "empty" Jersey + Weld project is 15MB, which is not outrageous. And appears to have a startup memory footprint of 8-10M. Obviously it's larger than the 10 line "hello world" service that it publishes.
There are several deployment scenarios that can be done that does not require a fat jar, nor a container. The crudest method is a static CLASSPATH. We did that in the early days, and I won't go back. I loathe the CLASSPATH env variable, at least one managed by human hands. But mvn exec will do the job handily. I can upload the skinny jar, the pom, and the config file, and run that. Point maven at an internal repository, and it will suck down any necessary requirements, stand up the CLASSPATH for me, and of and away it goes. Maven even handles the versioning problems. So, unless you want to consider maven a "container", there are ways to work with skinny jars. And this is just stuff off the top of my head.
I don't know why the fellow who wrote that article, with his thousands of services, and billions of file operations didn't write a class loader that can peer in to a bundled lib folder within the fat jar, and just insert the jars wholesale. He didn't even have to write one, he could have adapted the one in Tomcat, since it has to solve this exact problem anyway with jars in unexploded WARs.
What I get out of a fat jar experience, ideally, is simplicity. I have strategically limited the scope of my container. Jersey is not a trivial runtime, neither is Weld. But it's even less than the entire GF runtime. Ideally my config file will be perhaps a dozen lines rather than 900 like my GF domain.xml. Something I can manage succinctly with vi, rather than asadmin or the GF console. Ideally all of this lowers the overall cognitive load.
Make no mistake, I really like Glassfish and Java EE as manifested by Glassfish. I've been working with it for 10 years, back before it was even Glassfish, and it's filed under my "cold dead hands" folder. I've abused it in unspeakable ways. But I've spent a lot of time single stepping through the container. Sometimes fruitfully, sometimes with futility. GF has a LOT of code. NetBeans gets the shakes when the project is loaded. And, I'm getting to the point where if I can't build it, and grok it, and fix it, I don't want it anymore. I'm a crummy home mechanic. I'll call a plumber to fix a faucet and take my truck the dealer (THE DEALER!) to get an oil change. But I'm pretty handsy with my code.
A tenet I work with, that apparently most folks don't seem to understand, is when you bring in 3rd party code, you may not understand it, but you're responsible for it anyway. I'm responsible for the 1.5M LoC in GF (along with everything else).
So, I'm trying to simplify my applications. JEE offers 100% solutions to all sorts of edge cases that do not apply to me, so I'm happy with an 80% solution that I understand. Writing some quick classes for declarative transactions using CDI does not scare me. Writing a home grown JMS listener that's kinda sorta maybe like an MDB does not scare me.
What the fat jar brings me is less baggage, smaller footprint, lower cognitive load, more control. JAX-RS and CDI, fat and filled with magic that they are, I think will be a perfect foundation to build upon. JAX-RS scratches that "all the BS boiler plate I don't have to do just to get a request marshaled and routed" itch, and CDI gives me lifecycle. I can do anything given a good lifecycle, especially an extensible lifecycle. I'll roll in a Connection Pool, Functional Declarative Transactions, and Functional MDBs.
Make no mistake, it's not a NIH thing driving this, it's simply responsibility for this stuff. Which is why someone else making my fat jar runtime for me is a great idea :). I just want it smaller.