Java is supposed to be \"write once, run anywhere\" and it really can be, but in some cases it turns into \"write once, debug everywhere\".
What are the most common
Off the top of my head...some of these actually happened at work
JNI
Development tool introduced characters into formatted string literals that worked under Windows but didn't work under Linux (this actually happened)
File system inconsistencies (tightly coupling an application to one environment)
Underlying hardware such as available memory or cores could result in a change of behavior
Using JNI is something that should be looked into. Providing the native library for every target platform can reduce this problem.
I can only speak from personal experience. These are things I've seen:
Assuming you can write to the directory that contains your applications.
There are many different JVMs, so depending on which one the client has installed on their box, they may get slightly different results.