当前位置: 首页 > 知识库问答 >
问题:

api配置暴露了缺陷,而实现却不暴露,这到底意味着什么?

宇文鸿振
2023-03-14

我已经看过了官方文档和许多关于APIimplementation配置之间区别的StackOverflow问题。我想我理解基本的,但我真的想理解依赖项暴露或不暴露意味着什么。

这就是我目前所得到的。当我发布我的Java库(用Kotlin编写,但不相关)时,发布的POM文件中的依赖范围要么是使用API时的complie要么是使用implementation时的runtime

dependencies {
    api "..."
}
<dependency>
      <groupId>...</groupId>
      <artifactId>...</artifactId>
      <version>...</version>
      <scope>compile</scope> 
</dependency>
dependencies {
    implementation "..."
}
<dependency>
      <groupId>...</groupId>
      <artifactId>...</artifactId>
      <version>...</version>
      <scope>runtime</scope> 
</dependency>

那么在这种情况下公开依赖项真的只是意味着将它们添加到类路径(编译范围)吗?

关于APIimplementation的许多答案之一是,它仅仅是关于构建优化,如果我们不在类路径中添加所有内容,那么构建时间就会减少,这是有道理的?

还有一个额外的问题,Gradle doc说API配置附带了java-library插件,但显然,我可以在不应用插件的情况下使用它,这怎么可能呢?

// Gradle 6.1.1
plugins {
    id 'org.jetbrains.kotlin.jvm' version 'XXX'
}
dependencies {
    api "myLibrary"
}

共有1个答案

龚威
2023-03-14

那么在这种情况下公开依赖项真的只是意味着将它们添加到类路径(编译范围)吗?

是的,这很大程度上只是在使用者的compile类路径上有没有它们的问题。

关于api vs实现的许多答案中有一个说它只是关于构建优化,如果我们不在类路径中添加所有内容,那么构建时间就会减少,这是有道理的?

    null

最后一个在我看来是最大的好处。假设您有一个大型多项目,其中一个共享子项目内部依赖于Apache Commons Lang。如果您已经将Lang声明为api依赖项并对其进行了更新,那么所有其他依赖于此共享项目的项目都需要重新编译。如果您将其声明为实现依赖项,则不会发生这种情况。所有这些项目仍然需要重新进行原因测试,因为运行时行为可能已经发生了变化(在Gradle中,这是默认情况下正确处理的)。

还有一个额外的问题,Gradle文档说api配置随java-library插件而来,但显然,我可以不应用插件就使用它,这怎么可能呢?

这是因为Kotlin插件还声明了一个api配置。它具有与java-library插件配置的相同的语义。

 类似资料:
  • 主要内容:1.概述,2.doExportUrls,3. Protocol1.概述 Dubbo 服务暴露有两种方式 本地暴露,JVM 本地调用。配置如下: <dubbo:service scope=“local” /> <dubbo:service scope=“remote” /> 在不配置 scope 的情况下,默认两种方式都暴露。 2.doExportUrls 本地暴露服务的顺序图如下: 我们看到 ServiceConfig#export() 方法中,会在配置初始

  • 我有一个web应用程序,它使用firebase进行身份验证和数据库,使用Angular4进行前端。我正在上传图像到AWS3通过我的网络应用程序和它的工作良好。 我目前正在使用angular4代码中的accessKeyId和secretAccessKey将文件直接上传到AWS S3(使用AWS SDK for javascript)。编译angular后,客户端浏览器仍然在前端使用javascrip

  • 如果你的服务需要预热时间,比如初始化缓存,等待相关资源就位等,可以使用 delay 进行延迟暴露。我们在 Dubbo 2.6.5 版本中对服务延迟暴露逻辑进行了细微的调整,将需要延迟暴露(delay > 0)服务的倒计时动作推迟到了 Spring 初始化完成后进行。你在使用 Dubbo 的过程中,并不会感知到此变化,因此请放心使用。 Dubbo-2.6.5 之前版本 延迟到 Spring 初始化完

  • EXPOSE 声明端口 格式为 EXPOSE <端口1> [<端口2>...]。 EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,

  • 8.1. 源码暴露 你的WEB服务器必须要能够读取你的源确并执行它,这就意味着任意人所写的代码被服务器运行时,它同样可以读取你的源码。在一个共享主机上,最大的风险是由于WEB服务器是共享的,因此其它开发者所写的PHP代码可以读取任意文件。 <?php header('Content-Type: text/plain'); readfile($_GET['file']); ?> 通过在你的源码所在的

  • 5.1. 源码暴露 关于包含的一个重要问题是源代码的暴露。产生这个问题主要原因是下面的常见情况: l对包含文件使用.inc的扩展名 l包含文件保存在网站主目录下 lApache未设定.inc文件的类型 lApache的默认文件类型是text/plain 上面情况造成了可以通过URL直接访问包含文件。更糟的是,它们会被作为普通文本处理而不会被PHP所解析,这样你的源代码就会显示在用户的浏览器上(见图