<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    kapok

    垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      455 隨筆 :: 0 文章 :: 76 評(píng)論 :: 0 Trackbacks

    Packaging and Application Deployment(Page583-610)

          1.As application servers use different approaches to class loading, we may need to package applications
    differently for different application servers.Even standard deployment units such as EARs may not be wholly
    portable.We'll also need to follow server-specific conventions to define resources such as JDBC DataSources,
    which applications require. As we'll see, the standard J2EE deployment descriptors do not provide all
    necessary information, meaning that we normally require additional, proprietary, deployment descriptors.
    Although the J2EE specifications describe the structure of standard deployment units, no standard deployment
    process is (as yet) mandated.

            2.The two most commonly used deployment units in J2EE applications are Web ARchives (WARs) and EJB
    JAR files.

             3.Most servers allow deployment units to be deployed in "expanded" or "exploded" form.

          4.
    o How we package applications, and especially where we include classes used by both EJB
    JAR and WAR modules.
    o Portability between application servers. Differences between class loading behavior in
    different application servers can be a real problem for portability, and can mean that an EAR
    that works on one server may not work in another, even if it is coded within the J2EE
    specifications.

    5.
    Let's first look at how Java 2 class loading works. The following two basic principles will always apply:
    o Each class retains an association with the class loader that loaded it. The getClassLoader()
    method of java.lang.Class returns the class loader that loaded the class, which cannot be changed
    after the class is loaded. This is the class loader that will be used if the class attempts to load classes
    by name.
    o If the same class is loaded by two class loaders, classes loaded by the two class loaders will not be type
    compatible (although serialization will work).

    The documentation of the java.lang.ClassLoader class further defines the following behavior for class
    loaders:
    o Class loaders are hierarchical. When a class loader is asked to load a class, it first asks its parent class
    loader to try to load the class. Only if the parent (and parent's ancestors) cannot load the class, will
    the original classloader attempt to load the class. The top of the class loader hierarchy is the
    bootstrap loader built into the JVM, which loads java.lang.Object().
    o Although a class loader can see classes loaded by its parent(s), it cannot see classes loaded by its
    children
    .
    As it's possible to implement a custom class loader (and most application servers provide several), it is
    possible to depart from the hierarchical behavior described in the last two bullets.


    6.
    J2EE servers use multiple class loaders, largely because this allows dynamic application reloading. Clearly
    we don't want to reload all the application server's own classes on redeploying an application. This would
    mean that the application server would always need to be restarted. So application servers use different class
    loaders for application code to those they use for their own standard libraries
    , for example. Typically one or
    more new class loaders will be created for each application deployed on a server.

    However, multiple class loaders are not usually used for different application-specific classes in the same
    application unless we use EJB (JSP pages may be given a separate class loader, but this doesn't usually affect
    application code).
    As I've previously mentioned, using EJB considerably complicates the deployment model, compared to that for a
    pure web application. This is also true of class loading. In a WAR, we can simply include all binary dependencies
    in the /WEB-INF/ lib directory. However, things get more complicated when WARs access EJBs.

    To see why, let's consider a common approach to implementing class loading in application servers. In an
    application deployed as an integrated enterprise application in an EAR, the EJB class loader is often the parent
    of the WAR class loader
    . Orion and WebLogic, for example, both use this approach. This is a natural
    implementation approach, as WARs will typically access EJBs (and therefore need to be able to see at least
    EJB client classes), while EJBs do not access web components.

    However, it's not the only valid implementation approach, so the following discussion
    doesn't apply to all application servers.

    Assuming standard J2SE hierarchical class loading behavior, such a hierarchy will mean that any class can
    access classes in boxes that enclose its class loader. However, classes associated with the outer boxes cannot load
    classes in the inner boxes. Thus web application classes can see classes deployed in the application's EJBs and
    system classes. However, EJB classes cannot see web application classes, and classes installed at server-wide
    level cannot see any application-specific classes
    .


    7.
    Surely this is all of interest only to implementers of J2EE application servers? Unfortunately, application
    developers can't afford to ignore, or be ignorant of, the implications of J2EE class loading.

    Assuming the class loader hierarchy described above, let's consider a plausible scenario. Imagine that an
    application class or a framework class used in both EJB and web components attempts to load a class within a
    WAR. Imagine, for example that a BeanFactory implementation used in the EJB container is also used by
    code within a WAR to load classes by name and manipulate them. Even though this infrastructure class is
    visible in the WAR, it cannot load WAR classes. Since it was loaded by the EJB class loader it cannot see
    classes in the WAR, which were loaded by a descendant class loader.
    We can't always solve this problem simply by holding class definitions in both WEB and EJB JAR file, because
    this may cause class cast exceptions, if the two class loaders end up independently loading one or more classes.

    Thus there are two basic problems relating to J2EE class loading, in the common case where EJB and web
    modules are included in the same enterprise application:
    o Where do we hold the definitions of classes used in both EJBs and web applications?
    o How do we ensure that two class loaders don't end up holding independent versions of the same
    class, resulting in class cast exceptions?

    8.
    Not only do implementations of class loading differ, but different J2EE specifications differ regarding
    class loading.

    The Servlet 2.3 specification (9.7.2) states that "It is recommended also that the application class loader (這里是不是專指web 容器的class loader啊)be
    implemented so that classes and resources packaged within the WAR are loaded in preference to classes and
    resources residing in container-wide library JARs".
    This clearly conflicts with the standard J2SE class loading behavior, as described in the Javadoc for the
    java.lang.ClassLoader class. As the WAR class loader must be a dynamic class loader, it must be the child of
    another class loader provided by the application server. Hence the Servlet 2.3 recommendation is the opposite of
    normal Java 2 class loading behavior, which clearly states that classes will be loaded from the child class loader (in
    this case the WAR class loader) only if they cannot be resolved by the ancestor class loaders.

    The main merit of Servlet 2.3-style class loading is that it can allow us to ship any patched libraries an
    application requires as part of the application, without altering the server installation. For example, the XMLC
    2.1 web content generation technology discussed in Chapter 13 requires patched versions of XML libraries
    shipped with some application servers. With Servlet 2.3 class loading, we can include the necessary patches in
    the /WEB- INF /lib directory, without any need to modify overall server configuration or any risk of conflict
    with other applications.

    9.
    We also need to take into account further J2SE class loading refinements. Changes in J2SE 1.3 make it possible
    for JAR files to specify dependencies on other JAR files, by specifying a space-separated list of relative file
    paths in a Class-Path header in their /META-INF/MANIFEST.MF file. Section 8.1.1.2 of the J2EE 1.3
    specification requires that application servers support this for EJBJAR files. The following example from the
    sample application's ticket-ejb.jar file's MANIFEST.MF file illustrates the use of this mechanism in the
    sample application:
    Class-Path: Iog4j-1.2.jar 121-core.jar 121-ejbimpl.jar 121-jdbc.jar

    This declares that the application-specific classes in the ticket-ejb.jar file depend on four infrastructure
    JARs, meaning that the EJBJAR file doesn't need to include any third party classes. These paths are relative. All
    these JAR files are included with the EJBJAR file in the root directly of the application EAR, as the following
    listing of the EAR's contents shows:
    META-INF/
    META-INF/MANIFEST.MF
    META-INF/application.xml
    121-core.jar
    i21-ejbimpl. jar
    121-jdbc.jar
    ticket-ejb.jar
    ticket.war
    Iog4j-1.2.jar

    NOTE: If you use the extension mechanism in a J2SE application, the Class-Path manifest entry can reference directories, too. But for J2EE applications that are wholly contained within JAR files, the Class-Path manifest entry can only reference other JAR files.

    The extension mechanism is a nice capability, especially since it is designed to handle circular redundancies by creating a unified class path containing all dependencies in first parsed-based ordering. For example, if the first EJB application parsed is EJB1.jar and it references:

    Class-Path: jaxp.jar EJB2.jar xmlx.jar

    A classloader will then parse EJB2.jar that references:

    Class-Path: jaxp.jar EJB1.jar

    The resulting "application" class path that a classloader would ultimately use would be:

    Class-Path: jaxp.jar EJB2.jar xmlx.jar EJB1.jar


    Section 8.1.1.2 of the J2EE specification does not require the resolution of classes external to the EAR file, such
    as libraries installed at a server level. This may work in some servers, but is non-standard. If an application
    depends on external binaries, it's usually better just to use your server's way of installing binaries at server-wide
    level. (This is also non-portable, but simpler.)

    Reference:  EJB 2 and J2EE Packaging  http://www.onjava.com/lpt/a/onjava/2001/06/26/ejb.html

    Currently, the J2EE 1.3 specification defines an enterprise application packaging unit to be a JAR file with an .ear extension. EAR files can contain one or more:

    • EJB modules (.jar extension)
    • Web application modules (.war extension)
    • JCA resource adapter modules (.rar extension)
    • Application client modules (.jar extension)

    Since most web-based J2EE applications are composed of web and EJB applications, the EAR file meets the basic requirements for packaging an application. However, it is lacking in capability for packaging complicated J2EE applications. For example, the following components are often used in a J2EE application, but cannot be declared in an EAR file:

    • Some JMS consumers that run within an application server, such as a MessageConsumer that runs as part of a ServerSession
    • JDBC DataSource objects
    • JMS ConnectionFactory and Destination objects
    • JMX MBeans
    • Startup and shutdown classes (admittedly, a propriety extension provided by vendors, but generally unilaterally supplied by all vendors)

    Currently, all of these components of an application have to be manually configured and deployed through a vendor's administration interface. As the usage of the items listed above increases over time, it will become more important for EAR files to natively support packaging of these components to achieve true J2EE application portability

    The most frequent question raised about J2EE packaging is in regards to utility and support classes.


     

    posted on 2005-04-05 09:53 笨笨 閱讀(268) 評(píng)論(0)  編輯  收藏 所屬分類: J2EEALL
    主站蜘蛛池模板: 久久亚洲美女精品国产精品| 一区二区三区无码视频免费福利| 久久久久亚洲精品影视| 免费无码又爽又刺激高潮| 91麻豆国产免费观看| 黄桃AV无码免费一区二区三区| 日本亚洲欧美色视频在线播放| 亚洲免费在线视频观看| 亚洲AV无码久久| 国产成人亚洲综合无码精品| 亚洲AV无码专区日韩| 免费鲁丝片一级在线观看| 我的小后妈韩剧在线看免费高清版 | 亚洲爆乳无码专区| 亚洲国产精品尤物yw在线| 日本高清免费网站| 最近中文字幕无吗免费高清| 国产成人精品免费午夜app| 无码国产精品一区二区免费3p| 在线观看片免费人成视频播放| 日本一区二区在线免费观看| 国产精品亚洲色图| 激情小说亚洲色图| 国产成人亚洲综合a∨| 国产精品手机在线亚洲| 特级无码毛片免费视频| 日韩久久无码免费毛片软件| 香蕉国产在线观看免费| 亚美影视免费在线观看| 国产免费伦精品一区二区三区| 一区二区三区在线免费观看视频| 免费一区二区无码视频在线播放| 老湿机一区午夜精品免费福利| 色婷婷六月亚洲综合香蕉| 免费精品国产自产拍在线观看| 国产亚洲福利一区二区免费看| 黄色大片免费网站| 国产男女爽爽爽免费视频| 最近中文字幕免费大全| 人妻无码久久一区二区三区免费 | 久久91亚洲人成电影网站|