In OpenGL 3.0 the fixed functionality has been deprecated. In OpenGL 3.1 it has been removed completely from the API, although it exists as an optional extension that drivers can still implement. Currently cards that support 3.0+ also support < 2.1, you just have to request which profile you want to use when creating your windows.
I have trouble getting my head around this.
If I write code today targeting (say) OpenGL 2.1 and requesting the appropriate profile in JOGL2 (or LWJGL, assuming that works similarly), then in four years (nominally) that code won't run on a lot of up-to-date graphics cards.
On the other hand, if I write code today targeting OpenGL 3.1, then it won't run on a lot of existing graphics cards.
Am I getting that right?
Simon