1

我的项目根目录中有编程游戏“Robocode”,因此我可以在任何地方运行该项目,而无需将其安装在 C:/robocode 中。我有一个带有以下选项的运行配置;

  • 主类: robocode.Robocode
  • 虚拟机选项: -Xmx512M -Dsun.io.useCanonCaches=false -Ddebug=true -DNOSECURITY=true -cp libs/robocode.jar
  • 工作目录: MY_ROOT\robocode_master
  • JRE:默认(9.0.1 - 我的主模块的 SDK)

我正在为连接到 MongoDBAtlas 集群以获取必要数据的 AdvancedRobot 编写一些自定义功能。我正在使用 mongo-java-driver-3.6.1。.jar 已作为库添加到 IntelliJ,然后作为对主模块的编译依赖项。它在测试中运行良好,我可以下载文档等。

为了说明,这些库显示在“项目结构”窗格中。

项目结构

我已将编译输出路径设置为robocode_master/robots目录,这样当我从 IntelliJ 运行 Robocode 时,它​​会在正确的目录中看到自定义机器人 .class 文件,并允许我将它们添加到战斗中。

问题是当我开始战斗并且机器人试图做它需要做的事情时,它会抛出一个java.io.FileNotFoundException并试图从robocode_master/robots目录中找到必要的库文件。

例如,它做的第一件事就是连接数据库;

java.io.FileNotFoundException: MY_ROOT\robocode_master\robots\com\mongodb\MongoClient.class (The system cannot find the path specified)

当我将项目输出路径设置为 robots 文件夹时,在启动 Robocode 时,它​​会抛出一堆 FileNotFoundExceptions。但是,如果我将选项切换到“继承项目编译输出路径”,然后启动 Robocode,我不会在启动时遇到异常。但是现在当然,我的机器人不在默认目录中,所以它看不到它们。因此,我将out/production/...中的新路径添加到 GUI 中的 Robocode 并重新启动,然后我从机器人那里得到相同的异常。它现在尝试在out/production/.../com/mongodb/MongoClient.class中查找文件

如何“告诉”Robocode 在类路径的默认位置查找库?

4

1 回答 1

0

Robocode 将在您的 /robots 文件夹中查找机器人类。如果您的机器人位于其他地方,您需要通过使用Developments Options设置来告诉 Robocode 从 Robocode UI 中找到它们的位置。Robocode 有它自己的类加载器来加载机器人类——但只有机器人类。

其他类/库必须在 Robocode 的普通类路径上使用 java 命令(VM 选项)的 -cp 或 -classpath 指定,就像对任何其他 Java 应用程序所做的那样。

另请注意,您应该使用 Robocode 附带的 VM 选项 - 就像 robocode.bat 文件中指定的选项一样。特别是当您使用 Java 9 或更新版本时:

java -Xmx512M -cp libs/robocode.jar -XX:+IgnoreUnrecognizedVMOptions "--add-opens=java.base/sun.net.www.protocol.jar=ALL-UNNAMED" "--add-opens=java.base/java.lang.reflect=ALL-UNNAMED" "--add-opens=java.desktop/sun.awt=ALL-UNNAMED" robocode.Robocode %*

您可以将其复制到“run_my_stuff.bat”中,然后在 libs/robocode.jar 之后将内容添加到 -cp。

但是,我不确定它是否适用于 Mongo 驱动程序。Robocode 是为简单的机器人构建的,这些机器人对 CPU 周期、文件访问等资源的访问权限有限。

于 2018-03-24T20:56:43.087 回答