docs: private void breakCage(String... args) {
  		if ("false".equalsIgnoreCase(System.getProperty("sjk.breakCage", "true"))) {
  			// do not break
  			return;
  		}
  		RuntimeMXBean rtBean = ManagementFactory.getRuntimeMXBean();
  		String spec = rtBean.getSpecVersion();
  		if (spec.startsWith("1.")) {
  			// good classic Java
  			if (verbose) {
  				System.out.println("Java version " + spec + " skipping cage break");
  			}
  			return;
  		}
  		else {
  			if (getModulesUnlockCommand().length > 0) {
  				// we need to unlock some modules
  				StringBuilder sb = new StringBuilder();
  				for(String a: rtBean.getInputArguments()) {
  					if (sb.length() > 0) {
  						sb.append(" ");
  					}
  					sb.append(a);
  				}
  				if (isUnlocked(sb.toString())) {
  					// modules are unlocked
  					if (verbose) {
  						System.out.println("All required modules are unlocked, skipping cage break");
  					}
  					return;
  				}
  				else {
  					// break cage
  					List<String> command = new ArrayList<String>();
  					File jhome = new File(System.getProperty("java.home"));
  					File jbin = new File(jhome, "bin/java");
  					command.add(jbin.getPath());
  					for(String m: getModulesUnlockCommand()) {
  						command.add("--add-opens");
  						command.add(m);
  					}
  					command.add("-Dsjk.breakCage=false");
  					command.add("-cp");
  					command.add(rtBean.getClassPath());
  					command.addAll(rtBean.getInputArguments());
  					command.add(this.getClass().getName());
  					command.addAll(Arrays.asList(args));
  					
  					System.err.println("Restarting java with unlocked package access");
  					if (verbose) {
  						System.err.println("Exec command: " + formatCmd(command));
  					}
  					
  					ProcessSpawner.start(command);
  				}
  			}
  		}
  	}