我正在制作一个带有API的Spigot minecraft插件,以允许其他开发人员加入它。如何在单独的JAR文件中创建API,其功能与插件本身相同?
我需要这个,因为插件不会公开分发,但我需要允许访问其中的某些方法/类/对象。
期望的结果:Plugin.jar正在服务器上运行。我将Plugin-API.jar放在Maven存储库中,供其他开发人员使用,以便与plugin.jar进行交互。
我一般都是创建自己的API相当新的,因此非常感谢完全解释的响应。谢谢!
答案 0 :(得分:5)
查看强>
请允许我重新提出你的问题。你有一个插件 - 特殊 - 其发行版 受到某种原因的限制/限制)。相反,你想提供一个 公开的API - SpecialApi - 允许其他开发人员合并 和/或使用特殊提供的功能。
这是各种插件使用的常用方法(例如Vault,Citizens2, PermissionsEx等),虽然原因不同于你的。结构 其关系在以下组件图中表示。
鉴于你在评论中提到了子模块,让我离题一下 为什么他们可能不是一个好的解决方案。子模块的一个常见用途是创建一个 基于某些标准的代码分离。例如,可以拆分Web应用程序 功能上用于GUI,业务逻辑,数据持久性等模块; 而“大数据”服务可能有多个模块隔离库 各种技术。关于插件的模块的一个很好的例子是PermissionsEx, 它被拆分以支持不同的目标环境。它有一个包含的模块 共同代码;另一个模块将其核心包装为Bukkit插件;第三 模块将其核心包装为Sponge插件。
<强>答案强>
由于您的主要目的是通过API进行代码隔离,因此最简单,最容易 直接方法是创建两个单独的Maven项目 - 一个用于您的插件 和一个API。
SpecialApi项目
API不应掉以轻心。如果你想到一个,这可能会更有意义 API作为您和开发人员之间的合同,保证确定 功能。简而言之,请牢记这些要点:
您的API项目将定义所需的类,接口和数据结构
与您的插件接口。不要错误地制作API
插件本身。您当然可以使用SpigotAPI类和接口,甚至可以使用
定义插件类的重点;但是,它永远不应该是
由Spigot装载。它只是一个JAR,将被引用为provided
其他人的依赖性,但也作为实际插件的一部分进行部署。
您如何提供API JAR取决于您。如果你有一些空余空间 公共Web服务器,您可以手动创建一个小型存储库而无需 考虑使用Nexus,Artifactory等服务
特殊插件项目
插件项目包含其他所有内容。您可以自由添加,更改, 正确或删除内部组件,前提是它不会影响API。 它是一个常规和正常的插件,除了它的资源, 通常提供的类和数据,它也包括相同的API; 通常被称为 fat JAR 。 否则,您必须单独将插件作为插件或插件加载 服务器类路径上的附加条目。这最后两个选项只是求助版本和 配置管理问题。
相反,您使用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。