代码之家  ›  专栏  ›  技术社区  ›  Jack Edmonds

EJB的默认类路径是什么?

  •  1
  • Jack Edmonds  · 技术社区  · 14 年前

    请原谅我对Java EJB的可怜知识,但是,当EJB部署到A.jar文件的应用服务器时,Hibernate和Log4J之类的东西首先会在.jar文件中查找它们的配置文件(Hibernate .CF.xml和Log4j.Fielts)?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Pascal Thivent    14 年前

    (…)当EJB作为.jar文件部署到应用服务器时,Hibernate和log4j等操作首先在.jar文件中查找它们的配置文件(hibernate.cfg.xml和log4j.properties)?

    这取决于工具的实现,与您使用EJB的事实无关。对于Hibernate,文档将写入:

    3.7. XML configuration file

    另一种方法 配置是指定一个完整的 名为的文件中的配置 hibernate.cfg.xml . 此文件可以 用作 hibernate.properties 文件,如果两者都是 存在以重写属性。

    XML配置文件是 通过 默认值应位于 你的 CLASSPATH .

    关于log4j,程序描述如下:

    Default Initialization Procedure

    log4j库没有 对环境的假设。在 特别是,没有默认的log4j 附加物。在某些明确的定义下 然而,情况是静态的 的初始化器 Logger 阶级意志 尝试自动配置 Log4J.java语言的保证 类的静态初始值设定项 在 将类加载到内存中。它 记住这点很重要 可以加载不同的类加载器 同一类的不同副本。 同一类的这些副本是 被认为是完全无关的 JVM。

    默认初始化是非常 适用于 应用程序的入口点取决于 在运行时环境中。为了 例如,相同的应用程序可以 用作独立应用程序,如 小程序,或作为 Web服务器的控制。

    精确的默认初始化 算法定义如下:

    1. 设置 log4j.defaultInitOverride 系统属性转换为任何其他值,然后 “假”将导致log4j跳过 默认初始化过程(此 程序)。
    2. 设置 resource 字符串变量的值 log4j.configuration 系统属性。 首选的方法 指定默认初始化 文件是通过 log4j.配置 系统属性。 如果系统属性 log4j.配置 未定义,则设置字符串变量 资源到其默认值 “log4j.属性”。
    3. 尝试转换 资源 变量到URL。
    4. 如果资源变量无法转换为URL,例如由于 一 MalformedURLException 然后搜索 对于类路径中的资源 打电话 org.apache.log4j.helpers.Loader.getResource(resource, Logger.class) 它返回一个URL。 注意字符串 “log4j.属性”构成 格式错误的URL。见 Loader.getResource(java.lang.String) 查找已搜索位置的列表。
    5. 如果找不到URL,则中止默认初始化。否则, 从URL配置log4j。这个 PropertyConfigurator 将习惯于 解析URL以配置log4j 除非URL以“.xml”结尾 扩展,在这种情况下 DOMConfigurator 将被使用。你 可以选择指定自定义 配置器。的值 log4j.configuratorClass 系统属性被视为 自定义的限定类名 配置器。自定义配置程序 您指定的必须实现 Configurator 接口。

    总而言之,如果您将这两个文件都放在EJB-JAR的根目录下,那么应该可以找到它们。


    关于你问题的题目,我建议你读一下 Packaging EJB 3 Applications 我引用的是:

    JAVA EE模块之间的依赖关系

    不幸的是,没有JavaEE 规范为 类加载和每个应用程序 服务器在中实现类加载器 无论哪种方式对供应商来说都是最好的。 但是,JavaEE定义了 课程的可视性和共享 在不同的模块之间,我们可以 描述两者之间的依赖关系 不同的模块如图所示 4。

    如图4所示,耳朵 类加载器加载库中的所有jar 共享的目录 多个模块。通常是一个 EJB类加载器加载所有EJB 打包在所有EJB-JAR模块中。这个 EJB类加载器通常是 应用程序类加载器,以及 加载所有EJB类。因为EJB 是EAR类加载器的孩子, 在>EAR级别加载的所有类 将对EJB可见。

    alt text http://www.developer.com/img/2007/04/EJB03.jpg

    图4:课堂演示 包含以下内容的EAR文件的可见性 多个Web模块、EJB和共享 库模块。EAR类装载机 在打包的jar中加载类 作为库模块和所有类 EAR类加载器加载的是 对EJB可见。班级 由EJB类加载器加载的是 通常在中对Web模块可见 大多数集装箱因为战争类 加载器是EJB类的子级 加载器。

        2
  •  1
  •   stratwine    14 年前

    我认为log4j会在多个地方查找log4j.properties文件。总之,EJB JAR中的所有配置文件都位于META-INF目录中。