gpt4 book ai didi

部署概念 : Packaging JAR Dependencies, 时间和原因

转载 作者:搜寻专家 更新时间:2023-10-31 20:05:47 26 4
gpt4 key购买 nike

所以我是 Java EE 的新手,我很难理解 Java 部署文件何时、何地以及为何与它们的依赖项打包在一起。

假设我将我的项目构建到 myapp.jar 中,它依赖于 fizz.jar、buzz.jar 和 JODA (joda-time-2.0.jar)。

我听说默认的类加载器不会将 jar 打包到其他 jar 中,所以我必须假设如果我从 Ant 调用一个 jar 任务,那么默认的类加载器将被调用并且 myapp.jar 将在没有这 3 个依赖项的情况下创建。

这是因为人们的想法是在容器或其他系统中部署 main-less jar 以在运行时提供其需求吗?如果不是,那么 myapp.jar 如何正确运行?

可执行 jar 包呢?要满足,这些必须不同于main-less jar,因为它们是独立单元,对吧?这意味着他们需要将所有依赖项打包在一起,对吧?

最后但并非最不重要的一点是,那些依赖于 jars 的 jars 等等。 (即巨大的依赖图)?

我想所有这些问题都可以归纳如下:

  1. 不可执行的 jar 背后的想法是,它会以这样一种方式运行,即它会知道在运行时要查找其依赖项的类路径吗? (因此不需要与其依赖项一起打包)?
  2. 可执行 jar 背后的想法是它是一个独立的单元并且应该与其依赖项打包在一起吗?
  3. 如果我对上面问题 #1 的断言是正确的,那么这样的类路径配置是如何发生的?这些设置是否存储在 jar 中(例如 list 中)?否则,JRE 如何知道在运行时在哪里搜索特定的 jars 依赖项?

这些问题的答案实际上将澄清我在 Java 基础知识方面遇到的很多问题,因此我们将不胜感激任何输入/帮助!谢谢

最佳答案

Jar 不知道其他 jar(除非借助 Maven 等工具)。 jar 的相互依赖完全由类加载器解决。我强烈建议拥有 some idea about classloaders .

为了解决您的问题,

不可执行的 jar 背后的想法是,它将以这样一种方式运行,即它知道在运行时要查找其依赖项的类路径吗? (因此不需要与其依赖项一起打包)?

  • 没有。如前所述,是类加载器查找类路径和其中提到的 jar。这些 jar 没有关于其他 jar 的任何信息。

可执行 jar 背后的想法是它是一个独立的单元并且应该与其依赖项一起打包吗?

  • 没有。类加载器在执行开始时加载独立的可执行 jar。如果它需要其他依赖项 jar,它将查看这些 jar 的类路径。

如果我对上面问题 #1 的断言是正确的,那么这样的类路径配置是如何发生的?这些设置是否存储在 jar 中(例如 list 中)?否则,JRE 如何知道在运行时在哪里搜索特定的 jars 依赖项?

  • 对于独立 jar(可执行 jar),类加载器查找在调用应用程序时传递的类路径变量或类路径。
  • 对于其他类型的应用程序(WAR、EAR),有一些预定义的位置/文件夹,其中应该放置依赖项以便获取。这是按规范标准化的。

简而言之,它是拉动所有线程的类加载器。它在标准位置查找所有相关的 jar。 This link很好地描述了独立应用程序和已部署(在某些容器中)中的类加载器如何工作。

关于部署概念 : Packaging JAR Dependencies, 时间和原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7473260/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com