Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-使库和导入成为可选的_Java_Jar_Import_Code Organization - Fatal编程技术网

Java-使库和导入成为可选的

Java-使库和导入成为可选的,java,jar,import,code-organization,Java,Jar,Import,Code Organization,我在Java应用程序中使用了一个库——它对于某些功能很重要,但它是可选的。这意味着,如果JAR文件不在那里,程序将继续运行而不会出现问题。我想打开我的程序的源代码,但我不能包括这个库,这是编译源代码所必需的,因为我有许多导入语句来使用API。我不想维护两个代码集。从开源版本中删除物理jar文件的最佳方法是什么,但仍然维护代码以支持其他人仍然可以编译它?所采取的典型方法是定义包装器API(即接口),并在开源代码中包含这些接口,然后提供配置选项,其中可以指定实现某些接口的类的类名 您将导入API接口

我在Java应用程序中使用了一个库——它对于某些功能很重要,但它是可选的。这意味着,如果JAR文件不在那里,程序将继续运行而不会出现问题。我想打开我的程序的源代码,但我不能包括这个库,这是编译源代码所必需的,因为我有许多导入语句来使用API。我不想维护两个代码集。从开源版本中删除物理jar文件的最佳方法是什么,但仍然维护代码以支持其他人仍然可以编译它?

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

您将导入API接口,而不是将类直接导入到开源代码中。通过这种方式,您可以对API进行开源,而不是对不想开源或无法开源的部分进行实现


这里有很多示例,但首先请看一下JDBCAPI(接口)和JDBC驱动程序(实现类)。

我键入的内容与smallworld差不多,只是添加了一个。如果需要这个API,您可以使用像Maven这样的项目构建工具来处理对项目的依赖关系。如果有人使用pom从源代码管理中检查它,他们可以自己下载依赖项,而您不必将它们包含在源代码回购中。

可能有多种方法可以解决此问题,我可以想到以下几点:

  • 如果在第三方库中只有几个方法需要调用,那么可以使用反射来调用这些方法。它创建了非常冗长的代码,但很难阅读

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

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


我发现这个示例有助于实现接口。