Java API在单独的JAR文件中

时间:2017-03-01 04:38:53

标签: java api plugins minecraft bukkit

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

我需要这个,因为插件不会公开分发,但我需要允许访问其中的某些方法/类/对象。

期望的结果:Plugin.jar正在服务器上运行。我将Plugin-API.jar放在Maven存储库中,供其他开发人员使用,以便与plugin.jar进行交互。

我一般都是创建自己的API相当新的,因此非常感谢完全解释的响应。谢谢!

1 个答案:

答案 0 :(得分:5)

查看

请允许我重新提出你的问题。你有一个插件 - 特殊 - 其发行版 受到某种原因的限制/限制)。相反,你想提供一个 公开的API - SpecialApi - 允许其他开发人员合并 和/或使用特殊提供的功能。

这是各种插件使用的常用方法(例如Vault,Citizens2, PermissionsEx等),虽然原因不同于你的。结构 其关系在以下组件图中表示。

enter image description here

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

<强>答案

由于您的主要目的是通过API进行代码隔离,因此最简单,最容易 直接方法是创建两个单独的Maven项目 - 一个用于您的插件 和一个API。

SpecialApi项目

API不应掉以轻心。如果你想到一个,这可能会更有意义 API作为您和开发人员之间的合同,保证确定 功能。简而言之,请牢记这些要点:

  • 一旦发布,API就是一种承诺
  • 您永远不应从API中删除功能
  • 您始终可以向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