I'm interested to know what is wrong with the approach in Crafting Interpreters, if you don't mind sharing.
If one wants to learn specifically how Java works, then maybe a book on compilers would be better?
Note that Lisp in Lisp (SICP) works well because Lisp itself is very simple and just the essentials. It's just one chapter in SICP.
JikesRVM, MaximeVM and now GraalVM.