我的问题与这篇文章有关:difference between jstl-api and jstl-impl
但是,就我而言,我正在处理一些项目合作伙伴提供给我们的软件。合作伙伴为我提供了他们的代码"它基本上由两个jar文件组成:Software.api-version1.jar
,
和Software.impl-version2.jar
。这两个档案都包含class
个文件。实现显然是混淆的,所以我不能真正看到发生了什么,但API包含许多记录的类。但是,这些似乎是接口/抽象类。
我的问题如下:
究竟什么是Java API?从C / C ++到我,术语API意味着一组带有方法声明的类。然后,实现包括这些方法的实现。由于在C ++代码中,代码通常在头文件( .h,包含定义)和源( .cpp,包含实现)之间分开,因此可以对头文件进行不同的实现。我从未见过相同功能的不同实现,但我想它可以完成。
相反,我不确定Java API是如何工作的。我怎样处理抽象类,我可以实例化?我必须在某处获得一个实现类的实例,但返回这样一个实例已经 实现的一部分不会吗?
答案 0 :(得分:1)
Java API没有什么特别之处可以区别于C ++ API或任何其他API。换句话说,如果您正在与Java开发人员进行对话,并且说“Java API"他们不会想到与你说的相同的东西(C ++ API"或者" REST API"。
您所看到的是打包类文件的惯例。当图书馆提供商将其实施分解为" API"和"实施" JAR,他们通常这样做是因为您将针对API JAR编译项目,而环境(例如服务器)将提供实现。通常,实现JAR应该包含" API JAR"包含 plus 实现,因此实现JAR实际上也提供了API!
大多数第三方库都在一个JAR中提供。我不确定为什么你的项目合作伙伴将它分成两部分。一些Java EE库这样做的原因是保持部署精益:您不需要实现,因为容器(例如Glassfish,TomcatEE)将提供它们。
理论上,您可以使用他们的API JAR进行编译。除非您模拟其实现,否则您将无法运行您的应用程序或测试。另外在理论上你可以忽略API JAR并使用实现JAR,除非API JAR实际上包含JAR没有实现的类,在这种情况下你的项目合作伙伴真的在做自己的事情。
无论如何,你绝对应该问你的项目合作伙伴他们为什么以这种方式打包文件,因为没有必要的Java必不可少。
答案 1 :(得分:0)
Java SPI 不一定是这种情况,而是一种将接口(API)与实现分离的标准java机制。
可能是他们使用Java Service Provider Interface或this来检测某个接口com.sioux.MyInterf
的实现类。
查看实现jar(Software.impl-version2.jar
)。如果在jar中找到文本文件META-INF/services/com.sioux.MyInterf
,则在该文件中列出一个(或多个)实现类。可能是顶级工厂类。
使用接口(API)的第一个实现:
MyIntf api = ServiceLoader.load(MyIntf.class).next();