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。
我正在制作一个带有 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。