(Disclaimer: I work for Oracle doing Java EE architecture and other things, but none of my writings here or anywhere else on this site have anything to do with my day job there. In short, as always, these are just the writings of a Java EE hacker using publicly available stuff.)
So in my last post I was musing on the fact that a CDI SE application that appears to do nothing may do a great deal indeed.
Recall that you start a CDI container from Java SE like this:
Now let’s write a portable extension that is notified after the container is open for business:
This extension is not a CDI bean exactly. It doesn’t have a scope (that’s a bit of a white lie, but substantially true). It is created by the java.util.ServiceLoader mechanism once as part of container initialization. That means it needs a no-argument constructor (see line 11) and an entry in its containing archive’s META-INF/services/javax.enterprise.inject.spi.Extension file that, in this case, looks like this:
So let’s mentally park com.serverco’s extension over in the corner in its own jar file, and the main method we outlined above over in the other corner in another jar file.
If we were to run that main method with a classpath consisting of both jar files, we would see:
*** container is open for business!
…on the console, even though neither the main method nor the extension inherently knew about each other.
That’s pretty neat.
Let’s say now our developer wants to be done, right here, and in the abstract in some sense wants to just run this application right here, right now.
Well, she’s going to need some kind of container to do so. She could package this thing up in a .war file and deploy it somewhere, but that is not The Future™, so instead she just wants to run this application.
Jersey, of course, is one implementation of the JAX-RS standard. Our developer could embed Jersey’s recipe for starting an embedded Grizzly server in a main() method she writes, and…but she wanted to be done! She doesn’t want to write a main method with this recipe in it:
Well, OK, someone else could write this main method, and accept her application as a command line argument…which is sort of like deploying, and that’s not The Future™ either.
It would be kind of cool if our developer’s application, when placed on a classpath with potentially other jar files, one of which contains a main method, another of which contains a server implementation, etc., just ran.
It would also be kind of cool if our developer could easily try switching from using Jersey to using RestEasy without really doing much.
CDI 2.0 as you’ve probably guessed makes this pretty simple. Stay tuned for the next post.