Manifest.mf中的类路径定义是否覆盖或补充EAR中的库路径?

时间:2015-04-16 17:15:02

标签: java jar classpath manifest ear

我与其他开发者(以及经验证据)在MANIFEST.MF中使用Class-Path有不同的意见。

我的/ lib文件夹中有一堆罐子的EAR。在我的application.xml中,我已将<library-path>定义为/ lib,但无论如何我认为这是默认设置/值。

在我的根目录中,我有一个my-ejb.jar文件。在EJB中,我有一个带有Class-Path条目的MANIFEST.MF。

现在的问题是:

  1. 如果在EJB清单中找到了类路径条目,那么类加载器是否仍然可以访问/ lib中的所有jar / lib,即使它们没有在清单中明确指定?
  2. 如果清单中没有找到类路径条目,EJB是否可以访问/ lib中的任何/所有jar?
  3. 如果清单中的jar指定的位置与/ lib不同,是否优先于/ lib中的内容?
  4. 类加载器如何解决清单中有不存在的jar的条目的问题?
  5. 所有这些规则都取决于容器实现,还是某些地方的java规范的一部分(我无法在任何地方找到它)。
  6. 问题的一部分是由于我使用的第三方EJB与写入不良的Manifest(在根文件夹中查找libs,不存在的jar等)。所以我可以重写清单,但是,我也质疑这在签名的EJB jar的情况下是如何工作的。我是否能够从定义清单的位置移动依赖库?

1 个答案:

答案 0 :(得分:0)

不幸的是,类加载是为应用程序服务器类型指定的进程。 在主要情况下,它看起来像这样。通过类路径获取服务器的服务器搜索类时,它会走路并搜索:

  1. clases在启动时从服务器拥有的jar中加载到内存中;
  2. 来自WEB-INF的Web项目类,如果在MANIFEST中没有指向不同的类路径;
  3. lib文件夹中的
  4. ,如果已定义;
  5. 现在我回答你的问题:

    1. 不,如果jar不存在,则抛出ClassNotFoundException。
    2. 将抛出ClassNotFoundException。
    3. 是的,它取决于服务器到服务器。不同的服务器尝试以不同的方式优化加载过程,由于它们,我们有一些项目部署和工作的假象。
    4. 如果您需要,可以在jar中编辑MANIFEST并再次签名。