what to do with about printing to much?
I don't think Robocode exposes anything about the environment (app vs control API, graphics or not). You can tell if graphical debugging is enabled, though, because onPaint() will be called. You could use that as your debug switch. I mainly use graphical debugging and log severe stuff to file.
As for X11, I don't know, I would guess it's due to using some java.awt code internally or something. I have run RoboRumble over a terminal quite a bit, but maybe my terminal has the X stuff setup. (Mac OS X Terminal connecting to Ubuntu.)
Unfortunately, RoboRunner seems to suffer from the same issue.
Set DISPLAY variable to something crazy and run RoboRunner you will see it crush as well.
Try adding the "-Djava.awt.headless=true" parameter to how you invoke Java. I believe that does the trick. I seem to recall once trying this in the past.
This helps with rumble clients, so it probably good idea to ping developers about this switch to be on by default.
However, it does not help with RoboRunner.
You can update the JVM arguments passed to the Robocode process by modifying "jvmArgs" in roborunner.properties. Each thread starts in its own process with its own JVM because the Robocode engine isn't thread-safe.
Edit: And I'll put it on my RoboRunner to-do list. :-) I didn't have any other plans for a next version but it could probably use a few touchups...