当前位置: 首页 > 面试题库 >

什么是带阴影的JAR?超级JAR和着色JAR之间的区别/相似之处是什么?

云和硕
2023-03-14
问题内容

您能帮忙解释一下什么是带阴影的罐子,maven-shade-plugin有用吗?还有什么是超级罐子。


问题答案:

我将首先解释什么是超级JAR,因为这将支持阴影说明。

超级JAR是包含多个JAR(或更常见的是,其他多个JAR本身)的内容的JAR。

您的应用程序几乎肯定会使用其他软件包,并且这些软件包可能以JAR的形式提供。使用Maven时,这些依赖关系表示如下:

<dependency>
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
</dependency>

在运行时,您的应用程序将期望在其类路径中找到此JAR中包含的类。

您可以创建一个包含所有这些依赖JAR的所有类等的uber JAR,而不是将这些依赖JAR随您的应用程序一起提供,然后从该uber JAR中运行您的应用程序。

底纹

着色提供了一种创建uber JAR并重命名uber
JAR包含的包的方法。如果您的超级JAR可能被用作另一个应用程序中的依赖项,则存在超级JAR中的依赖类版本可能与另一个应用程序中的相同依赖项版本冲突的风险。通过在uber
JAR中重命名软件包,阴影有助于避免任何此类问题。

例如:

  1. 您创建一个包含该Foo库v1.0.0的超级JAR 。
  2. 其他人在其应用程序中使用您的超级JAR, Bar
  3. Bar应用程序仅依赖于Foo该库的v1.2.0,但依赖于该库。

现在,如果Foo我们的1.0.0版和1.2.0版之间存在冲突,则可能会出现问题,因为的所有者Bar不能依赖于将加载哪个版本,因此它们的代码将无法正常运行,或者您的代码-
在其应用程序中运行时-会表现不良。

阴影有助于避免诸如此类的问题,并且还允许提供者Foo明确说明其使用的依赖库的版本。

maven-shade-plugin让你(一)创建一个超级JAR和(b)遮阳其内容。

摘要

创建uber JAR是简化部署过程的有用技术。

阴影是对超级JAR概念的扩展,通常只限于以下情况下的用例:

  • JAR是要在另一个应用程序/库中使用的库
  • JAR的作者希望确保JAR使用的依赖项在他们的控制之下
  • JAR的作者希望避免任何使用JAR的应用程序/库的“版本冲突”问题


 类似资料:
  • 我们目前正在使用Spring cloud config server spring-cloud d-config-server-1.1.0。M2-exec.jar,并希望升级到最新版本。但是,我注意到超过1.1.0。M2版本只有标准的jars,Maven repo中没有exec.jarhttp://maven.springframework.org/milestone/org/springfram

  • 问题内容: JAR文件和软件包之间有什么区别吗? 问题答案: 包是一种 逻辑上 组织您的类的方法。例如,您可以在每个源文件的顶部声明足够相关以一起驻留在包中。Java编译器和运行时还将期望您将此类文件放置在path中,该路径的根是类路径中的目录或JAR。 JAR文件使您可以 物理上 组织您的班级。您可以获取任何Java文件(以及它们的父目录,遵循上面讨论的目录结构),并将它们存储在JAR文件中。一

  • 问题内容: 所以我对Angular js vs Express js的目标有些困惑。根据我的理解,我们使用Node.js来提供Angular js的服务,但是我们并不完全受限于/强制使用Node.js来提供服务。另一方面,Express js似乎完成了与更传统的MVC框架类似的任务。 那么Angular Js是一种非特定于服务器的MVC框架吗?这是否限制了Angular js后端服务器功能或易用性

  • 问题内容: java类文件和jar文件有什么区别? 问题答案: Jar文件是一个包含一个或多个Java类文件的Zip存档。这使得使用库(由多个类组成)更加方便。目录和Jar文件被添加到类路径,并且在运行时可用于在其中找到特定的类。

  • 我知道还有其他类似的线程,但我不确定它们是否与Postgres相关。 我正在阅读PostgreSQL文档,内容如下: 注意:如第20章所述,PostgreSQL实际上在“角色”方面进行了权限管理。在本章中,我们始终使用数据库用户来表示“具有 LOGIN 特权的角色”。 这是否意味着角色是数据库用户?或者角色和用户之间有区别吗?用户是否有可能不具有完全权限,而角色是始终具有完全权限的用户?