Deployment 部署概念:打包JAR依赖项,何时&;为什么?

Deployment 部署概念:打包JAR依赖项,何时&;为什么?,deployment,jar,java,Deployment,Jar,Java,所以我对JavaEE比较陌生,我很难理解Java部署文件何时、何地以及为什么要打包它们的依赖项 假设我将我的项目构建到myapp.jar,它取决于fizz.jar、buzz.jar和JODA(JODA-time-2.0.jar) 我听说默认类加载器不会将jar打包到其他jar中,因此我必须假设,如果我从Ant调用jar任务,那么默认类加载器将被调用,并且myapp.jar将被创建,其中没有这3个依赖项 这是因为心态是在运行时提供需求的容器或其他系统中部署main-更少的jar吗?如果没有,那么m

所以我对JavaEE比较陌生,我很难理解Java部署文件何时、何地以及为什么要打包它们的依赖项

假设我将我的项目构建到myapp.jar,它取决于fizz.jar、buzz.jar和JODA(
JODA-time-2.0.jar

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

这是因为心态是在运行时提供需求的容器或其他系统中部署
main
-更少的jar吗?如果没有,那么myapp.jar如何正确运行

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

最后但并非最不重要的一点是,那个些依赖于罐子的罐子呢。(即,庞大的依赖关系图)

我想所有这些问题可以总结如下:

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

  • 对这些问题的回答实际上会澄清我在Java基础知识方面遇到的许多问题,因此,我们将非常感谢这里的任何输入/帮助!谢谢

    JAR文件是一种打包复杂java应用程序的方法。Jar应用程序很容易在不同的机器和操作系统之间移动

    我认为使用jar的正确方法不是将所有(每个依赖项)都放在一个jar中

    例如,如果应用程序使用jar库(例如jdbc)访问数据库,则不应将JDBCJAR放入jar中

    最好只使用.class文件构建一个jar文件

    当然,您的代码需要JDBCJAR才能正常工作。下面介绍虚拟机如何搜索extarnal类:

    -它首先搜索包含J2SE标准类的目录(路径取决于您的安装)

    -它在类路径指定的目录中搜索(类路径是环境变量或java命令的选项)

    例如:

    java-jar-c/your/path/yourApp.jar

    将运行应用程序,并在/your/path/目录中搜索应用程序引用的类,因此如果您有外部JAR,则可以将它们放在该目录中


    有关详细文档:

    JAR不知道其他JAR(除非有Maven等工具的帮助)。JAR的相互依赖性完全由类装入器解决。我强烈建议你吃

    为了回答你的问题

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

    • 不,正如前面提到的,是类加载器查看类路径和其中提到的JAR。jar没有关于其他jar的任何信息
    可执行jar背后的想法是它是一个独立的单元,应该与其依赖项一起打包吗

    • 否。类加载器在执行开始时加载独立的可执行JAR。如果它需要其他依赖JAR,它将查找这些JAR的类路径
    如果我对上述问题#1的断言是正确的,那么这样的类路径配置是如何发生的?这些设置是否存储在jar中(如清单中)?否则,JRE如何知道在运行时在何处搜索特定的jars依赖项

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

    简而言之,是类加载器在拉动所有线程。有一个标准的地方可以找到所有依赖的jar。很好地描述了独立应用程序和已部署(在某些容器中)的类加载器的工作方式。

    Ok,那么JRE首先查看其默认类路径设置(在安装时定义),然后查看类路径环境变量?所以我假设您没有在jar/清单中的任何地方指定类路径?当然,您也可以在清单文件中将该类路径指定为一个条目。但在这种情况下,您在清单中配置的路径是相对于清单字段本身的位置的。因此,如果你移动jar文件,你必须更新清单的类路径条目。这就是为什么我不喜欢在jar清单文件中使用clappath选项。哇,这是一个多么好的答案!非常感谢!