Closed 0xhtml closed 3 years ago
Danke für den ausführlichen Report :) tritt das immer auf? Ich kann es nämlich nicht reproduzieren.
Ja, dieser Fehler tritt bei mir immer auf. Ich habe das Starten von zwei Beispiel-Computerspielern nochmal ohne die GUI getestet und es passiert der gleiche Fehler.
Logs: server.log client1.log client2.log
Das Issue kann vermutlich in software-challenge/backend verschoben werden, da der Fehler auch ohne GUI auftritt.
Ich habe das ganze nochmal mit Java 11 getestet und damit funktioniert es.
openjdk version "11.0.12" 2021-07-20
OpenJDK Runtime Environment (build 11.0.12+7)
OpenJDK 64-Bit Server VM (build 11.0.12+7, mixed mode)
Interessant, ich habe bei mir mit Java 11 und 16 getestet und alles hat funktioniert - und ich bin auch auf Arch. Vielleicht liegt es daran, dass es mit Java 11 kompiliert und Java 16 ausgeführt wurde...
Jup, reproduziert. Mal schauen ob man eine generic-version bauen kann...
Scheint diesem Problem zu entsprechen: https://github.com/x-stream/xstream/issues/253
Ok, mit der --illegal-access=permit
-Flag kann ich die Server-, Defaultplayer- und GUI-Jar auch mit Java 16 ausführen. Ich verstehe aber nicht warum das so ist.
Weil Java immer restriktiver wird was package access angeht, und teils sehr nützliche tools unter Zugriffsbeschränkungen versteckt ^^
Momentchen, bei mir funktioniert die Flag nicht, kannst du mir nochmal genau zeigen wie du es ausführst? :sweat_smile:
So führe ich die GUI und Server aus: java --illegal-access=permit -jar socha.jar
ah, ich hatte die flag ans ende gesetzt, so ergibt das natürlich Sinn. Das kann ich dann allerdings wahrscheinlich ohne ein custom launch-script nicht fest verbauen.
EDIT: Bessere Möglichkeit
Die einzige Möglichkeit, die mir bekannt ist, um illegal-access=permit in der jar-Datei selber zu setzen, ist es einen zweiten Prozess zu starten, mit dem richtigen Parameter. z.B.:
if (System.getProperty("java.version").startsWith("16.")) {
if (!System.getenv().containsKey("_JAVA_OPTIONS")) {
List<String> cmd = new ArrayList<>();
cmd.add("java");
cmd.add("-cp");
cmd.add(System.getProperty("java.class.path"));
cmd.add(Application.class.getName());
cmd.addAll(Arrays.asList(params));
ProcessBuilder pb = new ProcessBuilder(cmd);
pb.inheritIO();
pb.environment().put("_JAVA_OPTIONS", "--illegal-access=permit");
pb.start().waitFor();
return;
}
}
(Wichtig ist die Nutzung der _JAVA_OPTIONS-Enviromnent-Variable statt direkt den Parameter zu übergeben, um überprüfen zu können, ob illegal-access=permit gesetzt ist, und nicht in einer endlosen Schleife zu landen.)
Ich habe vielleicht doch eine bessere Möglichkeit gefunden. In den Release Notes zu Java 17 steht folgendes:
With this change, the java launcher option --illegal-access is obsolete. If used on the command line it causes a warning message to be issued, and otherwise has no effect. Existing code that must use internal classes, methods, or fields of the JDK can still be made to work by using the --add-opens launcher option, or the Add-Opens JAR-file manifest attribute, to open specific packages.
Ab Java 17 gibt es also den --illegal-access Parameter nicht mehr, aber es ist wohl (auch in Java 16) möglich das Add-Opens-Attribute in der Manifest der Jar-Datei zu benutzen, um die illegal-access-Probleme zu umgehen. Es wäre also möglich in der Jar-Datei selber dieses Attribute zu setzen.
Funktionierender Add-Opens-Parameter: --add-opens java.base/java.util=ALL-UNNAMED
Ungetestetes Manifest-Attribute: Add-Opens: java.base/java.util=ALL-UNNAMED
das mit dem Manifest ist ein guter Hinweis, danke :)
Beim Starten eines Spiels zwischen dem Beispiel-Computerspielers und einem Menschen passiert nichts, außer dass "Das Spiel startet... Bitte verbinde manuell gestartete Clients auf localhost:13050" angezeigt wird.
Java:
System:
Logs: