Hello,
I am trying to instantiate a RobocodeEngine in a project in Java, but an error occurs:
/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java -javaagent:/home/jfernandez/.local/share/JetBrains/Toolbox/apps/IDEA-C/ch-0/211.6693.111/lib/idea_rt.jar=38731:/home/jfernandez/.local/share/JetBrains/Toolbox/apps/IDEA-C/ch-0/211.6693.111/bin -Dfile.encoding=UTF-8 -classpath /usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/charsets.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/cldrdata.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/dnsns.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/icedtea-sound.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/jaccess.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/java-atk-wrapper.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/localedata.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/nashorn.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/zipfs.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/jce.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/jfr.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/jsse.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/management-agent.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/resources.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/rt.jar:/home/jfernandez/Downloads/IA/upm/tfm/poc_create_battle/target/classes:/home/jfernandez/.m2/repository/net/sf/robocode/robocode.core/1.9.4.8/robocode.core-1.9.4.8.jar:/home/jfernandez/.m2/repository/org/picocontainer/picocontainer/2.15/picocontainer-2.15.jar:/home/jfernandez/.m2/repository/net/sf/robocode/robocode.api/1.9.4.8/robocode.api-1.9.4.8.jar RunBattle -Djava.security.manager=allow
Loaded net.sf.robocode.api
Loaded net.sf.robocode.core
org.picocontainer.injectors.AbstractInjector$UnsatisfiableDependenciesException: net.sf.robocode.core.RobocodeMain has unsatisfied dependency 'interface net.sf.robocode.recording.IRecordManager' for constructor 'public net.sf.robocode.core.RobocodeMain(net.sf.robocode.settings.ISettingsManager,net.sf.robocode.host.IHostManager,net.sf.robocode.battle.IBattleManager,net.sf.robocode.recording.IRecordManager,net.sf.robocode.version.IVersionManager)' from org.picocontainer.DefaultPicoContainer@1134affc:3<|
at org.picocontainer.injectors.ConstructorInjector.getGreediestSatisfiableConstructor(ConstructorInjector.java:191)
at org.picocontainer.injectors.ConstructorInjector.getGreediestSatisfiableConstructor(ConstructorInjector.java:110)
at org.picocontainer.injectors.ConstructorInjector.access$100(ConstructorInjector.java:51)
at org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:331)
at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:270)
at org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:364)
at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.getComponentInstance(AbstractInjectionFactory.java:56)
at org.picocontainer.behaviors.AbstractBehavior.getComponentInstance(AbstractBehavior.java:64)
at org.picocontainer.behaviors.Stored.getComponentInstance(Stored.java:91)
at org.picocontainer.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:699)
at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:647)
at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:621)
at org.picocontainer.classname.DefaultClassLoadingPicoContainer.getComponent(DefaultClassLoadingPicoContainer.java:181)
at org.picocontainer.containers.AbstractDelegatingPicoContainer.getComponent(AbstractDelegatingPicoContainer.java:50)
at net.sf.robocode.core.Container.getComponent(Container.java:245)
at net.sf.robocode.core.RobocodeMainBase.initContainerForRobocodeEngine(RobocodeMainBase.java:88)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at net.sf.robocode.security.HiddenAccess.initContainerForRobotEngine(HiddenAccess.java:253)
at robocode.control.RobocodeEngine.init(RobocodeEngine.java:138)
at robocode.control.RobocodeEngine.<init>(RobocodeEngine.java:72)
at RunBattle.main(RunBattle.java:7)</init>
org.picocontainer.injectors.AbstractInjector$UnsatisfiableDependenciesException: net.sf.robocode.core.RobocodeMain has unsatisfied dependency 'interface net.sf.robocode.recording.IRecordManager' for constructor 'public net.sf.robocode.core.RobocodeMain(net.sf.robocode.settings.ISettingsManager,net.sf.robocode.host.IHostManager,net.sf.robocode.battle.IBattleManager,net.sf.robocode.recording.IRecordManager,net.sf.robocode.version.IVersionManager)' from org.picocontainer.DefaultPicoContainer@1134affc:3<|
at org.picocontainer.injectors.ConstructorInjector.getGreediestSatisfiableConstructor(ConstructorInjector.java:191)
at org.picocontainer.injectors.ConstructorInjector.getGreediestSatisfiableConstructor(ConstructorInjector.java:110)
at org.picocontainer.injectors.ConstructorInjector.access$100(ConstructorInjector.java:51)
at org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:331)
at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:270)
at org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:364)
at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.getComponentInstance(AbstractInjectionFactory.java:56)
at org.picocontainer.behaviors.AbstractBehavior.getComponentInstance(AbstractBehavior.java:64)
at org.picocontainer.behaviors.Stored.getComponentInstance(Stored.java:91)
at org.picocontainer.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:699)
at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:647)
at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:621)
at org.picocontainer.classname.DefaultClassLoadingPicoContainer.getComponent(DefaultClassLoadingPicoContainer.java:181)
at org.picocontainer.containers.AbstractDelegatingPicoContainer.getComponent(AbstractDelegatingPicoContainer.java:50)
at net.sf.robocode.core.Container.getComponent(Container.java:245)
at net.sf.robocode.core.RobocodeMainBase.initContainerForRobocodeEngine(RobocodeMainBase.java:88)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at net.sf.robocode.security.HiddenAccess.initContainerForRobotEngine(HiddenAccess.java:253)
at robocode.control.RobocodeEngine.init(RobocodeEngine.java:138)
at robocode.control.RobocodeEngine.<init>(RobocodeEngine.java:72)
at RunBattle.main(RunBattle.java:7)</init>
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at net.sf.robocode.security.HiddenAccess.initContainerForRobotEngine(HiddenAccess.java:253)
at robocode.control.RobocodeEngine.init(RobocodeEngine.java:138)
at robocode.control.RobocodeEngine.<init>(RobocodeEngine.java:72)
at RunBattle.main(RunBattle.java:7)
Caused by: org.picocontainer.injectors.AbstractInjector$UnsatisfiableDependenciesException: net.sf.robocode.core.RobocodeMain has unsatisfied dependency 'interface net.sf.robocode.recording.IRecordManager' for constructor 'public net.sf.robocode.core.RobocodeMain(net.sf.robocode.settings.ISettingsManager,net.sf.robocode.host.IHostManager,net.sf.robocode.battle.IBattleManager,net.sf.robocode.recording.IRecordManager,net.sf.robocode.version.IVersionManager)' from org.picocontainer.DefaultPicoContainer@1134affc:3<|
at org.picocontainer.injectors.ConstructorInjector.getGreediestSatisfiableConstructor(ConstructorInjector.java:191)
at org.picocontainer.injectors.ConstructorInjector.getGreediestSatisfiableConstructor(ConstructorInjector.java:110)
at org.picocontainer.injectors.ConstructorInjector.access$100(ConstructorInjector.java:51)
at org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:331)
at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:270)
at org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:364)
at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.getComponentInstance(AbstractInjectionFactory.java:56)
at org.picocontainer.behaviors.AbstractBehavior.getComponentInstance(AbstractBehavior.java:64)
at org.picocontainer.behaviors.Stored.getComponentInstance(Stored.java:91)
at org.picocontainer.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:699)
at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:647)
at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:621)
at org.picocontainer.classname.DefaultClassLoadingPicoContainer.getComponent(DefaultClassLoadingPicoContainer.java:181)
at org.picocontainer.containers.AbstractDelegatingPicoContainer.getComponent(AbstractDelegatingPicoContainer.java:50)
at net.sf.robocode.core.Container.getComponent(Container.java:245)
at net.sf.robocode.core.RobocodeMainBase.initContainerForRobocodeEngine(RobocodeMainBase.java:88)
... 8 more</init>
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at net.sf.robocode.security.HiddenAccess.initContainerForRobotEngine(HiddenAccess.java:253)
at robocode.control.RobocodeEngine.init(RobocodeEngine.java:138)
at robocode.control.RobocodeEngine.<init>(RobocodeEngine.java:72)
at RunBattle.main(RunBattle.java:7)
Caused by: org.picocontainer.injectors.AbstractInjector$UnsatisfiableDependenciesException: net.sf.robocode.core.RobocodeMain has unsatisfied dependency 'interface net.sf.robocode.recording.IRecordManager' for constructor 'public net.sf.robocode.core.RobocodeMain(net.sf.robocode.settings.ISettingsManager,net.sf.robocode.host.IHostManager,net.sf.robocode.battle.IBattleManager,net.sf.robocode.recording.IRecordManager,net.sf.robocode.version.IVersionManager)' from org.picocontainer.DefaultPicoContainer@1134affc:3<|
at org.picocontainer.injectors.ConstructorInjector.getGreediestSatisfiableConstructor(ConstructorInjector.java:191)
at org.picocontainer.injectors.ConstructorInjector.getGreediestSatisfiableConstructor(ConstructorInjector.java:110)
at org.picocontainer.injectors.ConstructorInjector.access$100(ConstructorInjector.java:51)
at org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:331)
at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:270)
at org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:364)
at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.getComponentInstance(AbstractInjectionFactory.java:56)
at org.picocontainer.behaviors.AbstractBehavior.getComponentInstance(AbstractBehavior.java:64)
at org.picocontainer.behaviors.Stored.getComponentInstance(Stored.java:91)
at org.picocontainer.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:699)
at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:647)
at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:621)
at org.picocontainer.classname.DefaultClassLoadingPicoContainer.getComponent(DefaultClassLoadingPicoContainer.java:181)
at org.picocontainer.containers.AbstractDelegatingPicoContainer.getComponent(AbstractDelegatingPicoContainer.java:50)
at net.sf.robocode.core.Container.getComponent(Container.java:245)
at net.sf.robocode.core.RobocodeMainBase.initContainerForRobocodeEngine(RobocodeMainBase.java:88)
... 8 more</init>
The way that I instantiate this object is:
RobocodeEngine robocodeEngine=new RobocodeEngine(new File("/home/jfernandez/robocode"));
where file is the path where robocode is installed in my computer.
I am running executing java 8 using operating system Ubuntu 20.04.5 LTS, the IDE that I am using is IntelliJ and robocode version is 1.9.4.8 (the latest available in Maven). Can you help me?
Thank you very much!!
Anonymous
I don't know why it is not working for you, and I can't tell just by looking at the stack trace, even though you did right by including it in this support request. 👍
Instead, I tried this myself on my Ubuntu 22.04.1 LTS running with OpenJDK 11.0.17.
I recommend that you use a newer version of Java than 8, which is really old.
I just took the code from the Example section of this javadoc page:
https://robocode.sourceforge.io/docs/robocode/robocode/control/package-summary.html
I created a folder (test) where I copied all required jar files for robocode into this test folder.
Then I created the BattleRunner.java with the code from the example.
I then changed the line with:
new java.io.File("C:/Robocode")
Into:
new java.io.File("/home/fnl/robocode")
But you'll need to change it to your specific directory contaning Robocode on your system, of course.
I then compile and run the Battle runner like this:
java -cp robocode.jar BattleRunner.java
This works as a charm on my system.
I included a zip archive with all the files I used from Robocode version 1.9.4.8.
Last edit: Flemming N. Larsen 2023-02-10
Also notice, that I changed my robocode.sh file in my robocode folder, as I used Java 11, i.e. a Java version below version 12:
I have detected the problem that I had with the project, so I write here the solution in case it helps someone in the future with the same problem. I had only included in pom.xml the dependencies robocode.core and robocode.api, assuming that this was enough. However, thanks the note in javadoc https://robocode.sourceforge.io/docs/robocode/robocode/control/package-summary.html I realized that I possibly needed to include more dependencies:
"In order to avoid ClassNotFoundException with your application, you will need to add most of the .jar files located under the /libs folder of the robocode directory to the classpath of your application. That is robocode.jar, picocontainer-xxx.jar etc. You can leave out roborumble.jar and the ones for UI and sound if you don't use the UI with the RobocodeEngine."
I have included the dependency robocode.battle and this have solved my problem. I don't know if in the future and I will need to include more dependencies, but for now that is enough.
Thank you very much for your quick response Flemming.
All the best
You are welcome.
Is there anything I can do in order to make sure people includes all most/all the libraries from the robocode/libs folder, when they use the RobocodeEngine? If so, I will update the documentation where is will help people.