我有一个我在Java应用程序中使用的库 - 它对于某些功能很重要,但它是可选的。这意味着如果JAR文件不存在,程序将继续运行而不会出现问题。我想开源我的程序,但我不能包含这个库,这是编译源代码所必需的,因为我有许多import语句来使用API。我不想维护两个代码集。从开源版本中删除物理jar文件的最佳方法是什么,但是仍然维护代码以支持其他人仍然可以编译的文件?
答案 0 :(得分:3)
采用的典型方法是定义包装器API(即接口)并在开源代码中包含这些接口,然后提供配置选项,其中可以指定实现某些接口的类的类名。
您将导入API接口,而不是直接将类导入到开源代码中。这样,您就是开源API而不是您不想开源的部分的实现,或者您无法开源。
有许多示例,但请看一下初学者的JDBC API(接口)和JDBC驱动程序(实现类)。
答案 1 :(得分:3)
我几乎和smallworld打了一个相同的东西。如果需要此API,您可以使用Maven等项目构建工具来处理项目的依赖项。如果有人使用pom从源代码控制中检出它们,他们可以为自己下载依赖项,而不必将它们包含在源代码库中。
答案 2 :(得分:3)
可能有很多方法可以解决这个问题,这是我能想到的一对:
如果您只需要在第三方库中调用几种方法,则可以使用反射来调用这些方法。它创建了非常冗长的代码,但很难阅读。
如果您在使用的第三方库中没有太多的API,您还可以创建一个单独的JAR文件,其中只包含库中类的非功能性shell(只是具有相同名称和具有相同签名的方法的类型)。然后,您可以使用此JAR进行分发和编译。在运行时,如果可用,您可以用真正的JAR替换它。
最常见的方法可能是在单独的模块/项目中为依赖于第三方库的代码创建包装器API,并可能分发预构建的JAR。这可能违背了您不希望维护两个代码集的愿望,但从长远来看可能是最好的,也不那么痛苦的解决方案。