CORBA and RMI (and Web Services) allow you to have distributed Java components invoke methods remotely. You don't always want to run everything within the same JVM, so you need a way for the different processes to talk.
RMI is Java-only, but can talk via the Internet Inter-ORB Protocol (IIOP) to CORBA components. CORBA components can be C/C++/Smalltalk/whatever
IDL = CORBA's Interface Definition Language - it's just a language neutral way to specify a service interface (similar to WSDL in web Services).
The ORB is the Object Request Broker, which is essentially the glue between your client and server which turns objects into data to send, and the data it receives into objects.
If you want to write distributed apps that are all Java, you're better off using either RMI or web services. If you want to write distributed systems that have non-Java components, you're better off using web services than CORBA, unless you're sending a *lot* of data and you need to squeeze every last drop of performance out of your architecture,
Dave Clark<br />Senior WebSphere Architect<br /><a href="http://www.versant.com" target="_blank" rel="nofollow">Versant Open Access - JDO2 & EJB3</a>