Java API在单独的JAR文件中

Spi*_*hes 4 java api plugins minecraft bukkit

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

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

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

我对创建自己的API一般都很陌生,因此非常感谢完全解释的响应.谢谢!

Fre*_*ing 5

评论

请允许我重新提出你的问题.你有一个插件 - 特别 - 由于某种原因而限制/限制其分发.相反,您希望提供公开可用的API - SpecialApi - 以允许其他开发人员合并和/或使用Special提供的功能.

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

在此输入图像描述

鉴于你在评论中提到了子模块,让我先谈谈为什么它们可能不是一个好的解决方案.子模块的一个常见用途是根据某些标准创建代码隔离.例如,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; 通常被称为胖JAR.否则,您必须将API作为插件单独加载,或者作为服务器类路径上的附加条目加载.最后两个选项只是讨论版本和配置管理问题.

相反,您使用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>
Run Code Online (Sandbox Code Playgroud)

对于比这更复杂的东西,你会想要看看maven-shade-plugin.