4

I have a library that I'm using in an Java application - it's important for certain functionality, but it's optional. Meaning that if the JAR file is not there, the program continues on without issue. I'd like to open source my program, but I can not include this library, which is necessary to compile the source code as I have numerous import statements to use the API. I don't want to maintain two code sets. What is the best way to remove the physical jar file from open source release, but still maintain the code to support it where other people could still compile it?

4

3 回答 3

3

可能有很多方法可以解决这个问题,这里有几个我能想到的:

  • 如果您只需要在 3rd 方库中调用几个方法,则可以使用反射来调用这些方法。它创建了非常冗长的代码,虽然很难阅读。

  • 如果您在使用的 3rd 方库中没有太多 API,您还可以创建一个单独的 JAR 文件,其中仅包含库中类的非功能外壳(仅具有相同名称和方法的类型签名相同)。然后,您可以使用此 JAR 进行分发和编译。在运行时,如果可用,您将用真正的 JAR 替换它。

  • 最常见的方法可能是在单独的模块/项目中为依赖于第 3 方库的代码创建一个包装 API,并可能分发一个预构建的 JAR。这可能与您不维护两个代码集的愿望背道而驰,但从长远来看,这可能被证明是最好的、痛苦更少的解决方案。

于 2013-05-29T20:31:13.043 回答
3

采用的典型方法是定义包装API(即接口)并将这些接口包含在开源代码中,然后提供配置选项,其中可以指定实现某些接口的类的类名。

您将导入 API 接口,而不是将类直接导入您的开源代码。这样,您将开源 API,而不是您不想开源或无法开源的部分的实现。

有很多示例,但请先看看 JDBC API(接口)和 JDBC 驱动程序(实现类)。

于 2013-05-29T20:18:49.587 回答
3

我几乎输入了与 smallworld 相同的内容,但添加了一个内容。如果需要此 API,您可以使用 Maven 之类的项目构建工具来处理项目的依赖关系。如果有人使用 pom 从源代码控制中检查它,他们可以自己下载依赖项,而您不必将它们包含在源代码库中。

于 2013-05-29T20:24:48.647 回答