假设我将我的项目构建到myapp.jar中,它取决于fizz.jar,buzz.jar和JODA(joda-time-2.0.jar).
我听说默认的类加载器没有将jar包装在其他jar中,所以我必须假设如果我从Ant调用了一个jar任务,那么将调用默认的类加载器并创建myapp.jar而不使用这些依赖于它.
这是因为心态是在容器或其他系统中部署无主要的罐子,这些罐子会在运行时提供它的要求吗?如果没有,那么myapp.jar如何正常运行?
可执行罐子怎么样?要满足,这些必须与主要的罐子不同,因为它们是独立的单位,对吧?这意味着他们需要将所有依赖项打包在一起,对吧?
最后但并非最不重要的,那些依赖于依赖于罐子等等的罐子的罐子呢. (即,巨大的依赖图)?
我想所有这些问题可归纳如下:
>在不可执行的jar背后的想法是,它将以这样的方式运行,它将知道在运行时查找其依赖关系的类路径? (因此不需要与其依赖项打包)?
>可执行jar背后的想法是它是一个独立的单元,应该与其依赖关系?
>如果我对上面问题#1的断言是正确的,那么这样的类路径配置是如何发生的?这些设置是否存储在jar中(例如清单中)?否则,JRE如何知道在运行时搜索特定jar依赖项的位置?
这些问题的答案实际上将澄清我在Java基础知识方面的许多问题,因此任何输入/帮助都将受到极大的欢迎!谢谢
罐子不知道其他罐子(除非像Maven这样的工具辅助).罐子的依赖性纯粹由类加载器解决.我强烈建议你有 some idea about classloaders.为了解决您的问题,
在一个不可执行的jar背后的想法是,它将以这样一种方式运行,它将知道在运行时查找其依赖关系的类路径? (因此不需要与其依赖项打包)?
>不.如上所述,它是类加载器,它看起来是类路径和其中提到的jar.这些罐子里没有关于其他罐子的任何信息.
可执行jar背后的想法是它是一个独立的单元,应该与它的依赖包打包?
>不.类加载器在执行开始时加载独立的可执行jar.如果它需要其他依赖jar,它将查看这些jar的类路径.
如果我对上面问题#1的断言是正确的,那么这样的类路径配置是如何发生的?这些设置是否存储在jar中(例如清单中)?否则,JRE如何知道在运行时搜索特定jar依赖项的位置?
>对于独立jar(可执行jar),类加载器在调用应用程序时查找传递的类路径变量或类路径.
>对于其他类型的应用程序(WAR,EAR),有预定义的位置/文件夹,其中应放置依赖项以便获取.这是按规格标准化的.
简而言之,它是拉动所有线程的类加载器.有标准的地方可以找到所有相关的罐子. This link很好地描述了独立应用程序和部署(在某个容器中)中的类加载器的工作原理.