Could you possibly move all static initialization code in nxt.Nxt to nxt.Nxt.Init.init method. You probably planned that already, it could be my decompiler f%$'ing stuff up but it shows now that init method is empty (private static void nxt.Nxt.Init.init() {}) and that all code that should go there is in the static class initializer beneath it (again, that's what my decompiler thinks).
The only place where it matters is in the blockchain scan, and I will delay this to be done in the ThreadPool.start() so that you can first add listeners to the BlockchainProcessor.
The rest of the init() is intentionally done static so that it can only be run once, and it has to be in an inner class because otherwise the initializers of Peers and other classes will deadlock with the init() of Nxt.
Also. You read in both "nxt-default.properties" and "nxt.properties" in the static class initializer in nxt.Nxt. The runtime exceptions thrown when those files are missing (our case) cannot be caught. I believe this code belongs in nxt.Nxt.Init.init to.
The nxt-default.properties has to be there. I don't throw exceptions if nxt.properties is missing. Why do you not want to use nxt-default.properties? It only needs to be in the classpath, it can be hidden from the user.
This cannot be done in init, because properties must be loaded before any other classes attempt to get them using Nxt.getStringProperty() etc., such as the Logger initializing its debug and enableStackTraces as static final. Allowing additional properties overrides in the init() was not such a good idea. If you want to add listeners to BlockchainProcessor for example, before init() has been called, it still needs to see the correct values of all properties - so it is too late to set them in init().