独立JAR文件中的Java API

独立JAR文件中的Java API,java,api,plugins,minecraft,bukkit,Java,Api,Plugins,Minecraft,Bukkit,我正在制作一个带有API的插口minecraft插件,以允许其他开发人员使用它。如何在一个单独的JAR文件中创建API,该文件的功能与插件本身相同 我之所以需要它,是因为插件不会公开发布,但我需要允许访问其中的某些方法/类/对象 期望的结果:Plugin.jar正在服务器上运行。我将Plugin-API.jar放在Maven存储库中,供其他开发人员使用,这将允许与Plugin.jar进行交互 一般来说,我对创建自己的API还比较陌生,因此,如果您能给出详细解释,我将不胜感激。谢谢 回顾 请允许我

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

我之所以需要它,是因为插件不会公开发布,但我需要允许访问其中的某些方法/类/对象

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


一般来说,我对创建自己的API还比较陌生,因此,如果您能给出详细解释,我将不胜感激。谢谢

回顾

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

这是各种插件(例如Vault、Citizens2、, 允许性行为等),尽管原因与你的不同。结构 其关系如下图所示

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

回答

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

SpecialApi项目

我们不应掉以轻心。如果你想到一个新的方法,这可能更有意义 API作为您和开发人员之间的合同,保证 功能。简言之,请记住以下几点:

  • 一旦发布,API就是一种承诺
  • 永远不要从API中删除功能
  • 您始终可以向API添加功能
  • 您可以将底层代码更改为您心中的内容,前提是 继续实现API
您的API项目将定义所需的类、接口和数据结构 与你的插件接口。不要错误地将API设置为 插件本身。您当然可以使用SpigotAPI类和接口,甚至可以 定义插件类的要点;然而,它永远不应该是这样 用龙头装的。它只是一个JAR,将被引用为提供的
依赖于他人,但也作为实际插件的一部分部署

如何提供API JAR取决于您。如果你在飞机上有空余空间 公共web服务器,您可以手动创建一个小型存储库,而无需 考虑使用Nexus、AtgPrimes等服务< < /P> 特殊插件项目

插件项目包含所有其他内容。您可以自由添加、更改、, 纠正或移除内部组件,前提是不会影响API。 它是一个普通的插件,除了它的资源之外, 类和通常提供的数据,它还包括用于API的相同内容; 通常被称为胖罐子。 否则,您将不得不将API作为插件或应用程序单独加载 服务器类路径上的其他条目。最后两个选项只要求版本和 配置管理问题

相反,您可以使用或类似的工具 在同一个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>


.

如果服务器正在运行Plugin.jar,您可以在其类中创建公共方法,并允许开发人员使用它们,并将它们导入到他们的项目中。因此,您可以在Plugin.jar中使用方法
apiMethod()
创建一个
PluginAPI
类,它将作为一个API工作(您说过人们无论如何都需要运行您的插件)。问题是开发人员将无法访问主Plugin.jar,这就是为什么一个独立的PluginAPI JAR是必不可少的。但是Plugin.JAR将在服务器上运行吗?如果这是真的,那么他们已经可以访问主插件了。jar以ProtocolLib库为例,它在服务器内部运行,但是作为APII使用的是同一个jar,但不能使用与API相同的jar。jar是专有的,不会分发给开发人员,但我们需要一种让他们与之交互的方式。我见过它像我之前在问题中提到的那样,但我不记得在哪里。