Are there any issues in this `Lazy` implementation?
Four notes:


It's not thread-safe. init.apply() could be called multiple times from different threads. (I don't know whether it is an issue or not.)
The constructor should check null inputs. (Effective Java 2nd Edition, Item 38: Check parameters for validity)
You should use append instead of String concatenation:

StringBuilder sb = new StringBuilder();
sb.append("Minimum required Java version is: ").append(minimumRequiredJavaVersion.get()).append("\n");
sb.append("Your system has ").append(JAVA_SPECIFICATION_VERSION).append(".");
return sb.toString();

Instead of the anonymous Prerequisite inner class I'd use a named top-level class (for example, MinimumRequiredJavaVersionPrerequisite). I think it's easier to read, naming it helps readers to understand the purpose of the class.