Changeset 29496

Show
Ignore:
Timestamp:
01/22/08 04:34:42 (11 months ago)
Author:
onazarov
Message:

JBoss over HTTP customization guide added

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • doc/nuxeo-book/trunk/src/docbook/developer-guide/index.xml

    r28382 r29496  
    1 <?xml version="1.0" encoding="UTF-8"?> 
     1<?xml version="1.0" encoding="UTF-8"?> 
    22<appendix version="5.0" xml:id="dev-environment-installation" 
    3          xmlns="http://docbook.org/ns/docbook" 
    4          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    5          xmlns:xlink="http://www.w3.org/1999/xlink" 
    6          xmlns:xi="http://www.w3.org/2001/XInclude" 
    7          xmlns:svg="http://www.w3.org/2000/svg" 
    8          xmlns:ns="http://docbook.org/ns/docbook" 
    9          xmlns:mml="http://www.w3.org/1998/Math/MathML" 
    10          xmlns:html="http://www.w3.org/1999/xhtml"> 
     3          xmlns="http://docbook.org/ns/docbook" 
     4          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     5          xmlns:xlink="http://www.w3.org/1999/xlink" 
     6          xmlns:xi="http://www.w3.org/2001/XInclude" 
     7          xmlns:svg="http://www.w3.org/2000/svg" 
     8          xmlns:ns="http://docbook.org/ns/docbook" 
     9          xmlns:mml="http://www.w3.org/1998/Math/MathML" 
     10          xmlns:html="http://www.w3.org/1999/xhtml"> 
    1111  <info> 
    1212    <title>Detailed Development Software Installation Instructions</title> 
    1313  </info> 
    1414 
    15   <para>This chapter is provided to help you install the software needed to work on your Nuxeo projects.</para> 
    16    
    17   <para>[TODO: refactor this chapter as in many cases, the packages may be installed using some package management system (for instance on Mac OS: <command>port install apache-ant maven2</command>).]</para> 
     15  <para>This chapter is provided to help you install the software needed to 
     16  work on your Nuxeo projects.</para> 
     17 
     18  <para>[TODO: refactor this chapter as in many cases, the packages may be 
     19  installed using some package management system (for instance on Mac OS: 
     20  <command>port install apache-ant maven2</command>).]</para> 
    1821 
    1922  <section> 
     
    3437    <warning> 
    3538      <para>Nuxeo EP 5 doesn't currently compile under Java 6 (the 1.6.0 JDK 
    36         from Sun). Even if it did, it is not clear that JBoss, the application 
    37         server we are targeting, works under Java 6.</para> 
     39      from Sun). Even if it did, it is not clear that JBoss, the application 
     40      server we are targeting, works under Java 6.</para> 
    3841    </warning> 
    3942 
     
    109112        <title>Windows</title> 
    110113 
    111         <para>Follow these instructions: 
    112           <itemizedlist> 
     114        <para>Follow these instructions: <itemizedlist> 
    113115            <listitem> 
    114116              <para>type 'windows' +'pause'</para> 
     
    140142        <title>Linux</title> 
    141143 
    142         <para>In your <filename>.bashrc</filename> (or <filename>.zshrc</filename>, ...) add something like: 
    143         <programlisting>export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun</programlisting></para> 
     144        <para>In your <filename>.bashrc</filename> (or 
     145        <filename>.zshrc</filename>, ...) add something like: <programlisting>export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun</programlisting></para> 
    144146      </section> 
    145147 
     
    147149        <title>Mac OS</title> 
    148150 
    149         <para>Under Mac OS X, if you have properly installed a JDK (XXX: check how), you will need to put in your your <filename>.bashrc</filename> (or <filename>.zshrc</filename>, ...) add something like: 
     151        <para>Under Mac OS X, if you have properly installed a JDK (XXX: check 
     152        how), you will need to put in your your <filename>.bashrc</filename> 
     153        (or <filename>.zshrc</filename>, ...) add something like: 
    150154        <programlisting>export JAVA_HOME=/Library/Java/Home</programlisting></para> 
    151155      </section> 
    152  
    153156    </section> 
    154157  </section> 
     
    173176    <para>For Windows:</para> 
    174177 
    175     <para> 
    176       <itemizedlist> 
     178    <para><itemizedlist> 
    177179        <listitem> 
    178180          <para>type 'windows' +'pause'</para> 
     
    200202          window.</para> 
    201203        </listitem> 
    202       </itemizedlist> 
    203  
    204       You can then check that your installation is correct by typing: 
    205       <programlisting>ant -version</programlisting> 
    206     </para> 
     204      </itemizedlist> You can then check that your installation is correct by 
     205    typing: <programlisting>ant -version</programlisting></para> 
    207206  </section> 
    208207 
     
    245244      </blockquote> 
    246245 
    247       <para>Nuxeo holds a Maven repository here: <uri>http://archiva.nuxeo.org/archiva/</uri>.</para> 
     246      <para>Nuxeo holds a Maven repository here: 
     247      <uri>http://archiva.nuxeo.org/archiva/</uri>.</para> 
    248248    </section> 
    249249 
     
    256256      and then untar the archive in <literal>/opt</literal> (for 
    257257      instance).</para> 
    258        
    259       <para>We recommend that you use the latest version of Maven (2.0.7 at the time of this writing).</para> 
    260  
    261       <para>As usual, you have to put the <literal>mvn</literal> executable into the path of your 
    262       environment (cf. Ant)</para> 
     258 
     259      <para>We recommend that you use the latest version of Maven (2.0.7 at 
     260      the time of this writing).</para> 
     261 
     262      <para>As usual, you have to put the <literal>mvn</literal> executable 
     263      into the path of your environment (cf. Ant)</para> 
    263264 
    264265      <para>Then add the <literal>bin/</literal> subdir in your 
     
    266267      <filename>.bashrc</filename>: <programlisting>export PATH=/opt/maven-2.0.7/bin:$PATH</programlisting></para> 
    267268 
    268       <para>In a new shell you can then test: 
    269         <programlisting>$ mvn --version 
    270 Maven version: 2.0.7</programlisting> 
    271       </para> 
     269      <para>In a new shell you can then test: <programlisting>$ mvn --version 
     270Maven version: 2.0.7</programlisting></para> 
    272271    </section> 
    273272  </section> 
     
    281280    with the latest version of the <link 
    282281    xlink:href="http://sourceforge.net/project/showfiles.php?group_id=22866&amp;package_id=193295">JEMS 
    283     installer</link>: 
    284      
    285     <programlisting>$ sudo java -jar jems-installer-1.2.0.GA.jar</programlisting></para> 
    286  
    287     <para>While executing the installation wizard, you must select <literal>ejb3</literal> install. You can 
    288     leave all other parameters to their default values.</para> 
     282    installer</link>: <programlisting>$ sudo java -jar jems-installer-1.2.0.GA.jar</programlisting></para> 
     283 
     284    <para>While executing the installation wizard, you must select 
     285    <literal>ejb3</literal> install. You can leave all other parameters to 
     286    their default values.</para> 
    289287 
    290288    <para>You would get PermGenSpace errors if you run JBoss without this 
    291     configuration: 
    292       <itemizedlist> 
     289    configuration: <itemizedlist> 
    293290        <listitem> 
    294291          <para>Linux:</para> 
     
    314311        </listitem> 
    315312      </itemizedlist></para> 
     313 
     314    <section> 
     315      <title>JBoss AS listening ports customization</title> 
     316 
     317      <para>The common task for JBoss users is making it to communicate over a 
     318      single HTTP server. This is quite useful for network administration, 
     319      making it easier to go through firewalls. This section describes the 
     320      necessary steps to make JBoss communicate primarily over HTTP</para> 
     321 
     322      <section> 
     323        <title>Tomcat Web server</title> 
     324 
     325        <para>JBoss is shipped with built-in Tomcat web server. This server is 
     326        configured in 'deploy/jbossweb-tomcat55.sar/server.xml' By default 
     327        only two connectors are enabled: HTTP connector (port 8080) and AJP 
     328        connector (port 8009). Generally speaking you need only one of them. 
     329        The former connector is needed if standalone HTTP server built in 
     330        JBoss is used. You may want to configure it to listen the default HTTP 
     331        port 80. The latter connector is needed only if you want to couple 
     332        JBoss server with external web server like Apache, in this case it is 
     333        reasonable, for security issues to change the binding address to 
     334        'localhost' (of course if Apache runs on the same host).</para> 
     335      </section> 
     336 
     337      <section> 
     338        <title>HTTP invoker web application</title> 
     339 
     340        <para>The JBoss default configuration deploys a special service that 
     341        can be used to expose different JBoss services in the HTTP server. It 
     342        is located in 'deploy/http-invoker.sar'. The configuration file 
     343        'deploy/http-invoker.sar/META-INF/jboss-service.xml' may be tweaked to 
     344        tune the AS to specific needs. By default the service provides HTTP 
     345        invoker MBean for EJB ('jboss:service=invoker,type=http') and two HTTP 
     346        proxy MBeans that marshal the requests to the Naming service MBean 
     347        ('jboss:service=invoker,type=http,target=Naming' and 
     348        'jboss:service=invoker,type=http,target=Naming,readonly=true'). If you 
     349        need to provide HTTP interface to another MBeans, you also may specify 
     350        the proxy services in 
     351        'deploy\http-invoker.sar\META-INF\jboss-service.xml'. For instance the 
     352        SRP service for JBoss authentication may be exposed here.</para> 
     353 
     354        <para>The service also deploys web application 
     355        'deploy/http-invoker.sar/invoker.war', that configures the servlets 
     356        that convert HTTP requests into invocation of MBeans/EJB methods. If 
     357        you add HTTP proxies to MBeans, you may need to add servlets that 
     358        handle the corresponding URI.</para> 
     359 
     360        <para>Important note. If HTTPS protocol is used the configuration 
     361        should not use the default host name because the virtual host name 
     362        used in the URL (say 'www.nuxeo.org') and exposed in SSL certificates 
     363        usually differs from the computer name where JBoss is running. To 
     364        accomplish this get rid of the following attributes: InvokerURLPrefix, 
     365        InvokerURLSuffix, UseHostName, replacing them with a single InvokerURL 
     366        attribute, like this:</para> 
     367 
     368        <programlisting>&lt;mbean code="org.jboss.invocation.http.server.HttpProxyFactory" 
     369   name="jboss:service=invoker,type=https,target=Naming"&gt; 
     370   &lt;!-- Compose the invoker URL from the cluster node address --&gt; 
     371   &lt;attribute name="InvokerURL"&gt; 
     372      https://www.nuxeo.org/invoker/JMXInvokerServlet 
     373   &lt;/attribute&gt; 
     374   &lt;attribute name="ExportedInterface"&gt; 
     375      org.jnp.interfaces.Naming 
     376   &lt;/attribute&gt; 
     377   &lt;attribute name="JndiName"&gt;&lt;/attribute&gt; 
     378   &lt;attribute name="ClientInterceptors"&gt; 
     379   &lt;interceptors&gt; 
     380      &lt;interceptor&gt;org.jboss.proxy.ClientMethodInterceptor&lt;/interceptor&gt; 
     381      &lt;interceptor&gt;org.jboss.proxy.SecurityInterceptor&lt;/interceptor&gt; 
     382      &lt;interceptor&gt;org.jboss.naming.interceptors.ExceptionInterceptor&lt;/interceptor&gt; 
     383      &lt;interceptor&gt;org.jboss.invocation.InvokerInterceptor&lt;/interceptor&gt; 
     384   &lt;/interceptors&gt; 
     385   &lt;/attribute&gt; 
     386   &lt;depends&gt;jboss:service=invoker,type=https&lt;/depends&gt; 
     387&lt;/mbean&gt; 
     388&lt;!-- The rest MBeans should also use InvokerURL attribute only, 
     389   make sure you specify the right host name 
     390--&gt;</programlisting> 
     391      </section> 
     392 
     393      <section> 
     394        <title>JNDI service</title> 
     395 
     396        <para>This is the core service of JBoss and should never be disabled. 
     397        Nevertheless this service does not need own listening port 
     398        (1099,1098), so just change the '1099' to '-1':</para> 
     399 
     400        <programlisting>&lt;mbean code="org.jboss.naming.NamingService" 
     401   name="jboss:service=Naming" 
     402   xmbean-dd="resource:xmdesc/NamingService-xmbean.xml"&gt; 
     403   &lt;!-- The call by value mode. true if all lookups are unmarshalled using 
     404   the caller's TCL, false if in VM lookups return the value by reference. 
     405   --&gt; 
     406   &lt;attribute name="CallByValue"&gt;false&lt;/attribute&gt; 
     407   &lt;!-- The listening port for the bootstrap JNP service. Set this to -1 
     408     to run the NamingService without the JNP invoker listening port. 
     409   --&gt; 
     410   &lt;attribute name="Port"&gt;-1&lt;/attribute&gt; 
     411   &lt;!-- The bootstrap JNP server bind address. This also sets the default 
     412   RMI service bind address. Empty == all addresses, use localhost to hide this from  
     413   network 
     414    --&gt; 
     415   &lt;attribute name="BindAddress"&gt;localhost&lt;/attribute&gt; 
     416   &lt;!-- The port of the RMI naming service, 0 == anonymous, you cannot use -1 here --&gt; 
     417   &lt;attribute name="RmiPort"&gt;1098&lt;/attribute&gt; 
     418   &lt;!-- The RMI service bind address. Empty == all addresses, use localhost to hide this from  
     419   network 
     420    --&gt; 
     421   &lt;attribute name="RmiBindAddress"&gt;localhost&lt;/attribute&gt; 
     422   &lt;!-- The thread pool service used to control the bootstrap lookups --&gt; 
     423   &lt;depends optional-attribute-name="LookupPool" 
     424      proxy-type="attribute"&gt;jboss.system:service=ThreadPool&lt;/depends&gt; 
     425&lt;/mbean&gt;</programlisting> 
     426      </section> 
     427 
     428      <section> 
     429        <title>Default JBoss EJB invokers</title> 
     430 
     431        <para>You may deinstall the JRMP and Pooled invokers completely. Just 
     432        comment out the MBeans that provide the corresponding services in 
     433        'conf/jboss-service.xml'.</para> 
     434 
     435        <para>Important note. The JBoss specifies the invokers for EJB in 
     436        'conf/standardjboss.xml' file. The default is 
     437        'jboss:service=invoker,type=jrmp' invoker. To change it to HTTP 
     438        invoker you need to add invoker bindings for all EJB types deployed in 
     439        your applications. Generally it means you need to copy all 
     440        "*-rmi-invoker" bindings into "*-http-invoker" bindings, replacing 
     441        "&lt;invoker-mbean&gt;jboss:service=invoker,type=jrmp&lt;/invoker-mbean&gt;" 
     442        with 
     443        "&lt;invoker-mbean&gt;jboss:service=invoker,type=http&lt;/invoker-mbean&gt;" 
     444        for the new bindings. Also you will need to make the HTTP invoker 
     445        default for all EJB container configurations replacing 
     446        "&lt;invoker-proxy-binding-name&gt;*-rmi-invoker&lt;/invoker-proxy-binding-name&gt;" 
     447        with 
     448        "&lt;invoker-proxy-binding-name&gt;*-http-invoker&lt;/invoker-proxy-binding-name&gt;" 
     449        correspondingly.</para> 
     450 
     451        <para>The easiest (but probably not the right) way for JBoss 4.0.x is 
     452        to replace the string 'jboss:service=invoker,type=jrmp' with 
     453        'jboss:service=invoker,type=http' in this file by any text editor. It 
     454        may be not correct if you want to mix both invokers for your 
     455        EJBs.</para> 
     456      </section> 
     457 
     458      <section> 
     459        <title>JBoss EJB3 invoker</title> 
     460 
     461        <para>The EJB3 invoker which is specified in 
     462        'deploy/ejb3.deployer/META-INF/jboss-service.xml' uses JBoss remoting 
     463        mechanism. By default it is bound to socket with a connector listening 
     464        TCP/IP port 3873. This should be changed to the servlet 
     465        locator:</para> 
     466 
     467        <programlisting>&lt;mbean code="org.jboss.remoting.transport.Connector" 
     468       name="jboss.remoting:type=Connector,name=DefaultEjb3Connector,handler=ejb3"&gt; 
     469   &lt;depends&gt;jboss.aop:service=AspectDeployer&lt;/depends&gt; 
     470   &lt;attribute name="InvokerLocator"&gt; 
     471      servlet://${jboss.bind.address}/invoker/Ejb3InvokerServlet 
     472   &lt;/attribute&gt; 
     473   &lt;attribute name="Configuration"&gt; 
     474      &lt;handlers&gt; 
     475         &lt;handler subsystem="AOP"&gt;org.jboss.aspects.remoting.AOPRemotingInvocationHandler&lt;/handler&gt; 
     476      &lt;/handlers&gt; 
     477   &lt;/attribute&gt; 
     478&lt;/mbean&gt;</programlisting> 
     479 
     480        <para>The corresponding servlet should be added to invoker web 
     481        application descriptor 
     482        ('http-invoker.sar/invoker.war/WEB-INF/web.xml'):</para> 
     483 
     484        <programlisting>&lt;servlet&gt; 
     485   &lt;servlet-name&gt;Ejb3InvokerServlet&lt;/servlet-name&gt; 
     486   &lt;description&gt; 
     487      The ServerInvokerServlet receives requests via HTTP protocol 
     488      from within a web container and passes it onto the 
     489      ServletServerInvoker for processing. 
     490   &lt;/description&gt; 
     491   &lt;servlet-class&gt; 
     492      org.jboss.remoting.transport.servlet.web.ServerInvokerServlet 
     493   &lt;/servlet-class&gt; 
     494   &lt;init-param&gt; 
     495      &lt;param-name&gt;locatorUrl&lt;/param-name&gt; 
     496      &lt;param-value&gt; 
     497         servlet://${jboss.bind.address}/invoker/Ejb3InvokerServlet 
     498      &lt;/param-value&gt; 
     499      &lt;description&gt; 
     500         The servlet server invoker locator url 
     501      &lt;/description&gt; 
     502   &lt;/init-param&gt; 
     503   &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; 
     504&lt;/servlet&gt; 
     505&lt;servlet-mapping&gt; 
     506   &lt;servlet-name&gt;Ejb3InvokerServlet&lt;/servlet-name&gt; 
     507   &lt;url-pattern&gt;/Ejb3InvokerServlet/*&lt;/url-pattern&gt; 
     508&lt;/servlet-mapping&gt;</programlisting> 
     509      </section> 
     510    </section> 
     511 
     512    <section> 
     513      <title>Affected JBoss services</title> 
     514 
     515      <para>As JRMP invoker is used in many other JBoss services, so it should 
     516      be replaced. The affected MBeans are 
     517      "jboss:service=ClientUserTransaction" (conf/jboss-service.xml), 
     518      "jboss.jmx:type=adaptor,name=Invoker,protocol=jrmp,service=proxyFactory".</para> 
     519 
     520      <section> 
     521        <title>Client User Transaction</title> 
     522 
     523        <para>The Client User Transaction service depends on two JRMP Proxy 
     524        Factories described in the nested MBeans. Every JRMP proxy factory 
     525        should be replaced with HTTP proxy factory:</para> 
     526 
     527        <programlisting>&lt;mbean 
     528   code="org.jboss.tm.usertx.server.ClientUserTransactionService" 
     529   name="jboss:service=ClientUserTransaction" 
     530   xmbean-dd="resource:xmdesc/ClientUserTransaction-xmbean.xml"&gt; 
     531  &lt;depends&gt; 
     532    &lt;mbean code="org.jboss.invocation.http.server.HttpProxyFactory" 
     533         name="jboss:service=proxyFactory,target=ClientUserTransactionFactory"&gt; 
     534      &lt;attribute name="InvokerName"&gt;jboss:service=invoker,type=http&lt;/attribute&gt; 
     535      &lt;attribute name="JndiName"&gt;UserTransactionSessionFactory&lt;/attribute&gt; 
     536      &lt;attribute name="ExportedInterface"&gt; 
     537        org.jboss.tm.usertx.interfaces.UserTransactionSessionFactory 
     538      &lt;/attribute&gt; 
     539      &lt;attribute name="ClientInterceptors"&gt; 
     540        &lt;interceptors&gt; 
     541          &lt;interceptor&gt;org.jboss.proxy.ClientMethodInterceptor&lt;/interceptor&gt; 
     542          &lt;interceptor&gt;org.jboss.invocation.InvokerInterceptor&lt;/interceptor&gt; 
     543        &lt;/interceptors&gt; 
     544      &lt;/attribute&gt; 
     545      &lt;depends&gt;jboss:service=invoker,type=http&lt;/depends&gt; 
     546    &lt;/mbean&gt; 
     547  &lt;/depends&gt; 
     548  &lt;depends optional-attribute-name="TxProxyName"&gt; 
     549    &lt;mbean code="org.jboss.invocation.http.server.HttpProxyFactory" 
     550         name="jboss:service=proxyFactory,target=ClientUserTransaction"&gt; 
     551      &lt;attribute name="InvokerName"&gt;jboss:service=invoker,type=http&lt;/attribute&gt; 
     552      &lt;attribute name="JndiName"&gt;&lt;/attribute&gt; 
     553      &lt;attribute name="ExportedInterface"&gt; 
     554        org.jboss.tm.usertx.interfaces.UserTransactionSession 
     555      &lt;/attribute&gt; 
     556      &lt;attribute name="ClientInterceptors"&gt; 
     557        &lt;interceptors&gt; 
     558          &lt;interceptor&gt;org.jboss.proxy.ClientMethodInterceptor&lt;/interceptor&gt; 
     559          &lt;interceptor&gt;org.jboss.invocation.InvokerInterceptor&lt;/interceptor&gt; 
     560        &lt;/interceptors&gt; 
     561      &lt;/attribute&gt; 
     562      &lt;depends&gt;jboss:service=invoker,type=http&lt;/depends&gt; 
     563    &lt;/mbean&gt; 
     564  &lt;/depends&gt; 
     565&lt;/mbean&gt;</programlisting> 
     566 
     567        <para>Note that JRMP Proxy factory attributes differ from attributes 
     568        of HTTP proxy factory.</para> 
     569      </section> 
     570 
     571      <section> 
     572        <title>JMX adaptor</title> 
     573 
     574        <para>The JMX adaptor is adapted for HTTP as following 
     575        ('deploy/jmx-invoker-service.xml'):</para> 
     576 
     577        <programlisting>&lt;mbean code="org.jboss.invocation.http.server.HttpProxyFactory" 
     578       name="jboss.jmx:type=adaptor,name=Invoker,protocol=http,service=proxyFactory"&gt; 
     579  &lt;attribute name="InvokerURL"&gt;https://www.nuxeo.org/invoker/JMXInvokerServlet&lt;/attribute&gt; 
     580  &lt;depends optional-attribute-name="InvokerName"&gt;jboss.jmx:type=adaptor,name=Invoker&lt;/depends&gt; 
     581  &lt;attribute name="ExportedInterface"&gt;org.jboss.jmx.adaptor.rmi.RMIAdaptor&lt;/attribute&gt; 
     582  &lt;attribute name="JndiName"&gt;jmx/invoker/HttpAdaptor&lt;/attribute&gt; 
     583&lt;/mbean&gt;</programlisting> 
     584 
     585        <para>and ('deploy/console-mgr.sar/META-INF/jboss-service.xml'):</para> 
     586 
     587        <programlisting>&lt;mbean code="org.jboss.console.manager.PluginManager" 
     588       name="jboss.admin:service=PluginManager"&gt; 
     589  &lt;depends&gt;jboss.jmx:type=adaptor,name=Invoker,protocol=http,service=proxyFactory&lt;/depends&gt; 
     590  &lt;!-- the rest stays intact --&gt; 
     591&lt;/mbean&gt;</programlisting> 
     592      </section> 
     593 
     594      <section> 
     595        <title>Datasource adaptors</title> 
     596 
     597        <para>You need to set the invoker explicitly for all deployed data 
     598        sources. The element &lt;jmx-invoker-name&gt; should be added to all 
     599        &lt;local-tx-datasource&gt; and &lt;xa-datasource&gt; elements. Otherwise the server will 
     600        complain about missing JRMP invoker which is used by default:</para> 
     601 
     602        <programlisting>&lt;datasources&gt; 
     603        ... 
     604   &lt;local-tx-datasource&gt; 
     605      &lt;!-- specify explicitly the invoker to use --&gt; 
     606      &lt;jmx-invoker-name&gt;jboss:service=invoker,type=https&lt;/jmx-invoker-name&gt; 
     607      &lt;!-- the rest stays intact --&gt; 
     608               ... 
     609   &lt;/local-tx-datasource&gt; 
     610        ... 
     611&lt;/datasources&gt;</programlisting> 
     612      </section> 
     613    </section> 
    316614  </section> 
    317    
     615 
    318616  <section> 
    319617    <title>Installing a Subversion client</title> 
     
    345643      xlink:href="http://subversion.tigris.org/project_packages.html">For MS 
    346644      Windows, we recommend to use the <link 
    347       xlink:href="http://tortoisesvn.tigris.org/">TortoiseSVN</link> Subversion client. You can 
    348       also directly use the Subversion command-line client from <link 
    349       xlink:href="http://subversion.tigris.org/">Subversion 
     645      xlink:href="http://tortoisesvn.tigris.org/">TortoiseSVN</link> 
     646      Subversion client. You can also directly use the Subversion command-line 
     647      client from <link xlink:href="http://subversion.tigris.org/">Subversion 
    350648      website</link>.</para> 
    351649    </section> 
     
    354652  <section> 
    355653    <title>Chapter Key Point</title> 
    356      
     654 
    357655    <para>In this chapter, we learned:</para> 
    358      
     656 
    359657    <itemizedlist> 
    360658      <listitem> 
    361         <para>how to install a Java development environment (JDK) on your machine</para> 
     659        <para>how to install a Java development environment (JDK) on your 
     660        machine</para> 
    362661      </listitem> 
     662 
    363663      <listitem> 
    364         <para>how to install Ant and Maven, two mandatory tools for building and deploying your own projects on top of the Nuxeo platform</para> 
     664        <para>how to install Ant and Maven, two mandatory tools for building 
     665        and deploying your own projects on top of the Nuxeo platform</para> 
    365666      </listitem> 
     667 
    366668      <listitem> 
    367         <para>how to install the JBoss AS 4 application server that will act as a container for the Nuxeo application</para> 
     669        <para>how to install the JBoss AS 4 application server that will act 
     670        as a container for the Nuxeo application</para> 
    368671      </listitem> 
     672 
    369673      <listitem> 
    370         <para>how to install a Subversion client, which is not mandatary anymore (but may prove useful for you own sake)</para> 
     674        <para>how to install a Subversion client, which is not mandatary 
     675        anymore (but may prove useful for you own sake)</para> 
    371676      </listitem> 
    372677    </itemizedlist> 
    373678  </section> 
    374    
    375679</appendix>