【问题标题】:Share an Interface共享接口
【发布时间】:2011-12-01 15:16:00
【问题描述】:

我正在编写一个将加载第三方“驱动程序”的 Java 应用程序。我打算开发一个接口来定义“驱动程序”为了在应用程序中工作而必须实现的所需方法。

目的是将“驱动程序”包含在 jar 文件中。然后将需要第三方“驱动程序”开发人员来实现该接口。

当我试图弄清楚这一点时,我将“驱动程序”代码移到了一个 jar 中,发现我遇到了问题,因为我在主应用程序和 jar 文件中都定义了接口。

有没有推荐的方法来实现这种方法,还是我走错了路?

j

【问题讨论】:

    标签: java interface jar driver


    【解决方案1】:

    你基本上定义了一次接口,例如在一个 API 罐子里。然后主应用程序和驱动程序都会使用这个 jar。

    然后,驱动程序库会将这个 API jar 作为主应用程序提供的依赖项。

    就 Maven 而言,依赖项将具有库的范围 providedcompile

    请注意,您应该避免在不同的库中使用相同的类两次,因为这很可能会导致类加载问题、类强制转换异常等(除非有一些类加载器的作用域可以隔离应用程序,就像大多数应用程序服务器一样)。

    【讨论】:

    • +1 这是正确的答案。这种设计的一个出色且众所周知的例子是servlet-api.jar,它随每个Tomcat 副本一起提供。
    【解决方案2】:

    由于接口是您提供的 API/库的一部分,因此您应该在那里拥有接口,并且第三方应该导入您的 API(从您的 jar 中)并实现适当的接口,例如 Java API 如何提供SQL 接口,但不是实际的实现,MySQL 实现了 Java API 接口。如果您的驱动程序接口在您的应用程序之外使用,您可以将其打包为一个单独的 jar,但如果它真的只用于与您的库交互,它应该与库的其余部分一起打包。

    【讨论】:

    • 接口定义了主应用程序如何与驱动程序对话。我在想我可以动态地将驱动程序“添加”到应用程序中,并且由于接口定义,应用程序将能够与驱动程序进行交互。
    • 拥有几个都包含该接口的驱动程序 jar 怎么样?在这种情况下,您将拥有该界面的多个副本,这很可能会导致问题。
    • 这正是我发现的。
    • @Thomas 为什么不同的 API 会实现不属于 Java API 的完全相同的接口?它们至少应该在不同的包中。如果他们真的想将驱动程序打包成单独的 jar,那么他们应该有一个“通用”的 jar。
    • 以及来自第三方的实现 API 接口的库应该使用 API jar 中的接口。
    【解决方案3】:

    如果您确实移动了界面,则需要重新构建两个 jar。如果你已经复制了它,那么你需要给一个不同的包名称

    【讨论】:

    • 如果您有两个具有不同包名称的接口,它们将是不同的类,当您尝试将实现接口 A 的驱动程序强制转换为主应用程序中的接口 B 时,您会得到 ClassCastExceptions .
    • @Thomas Hmmm,不要以为你很欣赏我的评论。
    • @DaveRIz 它并没有真正回答如何处理应用程序和驱动程序都需要使用的通用接口的问题。这与重建 jar 或创建两个不同的接口无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 2016-03-15
    • 1970-01-01
    • 2018-12-20
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多