Bonjour, j'essaie d'utilisé l'API Java de l'application codingame j'ai lut l'introduction et la page Create a solo game qui fournit un github d'un projet d'exemple game-fishy-adventures que j'ai cloné et ouvert dans mon IDE (IntelliJ IDEA Community Edition 2021.1.3) en tant que projet déjà existant sur le model Maven.
La page de documentation indique que le projet d'exemple et un projet minimal mais déjà fonctionnel et que pour démarré le projet il faut run la class situé à ./src/test/java/Main.java que cette class et censé ouvrir un serveur local sur le port 8888 (port qui et libre sur ma machine)
et servir une réponse en text/html à la racine soit http://localhost:8888 quand je build le fichier ./src/test/java/Main.java je n'est aucune erreur levé par la phase de build mais quand je veut run la class ./src/test/java/Main.java j'ai immédiatement une exception levé avec une call stack assez longue qui indique:
Exception in thread "Thread-0" java.lang.ExceptionInInitializerError
at com.google.inject.internal.cglib.reflect.$FastClassEmitter.<init>(FastClassEmitter.java:67)
at com.google.inject.internal.cglib.reflect.$FastClass$Generator.generateClass(FastClass.java:72)
at com.google.inject.internal.cglib.core.$DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at com.google.inject.internal.cglib.core.$AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at com.google.inject.internal.cglib.reflect.$FastClass$Generator.create(FastClass.java:64)
at com.google.inject.internal.BytecodeGen.newFastClass(BytecodeGen.java:204)
at com.google.inject.internal.ProviderMethod$FastClassProviderMethod.<init>(ProviderMethod.java:256)
at com.google.inject.internal.ProviderMethod.create(ProviderMethod.java:71)
at com.google.inject.internal.ProviderMethodsModule.createProviderMethod(ProviderMethodsModule.java:275)
at com.google.inject.internal.ProviderMethodsModule.getProviderMethods(ProviderMethodsModule.java:144)
at com.google.inject.internal.ProviderMethodsModule.configure(ProviderMethodsModule.java:123)
at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:340)
at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:349)
at com.google.inject.spi.Elements.getElements(Elements.java:110)
at com.google.inject.internal.InjectorShell$Builder.build(InjectorShell.java:138)
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:104)
at com.google.inject.Guice.createInjector(Guice.java:96)
at com.google.inject.Guice.createInjector(Guice.java:73)
at com.google.inject.Guice.createInjector(Guice.java:62)
at com.codingame.gameengine.core.RefereeMain.start(RefereeMain.java:44)
at com.codingame.gameengine.runner.RefereeAgent$1.run(RefereeAgent.java:68)
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @42eca56e
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:357)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
at com.google.inject.internal.cglib.core.$ReflectUtils$2.run(ReflectUtils.java:56)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
at com.google.inject.internal.cglib.core.$ReflectUtils.<clinit>(ReflectUtils.java:46)
... 21 more
Puis une poignée de secondes s'écoule avant que la pile d'erreur ne continue par:
java.lang.RuntimeException: Invalid Referee command:
at com.codingame.gameengine.runner.GameRunner.readCommand(GameRunner.java:310)
at com.codingame.gameengine.runner.GameRunner.readGameInfo(GameRunner.java:294)
at com.codingame.gameengine.runner.GameRunner.runAgents(GameRunner.java:132)
at com.codingame.gameengine.runner.GameRunner.runGame(GameRunner.java:429)
at com.codingame.gameengine.runner.GameRunner.start(GameRunner.java:383)
at com.codingame.gameengine.runner.SoloGameRunner.start(SoloGameRunner.java:18)
at com.codingame.gameengine.runner.GameRunner.start(GameRunner.java:371)
at com.codingame.gameengine.runner.SoloGameRunner.start(SoloGameRunner.java:18)
at Main.main(Main.java:14)
Puis des logs indiquant que le serveur et ouvert:
http://localhost:8888/test.html
Exposed web server dir: C:\web\game-fishy-adventures\src\main\resources\view
Exposed web server dir: C:\Users\{username}\AppData\Local\Temp\codingame
Le fichier ./src/test/Main.java et constitué ainsi:
import com.codingame.gameengine.runner.SoloGameRunner;
import com.codingame.gameengine.runner.dto.GameResult;
public class Main {
public static void main(String[] args) {
SoloGameRunner gameRunner = new SoloGameRunner();
// Sets the player
gameRunner.setAgent(Solution.class);
// Sets a test case
gameRunner.setTestCase("test1.json");
gameRunner.start();
}
}
L'erreur provient de l'appel à la méthode start qui ouvre le server car si j'enlève l'appel à la méthode start et que je re build/execute le fichier je n'ai plus d'erreur (et plus accès à l'API non plus d'ailleurs ).
A noté que j'ai déjà tapé le message d'erreur le plus haut de la pile d'appel dans google j'ai trouvé un ticket sur le github de Google Guice
mais je ne l'ai pas bien compris le messages et l'erreur n'est pas exactement la même et je crois que les réponse indiquent des solutions de contournement. Mais dans mon cas le code et situé dans le package je ne peut pas vraiment le modifié..
A noté que une fois que le serveur et ouvert j'ai bien le contenu distribué mais que j'ai quand même des logs d'erreur dans le contenue HTML renvoyé par le serveur.
Si quelqu'un à une idée pour solutionné ce problème où connait déjà l'API Java de codingame et reconnait cette erreur ce serait sympa
[EDIT]:
Le problème venait que je n'utilisais pas la bonne version de java il fallait utilisé Java 1.8 pour cet API (indiqué nul part dans la doc). Peut-être que c'est évidant pour un développeur plus confirmé avec l'environnement de Java, mais pour un javaien néophite, c'est moins automatique, cela aurait été sympa de l'écrire directement dans le overview de la doc, en plus le message d'erreur et clairement pas explicite puisque c'est des dépendances qui plante à l'exécution du code et n'indique pas de problème de version.
- Edité par SamuelGaborieau3 23 juillet 2021 à 11:15:15
J'ai exactement le même problème, mais même en passant sur java 1.8, rien ne se passe et le problème persiste... tu n'aurais pas d'autres pistes à me suggérer ?
[Maven] [Codingame API] [Google Guice]
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
suggestion de présentation.