Java API 在单独的 JAR 文件中

Java API in separate JAR file

我正在制作一个带有 API 的 Spigot minecraft 插件,以允许其他开发人员连接到它。如何在单独的 JAR 文件中创建 API,使其功能与在插件本身中一样?

我需要这个,因为插件不会公开分发,但我需要允许访问某些 methods/classes/objects。

期望的结果:Plugin.jar 在服务器上是 运行。我有一个 Maven 存储库中的 Plugin-API.jar 供其他开发人员挂钩,这将允许与 plugin.jar 进行交互。

总的来说,我对创建自己的 API 还很陌生,因此非常感谢能提供完整解释的回复。谢谢!

回顾

请允许我重复一下你的问题。你有一个插件 - Special - 它的分布 是 limited/restricted 出于某种原因)。相反,您想提供一个 public仅可用 API - SpecialApi - 允许其他开发人员合并 and/or 使用 Special 提供的功能。

这是各种插件(例如 Vault、Citizens2、 PermissionsEx 等),尽管出于与您不同的原因。结构性 其关系在以下组件图中表示。

鉴于您在评论中提到了子模块,让我离题一会儿 为什么它们可能不是一个好的解决方案。子模块的一个常见用途是创建一个 基于某些标准的代码分离。例如,一个 Web 应用程序可能会被拆分 在功能上为其 GUI、业务逻辑、数据持久性等模块; 而“大数据”服务可能有多个模块分离库 各种技术。就插件而言,模块的一个很好的例子是 PermissionsEx, 它被拆分以支持不同的目标环境。它有一个模块包含 通用代码;另一个模块将其核心包装为 Bukkit 插件;第三 将其核心包装为 Sponge 插件的模块。

回答

由于您的主要目的是通过 API 进行代码隔离,因此最简单也是最 直接的方法是创建两个独立的 Maven 项目——一个用于你的插件 还有一个给你的 API。

SpecialApi 项目

APIs 不应掉以轻心。如果你想到一个,这可能更有意义 API 作为您与开发者之间的合同,保证某些 功能。简而言之,请牢记以下几点:

  • 一旦发布,API 就是一种承诺
  • 您永远不应从 API
  • 中删除功能
  • 您可以随时向 API
  • 添加功能
  • 您可以根据自己的喜好更改底层代码,前提是 继续执行 API

您的 API 项目将定义 class 所需的元素、接口和数据结构 与您的插件交互。不要错误地将 API 设为 插件本身。你当然可以使用 SpigotAPI classes 和接口,甚至 定义插件的要点class;然而,它不应该是 由 Spigot 加载。它只是一个 JAR,将被引用为 provided 被其他人依赖,但也作为您实际插件的一部分部署。

如何提供 API JAR 由您决定。如果你有一些备用 space public 网络服务器,您可以手动创建一个小型存储库而无需 考虑使用 Nexus、Artifactory 等服务

特殊插件项目

插件项目包含所有其他内容。您可以自由添加、更改、 更正或删除内部组件,前提是它不影响 API。 它是一个常规的普通插件,除了它的资源之外, classes,以及正常提供的数据,它也包括您的 API; 通常称为 fat JAR。 否则,您将不得不单独加载 API 作为插件或 服务器 class 路径上的附加条目。最后两个选项只是求版本和 配置管理问题。

相反,您使用 maven-assembly-plugin 或类似工具 在同一个 JAR 中提供插件和 API 代码。例如,此程序集配置会将范围为 compile 的任何项目依赖项组合到一个 JAR 中。

    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.4.1</version>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
        </configuration>
        <executions>
            <execution>
                <id>make-assembly</id>
                <phase>package</phase> 
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

对于任何比这更复杂的事情,您将需要研究 maven-shade-plugin