0

我正在为 Java 实施一种在线编程竞赛。这个想法是比赛的参与者为应用程序编写一个控制器并将其发送到比赛服务器。该自定义控制器必须从 API 的基类派生。

好的,所以所有参与者都可以编写自己的控制器类,可能还包括其他自定义类,并且由于控制器的主类是从API的(抽象)基类派生的,服务器上的应用程序可以轻松调用子的特定方法类(即自定义控制器)以一定的间隔来控制应用程序。

我现在的问题是:您对我应该如何从 API 的角度处理这种情况有什么建议,以便它允许一种方便的方式来动态加载自定义控制器实现?

我要避免的是参与者需要将 API jar 文件包含到他们的 Java 项目中(例如在 Eclipse 中),然后编写他们的控制器类,再次将所有内容放入一个可执行的 jar 中,然后将其上传到比赛服务器。我绝对不想在服务器上执行完全自定义的应用程序。

我宁愿让参与者只上传他们的自定义控制器类。然后在服务器上这个类应该被自动加载并作为应用程序的一部分。我基本上在这里看到两个选项:

  1. 将编译好的.class文件上传到服务器;或者
  2. 上传Java源代码文件,然后在服务器上编译

您会建议这两个选项中的哪一个,为什么?
或者:你有其他更好的选择吗?

此外,我应该如何处理多个类的上传?如果可能的话,我希望允许参与者在主控制器类旁边编写额外的实用程序类。

提前感谢您的所有想法!

4

2 回答 2

1

Web 服务器、Eclipse 和其他平台使用的模式是通过指定其模式来指定部署描述符(通常是 XML 文件)。在您的情况下,部署描述符将识别 jar 文件的名称(通常与部署描述符在同一目录中)和 Java 类的完全限定名称(在本例中为自定义控制器)。

您编写一个读取部署描述符的程序,以发现 jar 文件的名称(您通过类加载器访问)和客户控制器的名称(您使用类加载器加载)。

这使您可以接收任意数量的条目,每个条目都包含在自己的目录中。

您甚至可以通过让部署描述符成为 jar 本身中具有明确名称的文件来获得幻想,从而使 jar 成为一个完全包含的条目。

于 2012-11-15T03:04:50.323 回答
1

首先,让开发人员在他们的 Eclipse 项目中包含 API jar 并不意味着您需要将其作为完整的应用程序运行。实际上,您应该将 API jar 提供给开发人员。但是,开发人员应该为您提供一个只包含他们自己开发的类的 JAR。

我建议不要采取“接收源代码并在服务器上编译”的方法。它只是使情况不必要地复杂化。

在您的服务器收到 JAR 后,您可以简单地创建相应的类加载器来加载它们的代码。

下一个问题是:你怎么知道从他们的 JAR 中加载哪个类?

有很多方法可以做到这一点,这里我建议两种最简单的方法:

1)与@ChrisGerken 建议的类似,有一个“部署描述符”。在简化视图中,部署描述符只是一个具有预定义格式的文本文件,位于预定义的位置。您的代码可以从提供的 JAR 中读取此文件,并且您可以要求开发人员将类名(其实现类的)放入描述符中,您可以通过反射轻松实例化他们的类。

2)另一种方法类似于 SLF4J 如何加载他们的适配器:开发人员应该在预定义的包中使用预定义的类名来实现他们的实现。您可以通过反射轻松创建实现类,并且省去了读取描述符文件的步骤。但是你失去了灵活性。

两种方式都应该有效。选择一个适合您需要的(我建议先选择 2,您可以稍后添加对 1 的支持)

于 2012-11-15T03:53:55.063 回答