【问题标题】:Does classpath definition in Manifest.mf override or supplement library-path in EARs?Manifest.mf 中的类路径定义是否覆盖或补充 EAR 中的库路径?
【发布时间】:2015-06-23 06:31:23
【问题描述】:

关于在 MANIFEST.MF 中使用 Class-Path,我与另一位开发人员(以及经验证据)存在意见分歧。

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

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

所以现在的问题是:

  1. 如果在 EJB 清单中找到类路径条目,即使清单中没有明确指定,类加载器是否仍然可以访问 /lib 中的所有 jars/lib?
  2. 如果在清单中找不到类路径条目,EJB 是否有权访问 /lib 中的任何/所有 jar?
  3. 如果清单中指定的 jar 位于与 /lib 不同的位置,它是否优先于 /lib 中的内容?
  4. 类加载器如何解决清单中有不存在的 jar 条目的问题?
  5. 是所有这些规则都依赖于容器实现,还是 Java 规范的一部分(我无法在任何地方找到)。

部分问题是由于我使用的第三方 EJB 与编写不佳的清单(在根文件夹中查找库、不存在的 jar 等)一起使用的。所以我可以重写清单,但是,我也质疑在签名的 EJB jar 的情况下这将如何工作。我可以从清单中定义的位置移动依赖库吗?

【问题讨论】:

    标签: java jar classpath manifest ear


    【解决方案1】:

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

    1. 在引导时从服务器拥有的 jar 加载到内存中的类;
    2. 如果 MANIFEST 中没有指向不同的类路径,则来自 WEB-INF 的类用于 Web 项目;
    3. 在 lib 文件夹中(如果已定义);

    现在我来回答你的问题:

    1. 不,如果 jar 不存在,则会抛出 ClassNotFoundException。
    2. 是的。
    3. 是的。
    4. ClassNotFoundException 将被抛出。
    5. 是的,这取决于服务器。不同的服务器尝试以不同的方式优化加载过程,因此我们有一些项目部署和工作的人工制品。

    如果需要,您可以在 jar 中编辑 MANIFEST 并重新签名。

    【讨论】:

    • 所以只是为了确认我的理解;如果清单类路径中列出了任何内容,则无法访问 <library-path> 中的任何内容?一切都必须明确指定?在这种情况下,如果我将所有内容都放在 /lib 中,那么指定一个 manfiest 类路径有什么好处?有什么价值吗?
    • 是的,确实如此。如果服务器未通过类路径找到 jar,则会引发异常。例如 manifest 中的 classpath 是实现瘦战技术所需要的。
    猜你喜欢
    • 2012-09-11
    • 2016-03-04
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 2017-05-28
    • 2018-03-16
    • 2015-08-11
    • 2010-09-24
    相关资源
    最近更新 更多