Deployment is the term used for the process of installing a web application, EJB application , enterprise application or a resource adapter. Makes it available for the clients to access it. You can deploy several different types of enterprise applications in JBoss AS: The WAR application archive (e.g., myapp.war) packages a Java EE web application in a JAR file. It contains servlet, view pages, libraries, and deployment descriptors such as web.xml, faces-config.xml, jboss-web.xml etc. The EAR application archive (e.g., myapp.ear) packages a Java EE enterprise application in a JAR file. It typically contains a WAR file for the web module, JAR files for EJB modules, as well as deployment descriptors such as application.xml and jboss-app.xml etc. You can also deploy JAR files containing EJBs or other service objects directly in JBoss AS. The SAR application archive (e.g., myservice.sar) packages a JBoss service in a JAR file. It is mostly used by JBoss internal services. The *-ds.xml file defines connections to external databases. The data source can then be reused by all applications and services in JBoss AS via the internal JNDI. You can deploy XML files with MBean service definitions. If you have the appropriate JAR files available in the deploy or lib directories, the MBeans specified in the XML files will be started. This is the way how you start many JBoss AS internal services, such as the JMS queues. Packaging one or more modules into a single archive so that the deployment of the various modules onto an application server happens simultaneously and coherently. J2EE deployment descriptor, application.xml. Sample application.xml looks like below. <application> <display-name>Example 2 </display-name> <module> <web> <web-uri>example2.war</web-uri> <context-root>/example2</context-root> </web> </module> </application> Jboss provides jboss-app.xml for JBoss-specific deployment configuration for the EAR application.For instance, it can specify the deployment order of modules in the EAR, deploy JBoss-specific application modules in the EAR, such as SARs (Service ARchive for MBeans) and HARs (Hibernate ARchive for Hibernate objects), provide security domain and JMX MBeans that can be used with this application, etc. <jboss-app> <loader-repository> myapp:archive=myapp.ear </loader-repository> </jboss-app> Root directory contains all the html, jsp, images files and the additional directories containing these files. In the root directory there is a special directory 'Web-inf' which contains the web deployment descriptor (web.xml), classes and the lib directory. <web-app> <servlet> <servlet-name>HelloWorld</servlet-name> <servlet-class>HelloWorld</servlet-class> </servlet> <servlet-mapping> <url-pattern>/servlet/HelloWorld</url-pattern> <servlet-name>HelloWorld</servlet-name> </servlet-mapping> </web-app> jboss-web.xml file to add JBoss-specific information in the WEB-INF folder. Specify resource references, EJB references, specifying security domains etc. <jboss-web> <!-- Use the JaasSecurityMgr other security domain for authentication and authorization of secured web content. --> <security-domain>java:/jaas/other</security-domain> </jboss-web> META-INF/ directory can contain the following files: META-INF/ejb-jar.xml -- the EJB J2EE deployment descriptor for this EJB module. META-INF/MANIFEST.MF -- an optional file that can be used to specify additional meta-information for the JAR. For example, MANIFEST.MF can be used to extend the CLASSPATH used by the EJB module. ejb-jar.xml, introduces EJB Bean in the EJB module to the application container. Classes folder contains the module’s class files. <enterprise-beans> <message-driven> <ejb-name>TestMDB</ejb-name> <ejb-class>TestMDB</ejb-class> </message-driven> </enterprise-beans> </ejb-jar> jboss.xml file to add JBoss-specific information in the META-INF folder. Contains container specific mappings like queues, Data Sources etc. <jboss> <enterprise-beans> <message-driven> <ejb-name>TestMDB</ejb-name> <configuration-name>Standard Message Driven Bean</configuration-name> <destination-jndi-name>/queue/DLQ</destination-jndi-name> </message-driven> </enterprise-beans> </jboss> Usage confined to Jboss Application Server and not a J2EE standard. Used for deploying a service component in the application server without dependent on other components. When application server starts, these SAR files or independent components will be deployed and starts running independently. JBoss's service archive architecture is based on the Java Extension Management (JMX). During the server bootup process, the service archive deployer (SARDeployer) instantiates the JBoss service classes and exposes them as manageable beans through JMX. In the SAR applications, we create a Mbean interface and the Mbean implementation class. jboss-service.xml is the deployment descriptor which contains the references to the classes and this is found in the META-INF folder of SAR Application.\ <server> <mbean code="JavaBeat" name="service.javabeat:service=JavaBeat"/> </server> Ways to deploy the applications in Jboss Application Server. Hot Deployment Admin Console JMX Console Twiddle. Ant Script Hot-deployable services are those which can be added to or removed from the running server. These are placed in the $JBOSS_HOME/server/<instancename>/deploy directory. Defined in the jbossAs/server/server-profile/deploy/hdscanner-jbossbeans.xml The URLDeploymentScanner MBean service provides the JBoss hot deployment capability. This service watches one or more URLs for deployable archives and deploys the archives as they appear or change. It also undeploys previously deployed applications if the archive from which the application was deployed is removed. <bean name="HDScanner" class="org.jboss.system.server.profileservice.hotdeploy.HDScanner"> <property name="deployer"> <inject bean="ProfileServiceDeployer"/></property> <property name="profileService"> <inject bean="ProfileService"/></property> <property name="scanPeriod">5000</property> <property name="scanThreadName">HDScanner</property> </bean> The Hot Deployment can be disabled just by removing the hdscanner-jbossbeans.xml from the deploy folder. You can create custom hot deploy directory by modifying the $JBOSS_HOME/server/$PROFILE/conf/bootstrap/profile.xml Admin Console: You can deploy the application from the Jboss Admin Console as well. Navigate to the Applications <Type of applications> Deploy the application in exploded format or archives (war,jar,ear,rar formats). When deployed , it copies over the deployment into the jbossAs/server/server-profile/deploy folder You can also re-deploy / undeploy the applications from the Admin console You can start, stop the application from the Admin Console. JMX Console: Deployment using the JMX console. ◦ Navigate to the “jboss.system” object type ◦ Click on “service=MainDeployer” Mbean. ◦ Now invoke the operation ‘deploy’ by passing the location of the file. Note: There are overloaded deploy methods, invoke the method that takes the “java.net.URL” as an argument type and pass the application location. Twiddle: We can use twiddle utility to deploy, redeploy and undeploy the applications. Navigate to the $Jboss_Home/bin folder. For deploying the application. twiddle.bat -s localhost invoke "jboss.system:service=MainDeployer" deploy "file:/c:/TestMDB.jar" For re-deploying the application. twiddle.bat -s localhost invoke "jboss.system:service=MainDeployer" redeploy "file:/c:/TestMDB.jar" For undeploying the application. twiddle.bat -s localhost invoke "jboss.system:service=MainDeployer" undeploy "file:/c:/TestMDB.jar" Client looks up the EJB Bean using the JNDI. If the bean is deployed in a standalone JAR file in the JBOSS_DIST/default/deploy directory, the bean is accessible via local JNDI name MyBean/local, where MyBean is the implementation class name of the bean as we showed earlier. The "local" JNDI in JBoss AS means that the JNDI name is relative tojava:comp/env/. If the JAR file containing the bean is packaged in an EAR file, the local JNDI name for the bean ismyapp/MyBean/local, where myapp is the root name of the EAR archive file (e.g., myapp.ear, see later for the EAR packaging of EJB3 beans). Note: Use @Remote for a remote bean and @LocalBinding for a local access. The deployment is done via the JBoss EJB3 deployer in JBOSS_DIST/ server/default/deployers/ejb3.deployer/. The EJB3 deployer automatically scans JARs on the classpath to look for EJB3 annotations. When it finds classes with EJB3 annotations, it would deploy them as EJB3 services. Hibernate an open source Java persistence framework project. Perform powerful object relational mapping and query databases using HQL. The default Hibernate property values are specified in the JBOSS_DIST/server/default/deploy/ejb3.deployer/MEATINF/persistence.properties file. Below is the persistence.properties file bundled in JBoss AS 5.0. hibernate.transaction.manager_lookup_class=org.hibernate.transaction.JBossTransaction ManagerLookup #hibernate.connection.release_mode=after_statement #hibernate.transaction.flush_before_completion=false The Java Classloader is a part of the JRE that dynamically loads Java classes into the JVM. Usually classes are only loaded on demand. Each Java class must be loaded by a class loader. Furthermore, Java programs may make use of external libraries or may itself be composed, at least in part, by a number of libraries. When the JVM is started, three class loaders are used: Bootstrap class loader. ◦ Extensions class loader ◦ The bootstrap class loader loads the core Java libraries (<JAVA_HOME>/lib directory). This class loader, which is part of the core JVM, is written in native code. The extensions class loader loads the code in the extensions directories (<JAVA_HOME>/lib/ext or any other directory specified by the java.ext.dirs system property). It is implemented by the sun.misc.Launcher$ExtClassLoader class. System class loader ◦ The system class loader loads code found on java.class.path, which maps to the system CLASSPATH variable. This is implemented by thesun.misc.Launcher$AppClassLoader class. Note: You can also write custom class loaders to have more fine grained control over the class loading mechanism. Delegation model for class loaders was introduced in Java 2. class loaders are arranged hierarchically in a tree, with the bootstrap class loader as the root of the tree. Each user-defined class loader is assigned a "parent" class loader when it is constructed. Log Filter: ◦ Watch for filter criteria of log file, then send notifications ◦ Criteria, eg: Message severity level Subsystem generating the message User ID running the subsystem Message ID Message text Why? Earlier versions, there was lot of redundancy of the resource handling code scattered/ duplicated. It was code that was trying to determine what type of resource a particular resource was, e.g. is it a file, a directory, or a jar loading resources through URLs. Issues processing of nested archives. Many problems with file locking on Windows systems, which forced us to copy all hot-deployable archives to another location to prevent locking those in deploy folders. File locking was a major problem that could only be addressed by centralizing all the resource loading code in one place. Recognizing a need to deal with all of these issues in one place, wrapping it all into a simple and useful API, we created the VFS project. What? Usage in VFS can be split in two pieces: ◦ ◦ Simple resource navigation Visitor pattern API As mentioned, in plain JDK resource handling navigation over resources is far from trivial. You must always check what kind of resource you're currently handling, and this is very cumbersome. With VFS we wanted to limit this to a single resource type - VirtualFile. VFS API is its implementation of a proper visitor pattern. This way it's very simple to recursively gather different resources, something quite impossible to do with plain JDK resource loading. Cons. It adds additional layer on top of JDK's resource handling, meaning extra invocations are always present when you're dealing with resources. We also keep some of the jar handling info in memory to make it easy to get hold of a specific resource, but at the expense of some extra memory consumption. The JBoss ClassLoader framework is made up of a number of abstractions at different levels. The ClassLoader project is split into 3 subprojects classloader classloading classloading-vfs The JBoss ClassLoader project is the runtime implementation of the classloader framework. If you just want the basic functionality of the classloader then you can use this level directly. Here you can create ClassLoaderPolicys that define each classloader's rules and link them together to create a peer delegate classloading system. The JBoss ClassLoading project is the deployment time framework that allows classloaders to be constructed from ClassLoadingMetaData. Rather than dealing with constructing policies and manually linking them together, you specify requirements and capabilities for each ClassLoading Module. The system then links these requirements to capabilities as they are satisifed and checks their consistency. You can think of this level as a kind of dependency injection framework for classloaders. The VFSClassLoader provides an implementation of the ClassLoaderPolicy using the JBoss Virtual File System project. This can be used directly or in the JBoss ClassLoading framework. http://community.jboss.org/wiki/JBossClassLoaderIntroduction There are two levels of scoping, isolation from other deployments, and isolation that overrides the loading of JBoss server classes. With nested modules, only the top level file may specify class loader scoping. If you have a .ear file containing other modules, only scoping specified in the .ear's META-INF/jboss-app.xml is used. This also applies for any other deployment which contains sub-deployments. For example, if a .sarcontains a .war deployment, only the .sar META-INF/jboss-service.xml scoping has effect. Third party jars files used are organized across different directories. jboss/client - this folder contains all the jar files used by any client application for jboss. , for example a swing application that needs to commnicarte with a remote JBoss instance would need to have the jar files in this directory in its classpath or it will not be able to communicate correctly. jboss/common/lib – this folder is meant to hold jar files that should be made available to all JBoss instances. Jar files global to all applications go here. jboss/lib – this folder holds all the jar files used in order for the server to run correctly. jboss/lib/endorsed – this folder holds all the endorsed libs that jboss uses where other implementations can be used to override. Xalan implementations other than the default go here if you want to override with a newer version. jboss/server/<configured instance>/lib – this is where you put any instance specific jar files. The most easy pitfalls include more than one library being loaded, but of a different version. Which one gets loaded if there is more than one? The answer depends on the strategy you used in your setup, and figuring out the best strategy for your particular application(s) is paramount to minimizing this risk. One strategy of minimizing the immediate class loading problem while loading the third party jar files is to package all your third party libraries in the right lib directory for your war or ear file to make it a portable and completely self contained application. Cons: It inflates the server startup time or deployment time. Second strategy is to put third party application jar file inside (jboss/server/<configured instance>/lib) folder. Comparatively efficient than the strategy 1. Cons: Deployable artifact is no longer completely self contained. Que: What happens if you have more than one library, say one in your war file, and another one in the instance lib, which one gets used by your code? Ans:It turns out that the order in which the classes are loaded matters and is the determining factor. The server global directory loads before the instance specific lib, and the instance specific lib loads before your deployable artifacts and their libraries. So basically, the more global libraries will outweigh the artifact local libraries. A java.lang.ClassCastException results whenever an attempt is made to cast an instance to an incompatible type. A simple example is trying to obtain a String from a List into which a URL was placed: ArrayList array = new ArrayList(); array.add(new URL("file:/tmp")); String url = (String) array.get(0); java.lang.ClassCastException: java.net.URL at org.jboss.book.jmx.ex0.ExCCEa.main(Ex1CCE.java:16) Consider the case of a JAR being loaded by different class loaders. Although the classes loaded through each class loader are identical in terms of the bytecode, they are completely different types as viewed by the Java type system. Usually occurs when redeploying an application to which other applications are holding references to classes from the redeployed application. For example, a standalone WAR accessing an EJB. If you are redeploying an application, all dependent applications must flush their class references. Typically this requires that the dependent applications themselves be redeployed. Remedy would be to isolating the dependencies. A java.lang.IllegalAccessException is thrown when one attempts to access a method or member that visibility qualifiers do not allow. Typical examples are attempting to access private or protected methods or instance variables. Another common example is accessing package protected methods or members from a class that appears to be in the correct package. An example of how this can happen in practice is to include the same classes in two different SAR deployments. If classes in the deployment have a package protected relationship, users of the SAR service may end up loading one class from SAR class loading at one point, and then load another class from the second SAR at a later time. If the two classes in question have a protected access relationship an IllegalAccessError will result. The solution is to either include the classes in a separate jar that is referenced by the SARs, or to combine the SARs into a single deployment. This can either be a single SAR, or an EAR that includes both SARs. A class not found exception results when the following conditions exist and can be corrected by the following actions: The class is not visible on the logical classpath of the context class loader. Remedy: If the JAR file is not in the list, the class likely is not in the logical class path, not readable or an alternate class is already loaded. Move the class to a location that enables it to be loaded. The application incorrectly uses a class loader API. The class not found is not in the logical class path of the class loader associated with the current thread. The logical classpath is the accumulation of all classpaths searched when a load operation is invoked on a class loader. The application may be incorrectly using the class loader application programming interface (API). For example, the class name is incorrect, the class is not visible on the logical classpath of that class loader, or the wrong class loader was engaged. Remedy: Determine whether the class exists and whether the application is properly using the class loader API A dependent class is not visible. Occurs when the dependency classes are not visible. Remedy: Make sure that all the dependent jars / classes are loaded. Process of making the libraries used by your deployment localized, superseding the global libraries with what’s packaged in the artifact. If you want to deploy multiple versions of an application you need to use Deployment Based Scoping. With deployment based scoping, each deployment creates its own class loader repository with the help of UnifiedLoaderRepository. LoaderRepository:- This is an MBean that contains operations to display class and package information. The default repository is located under a standard JMX name of JMImplementation:name=Default,service=LoaderRepository The deployment scope class is very specific to the JBoss Application Server and hence the entry goes into the Jboss Specific Deployment Descriptor. For Ear files you will need to add an entry to your jboss-app.xml: <jboss-app> <loader-repository> com.example:archive=name-of-your-deployable-artifact.ear <loader-repository-config> java2ParentDelegation=false </loader-repository-config> </loader-repository> </jboss-app> For War files you will need to add an entry to your jboss-web.xml file: <jboss-web> <class-loading java2ClassLoadingCompliance="false"> <loader-repository> com.example:archive=name-of-your-deployable-artifact.war <loader-repository-config> java2ParentDelegation=false </loader-repository-config> </loader-repository> </class-loading> </jboss-web> Debugging class loading issues comes down to finding out where a class was loaded from. JBoss provides an utility class “org.jboss.util.Debug” to get a detailed information about the classes loaded and the classloader. Beyond that it may be useful to view the details of classes being loaded into the JBoss server. You can enable verbose logging of the JBoss class loading layer using a Log4j configuration fragment. <appender name="UCL" class="org.apache.log4j.FileAppender"> <param name="File" value="${jboss.server.home.dir}/log/ucl.log"/> <param name="Append" value="false"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%r,%c{1},%t] %m%n"/> </layout> </appender> <category name="org.jboss.mx.loading" additivity="false"> <priority value="TRACE" class="org.jboss.logging.XLevel"/> <appender-ref ref="UCL"/> </category> Note: This configuration snippet would generate a log file containing the trace for the classes loaded and can be used for trouble shooting. Specifying Isolation For .ear files, in your jboss-app.xml, add the following descriptor fragment construct to enable scoped class loading: <jboss-app> <loader-repository>com.example:archive=unique-archive-name </jboss-app> </loader-repository> For .war files, in your jboss-web.xml, the following template applies: <jboss-web> <class-loading> <loader-repository>com.example:archive=unique-archive-name</loader-repository> </class-loading> </jboss-web>