<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MyArch &#187; WebSphere</title>
	<atom:link href="http://myarch.com/category/websphere/feed" rel="self" type="application/rss+xml" />
	<link>http://myarch.com</link>
	<description>Builds and bytes</description>
	<lastBuildDate>Mon, 30 Jan 2012 01:22:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>DataPower Buddy 2.3 Release</title>
		<link>http://myarch.com/dpbuddy-2-3-release-announcement</link>
		<comments>http://myarch.com/dpbuddy-2-3-release-announcement#comments</comments>
		<pubDate>Sat, 28 Jan 2012 04:48:00 +0000</pubDate>
		<dc:creator>Alexander Ananiev</dc:creator>
				<category><![CDATA[DataPower]]></category>
		<category><![CDATA[WebSphere]]></category>
		<category><![CDATA[XML Appliances]]></category>
		<category><![CDATA[dpbuddy]]></category>

		<guid isPermaLink="false">http://myarch.com/?p=852</guid>
		<description><![CDATA[You can find DPBuddy 2.3 announcement here.]]></description>
			<content:encoded><![CDATA[<p>You can find <span class="caps">DPB</span>uddy 2.3 announcement <a href="/dpbuddy-2-3-release">here</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://myarch.com/dpbuddy-2-3-release-announcement/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Security Hardening of WebSphere Application Server Installations</title>
		<link>http://myarch.com/was-security-hardening</link>
		<comments>http://myarch.com/was-security-hardening#comments</comments>
		<pubDate>Sat, 15 Oct 2011 17:53:23 +0000</pubDate>
		<dc:creator>Alexander Ananiev</dc:creator>
				<category><![CDATA[WebSphere]]></category>
		<category><![CDATA[WebSphere Application Server Administration]]></category>

		<guid isPermaLink="false">http://myarch.com/?p=825</guid>
		<description><![CDATA[It is a known fact that an out of the box a WAS installation with security enabled is not entirely secure. There is a number of steps that has to be taken in order to "harden" the installation. Most of the steps are documented in the WebSphere hardening guide, which should be closely studied and [...]]]></description>
			<content:encoded><![CDATA[<p>It is a known fact that an out of the box a <span class="caps">WAS </span>installation with security enabled is not entirely secure. There is a number of steps that has to be taken in order to "harden" the installation. Most of the steps are documented in the <a href="http://www.ibm.com/developerworks/websphere/techjournal/1004_botzum/1004_botzum.html?ca=drs-">WebSphere hardening guide</a>, which should be closely studied and followed by any <span class="caps">WAS </span>administrator or developer.  The hardening guide, however, is a little light on the specifics regarding how to secure <span class="caps">WAS </span>at the OS level.  For example, hardening should normally include changing file and directory permissions to restrict access to sensitive configuration files.</p>

<p>Why bother hardening the installation at the OS level? This helps defend against  external threats, i.e., a server hosting the installation is  compromised and against internal threats, i.e., an unauthorized access from inside. </p>

<p>Here are some of the things you can do to secure your installation on a Unix/Linux platform:</p>


<ul>
<li>If you installed <span class="caps">WAS </span>as a non-root account, make sure that this account is not part of the "users" group. Create a separate group for all administrators,  say "wasadmins".  If you're doing this the post-install, make sure that you changed the ownership of  all <span class="caps">WAS </span>files and profiles. To do that,  bring all <span class="caps">WAS </span>processes down and run <code>chgrp -R wasadmins $WAS_INSTALL_ROOT</code>.  </li>
<li>Refrain from running <span class="caps">WAS </span>using root. There is no reason to do it on Unix/Linux, unless you absolutely have to use low ports. Yes, you can use sudo to tighten down access to root, but it is safer just to stay away from it. You can actually install <span class="caps">WAS </span>using root so it can be properly registered with the <span class="caps">OS, </span>but you can later change the installation to be owned by a non-root account. </li>
<li>Following the principle of least privilege, remove read access from "others". Why do you need to do it? There are many sensitive files that are part of <span class="caps">WAS </span>install, including files containing encoded passwords (see below). It's better to err on a side of caution and disallow general read access altogether. We should revoke execute access as well. On the other hand, we may want to grant write/execute to all members of wasadmins groups, assuming the membership in this group is going to be tightly controlled:<br />
<code>chmod -R 770 $WAS_INSTALL_ROOT</code></li>
<li>You may want to allow access to logs to "others" so that developers can view logs. Since we just revoked read permissions from the root <span class="caps">WAS </span>install directory and from all profile directories, you can't just "chmod" the "logs" directory.  You need to redirect logs to some other directory which is not under "$WAS_INSTLALL_ROOT" or profile roots.  In order to do it, change <span class="caps">LOG</span>_ROOT <span class="caps">WAS </span>variable. You can do it from the console (Environment/WebSphere variables). By default, "LOG_ROOT" is defined at a node level. If the location is going to be the same on all nodes (which it should), just create <span class="caps">LOG</span>_ROOT at the cell level. You'll need to restart <span class="caps">WAS </span>servers after this. You can redirect logs to, say, /var/log/was.  Make sure that "wasadmin" system account has write permissions to this directory.</li>
<li>Do not allow login to the system account used to run <span class="caps">WAS.</span> You can read <a href=" http://www.puschitz.com/SecuringLinux.shtml#RestrictingDirectLoginAccessForSystemAndSharedAccounts">this guide</a> explaining how to do it for various login mechanisms. You also need to disable "sudo su wasadmin" and only allow sudo for the specific commands/scripts that are needed to run <span class="caps">WAS. </span> You will need to add something  like this to the sudoers file:<br />
<code>
%wasadmins         ALL=(wasadmin)  WAS_INSTLALL_ROOT/bin/,  PROFILE_ROOT/bin/ 
</code><br />
This configuration allows all member of "wasadmins" group to run commands from "bin" using "sudo -u", e.g.,  <code>sudo -u wasadmin ./startServer.sh server1</code>. <br />
You may relax this a little bit by allowing sudo access without having to enter password every time:<br />
<code>
%wasadmins         ALL=(wasadmin)  NOPASSWD: WAS_INSTLALL_ROOT/bin/,  PROFILE_ROOT/bin/
</code><br />
It's a bit of a pain having to run all commands via sudo (although, of course, it can be scripted), but it gives you complete audit trail of who did what in the environment. By the way, by default sudo logs via syslog, but you can redirect sudo's log into its own file by adding this directive in sudoers:  <br />
<code>
Defaults logfile=PATH_TO_LOG_FILE
</code></li>
<li>Secure "sensitive" files. As any <span class="caps">WAS </span>administrator knows, passwords stored in <span class="caps">WAS </span>are not really encrypted, they are just encoded, so they can be decoded pretty easily (there is a way to plug in custom encryption, but that's a different story).  Therefore, it is imperative to properly protect files containing encoded passwords.  To do that, we're going to revoke any access to these files from "wasadmins" group. That way, only the "wasadmin" system account (which we can't even login into) or root can read these files.  Encoded passwords are stored in "security.xml" and "wim/wimconfig.xml" (if you have <span class="caps">LDAP </span>configured). All these files reside under "$PROFILE_ROOT/config/cells/$CELL_NAME". "fileRegistry.xml" also contains passwords, although these passwords are properly encrypted.  <br />
You may also want to protect keystores (key.p12). Note that in addition to the cell key store, each node has its own keystore. You don't need to worry as much about trust stores (trust.p12), in fact it might be convenient to keep group-level access to trust stores so that administrators can modify them outside of <span class="caps">WAS </span>(e.g., by adding a signer cert using ikeyman). While you're on it, make sure that you don't use the default password (WebAS) for any of the keystores/truststores.<br />
To revoke group access to any of the files mentioned above, just run "chmod 600" on them, e.g., <code>chmod 600 security.xml</code>.  Note that you'll have to repeat it for each profile, including deployment manager and application server profiles (unless you have a standalone install). <br />
Node synchronization built into <span class="caps">WAS </span>fully supports changing permissions on config files. The changes will not disappear after node sync (provided you updated the DM profile).</li>
<li>If your environment has a <span class="caps">DMZ </span>utilizing <span class="caps">IHS, </span>make sure that you don't have <span class="caps">WAS </span>installation on the <span class="caps">DMZ </span>boxes. It is convenient to have node agents running on the <span class="caps">IHS </span>servers, so you can manage <span class="caps">IHS </span>from admin console, but, unfortunately, it is a security risk.  Deployment manager pushes all configuration files, including "security.xml" to all nodes, and we certainly don't want this file sitting in the <span class="caps">DMZ </span>(even with "600" permissions).</li>
<li>Repeat all changes on every server containing <span class="caps">WAS </span>installation. You may want to script them or, better yet, use a tool like <a href="http://puppetlabs.com/">Puppet</a> to automate OS-level configuration changes across multiple machines. For example, see <a href="http://projects.puppetlabs.com/projects/1/wiki/Centralized_Sudoers_Patterns">this guide</a> on how to centralize management of the sudoers file. </li>
</ul>




<p style="font-size:smaller">
This post is part of the <a href="/category/wasadmin">series on WebSphere Application Server administration</a>. Please <a href="/feed">subscribe to our blog</a> if you'd like to receive updates. <br />
</p>

<p style="font-size:smaller">
<b>Note:</b>  We offer <a href="/services/middleware-operations-services"> professional services  in the area of WebSphere architecture, implementation and operations</a>.  If you're looking for help with any of these tasks, please <a href="mailto:info@myarch.com"> let us know</a>.<br />
</p>]]></content:encoded>
			<wfw:commentRss>http://myarch.com/was-security-hardening/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WebSphere Application Server Tutorial for Developers &#8212; WAS in 5 Minutes</title>
		<link>http://myarch.com/websphere-application-server-for-developers-in-5-minutes-or-less</link>
		<comments>http://myarch.com/websphere-application-server-for-developers-in-5-minutes-or-less#comments</comments>
		<pubDate>Sun, 14 Aug 2011 23:48:43 +0000</pubDate>
		<dc:creator>Alexander Ananiev</dc:creator>
				<category><![CDATA[Developer productivity]]></category>
		<category><![CDATA[WebSphere]]></category>
		<category><![CDATA[WebSphere Application Server Administration]]></category>

		<guid isPermaLink="false">http://myarch.com/?p=746</guid>
		<description><![CDATA[If you're developing applications for WAS and you're new to it, this is what you need to know:



How to view the logs. Logs can be found under install_root/profiles/profile_name/logs/server_name. The default profile name is AppSrv01 and the default server name is server1. Example:/usr/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/server1. SystemOut.log is the file containing everything that was logged to standard out. Logs [...]]]></description>
			<content:encoded><![CDATA[<p>If you're developing applications for <span class="caps">WAS </span>and you're new to it, this is what you need to know:</p>


<ul>
<li><b>How to view the logs</b>. Logs can be found under <code>install_root/profiles/profile_name/logs/server_name</code>. The default profile name is AppSrv01 and the default server name is server1. Example:<code>/usr/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/server1</code>. SystemOut.log is the file containing everything that was logged to standard out. Logs can also be viewed from the admin console by navigating to <code>Troubleshooting/Logging and Tracing/server_name/Runtime</code>.</li>
<li><b>How to deploy an application</b>. In admin console, navigate to <code>Applications/Application Types/WebSphere enterprise applications</code>, click on "Install new application", select "Fast path", accept all the defaults except that on "step 2" make sure that you targeted correct servers (if you have multiple servers/clusters in your environment). Note you can deploy a <span class="caps">WAR </span>file directly, you don't have to build an <span class="caps">EAR.</span> In this case, make sure that you set a context root on "step 4" screen.</li>
<li><b>How to change context root of a Web application</b>. Go to <code>Applications/Application Types/WebSphere enterprise applications/application_name/Context Root For Web Modules</code> in the console. Re-start the application after the change.</li>
<li><b>How to change the order of classloaders</b>. If you're getting a <a href="/classnotfound">ClassNotFoundException</a> when you're starting the app, changing the order of classloaders is the first thing you may want to try. Go to <code>Applications/Application Types/WebSphere enterprise applications/application_name/Manage Modules/module_name</code> and make the appropriate selection in the "Class loader order" drop-down (this assumes you're doing it for a <span class="caps">WAR </span>module).</li>
<li><b>How to enable dynamic class reloading</b>. If you need to frequently update your deployed application (e.g., you use a local <span class="caps">WAS </span>installation for development), enabling dynamic reloading could be a huge time saver. Go to your application in the console, "Class loading and update detection", set "Override class reloading settings ..." and set polling interval to 2 seconds.  See <a href="/instant-was-redeploy">this post</a> for more details on how to configure your development environment to support class reloading.</li>
<li><b>How to find a host name and a port of the server</b>.  Go to <code>Server/Server Types/WebSphere application servers</code>. You'll find the host name in the Host Name column. To find a port, click on your server, and expand Ports. <code>WC_defaulthost</code> is the <span class="caps">HTTP </span>port and <code>WC_defaulthost_secure</code> is the <span class="caps">HTTPS </span>port.</li>
<li><b>How to start/stop a server</b>.  If you're dealing with the "Network Deployment" type of installation (multiple application servers running under the control of the "deployment manager"), your can start/stop a server from the console. Otherwise you have to do it from command line. Go to <code>install_root/bin</code> and run <code>./startServer.sh server_name</code>, e.g.,  <code>./startServer.sh server1</code> (this assumes that your installation has only one profile defined, otherwise you may need to "cd" to the <code>profile_name/bin</code> directory). Make sure that you run all commands using the appropriate system account. To stop the server, run <code>./stopServer.sh server_name -username user_name -password password</code>. user_name and password is the credentials of an admin account, typically the same one you use to login to the console.</li>
<li><b>How to browse <span class="caps">JMS </span>messages</b>. Go to <code>Buses/Your bus name/Destinations/Your destination/Queue points/Your queue point/Runtime/Messages</code>.</li>
</ul>



<p style="font-size:smaller">
This post is part of the <a href="/category/wasadmin">series on WebSphere Application Server administration</a>. Please <a href="/feed">subscribe to our blog</a> if you'd like to receive updates. <br />
</p>

<p style="font-size:smaller">
<b>Note:</b>  We offer <a href="/services/middleware-operations-services"> professional services  in the area of WebSphere architecture, implementation and operations</a>.  If you're looking for help with any of these tasks, please <a href="mailto:info@myarch.com"> let us know</a>.<br />
</p>]]></content:encoded>
			<wfw:commentRss>http://myarch.com/websphere-application-server-for-developers-in-5-minutes-or-less/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tips for Developing JMS Client for WebSphere Application Server</title>
		<link>http://myarch.com/was-jms-client</link>
		<comments>http://myarch.com/was-jms-client#comments</comments>
		<pubDate>Mon, 23 May 2011 00:32:03 +0000</pubDate>
		<dc:creator>Alexander Ananiev</dc:creator>
				<category><![CDATA[Java EE]]></category>
		<category><![CDATA[WebSphere]]></category>
		<category><![CDATA[WebSphere Application Server Administration]]></category>

		<guid isPermaLink="false">http://myarch.com/?p=705</guid>
		<description><![CDATA[Following are some tips for developing a JMS client for WAS.  



First, we need to put the right jar files on the client's classpath. Following jars are required: com.ibm.ws.sib.client.thin.jms_&#60;WAS version&#62;.jar, com.ibm.ws.ejb.thinclient_&#60;WAS version&#62;.jar. If you're using Oracle/Sun JDK, you'll also need com.ibm.ws.orb_&#60;WAS version&#62;.jar as IBM libraries rely on IBM ORB implementation. IBM JDK has it [...]]]></description>
			<content:encoded><![CDATA[<p>Following are some tips for developing a <span class="caps">JMS </span>client for <span class="caps">WAS.  </span></p>


<ul>
<li>First, we need to put the right jar files on the client's classpath. Following jars are required: com.ibm.ws.sib.client.thin.jms_&lt;WAS version&gt;.jar, com.ibm.ws.ejb.thinclient_&lt;WAS version&gt;.jar. If you're using Oracle/Sun <span class="caps">JDK, </span>you'll also need com.ibm.ws.orb_&lt;WAS version&gt;.jar as <span class="caps">IBM </span>libraries rely on <span class="caps">IBM ORB </span>implementation. <span class="caps">IBM JDK </span>has it built-in but Oracle's obviously does not. These jars are available from the "runtimes" directory of your <span class="caps">WAS </span>installation. It is a good idea to make sure that the version of your client jars matches the version of your target <span class="caps">WAS </span>installation, including the fixpack level. You may want to update your client jars every time a new fixpack is installed.</li>
</ul>




<ul>
<li>If you're not using <span class="caps">DNS, </span>you'll need to add the host name of the <span class="caps">WAS </span>server to the host file on your client machine, otherwise you're bound to get a cryptic <span class="caps">ORB </span>error message. You can find <span class="caps">WAS </span>host name by going to Server/Server types/ WebSphere Application Servers in admin console. <br />
By the way, most <span class="caps">ORB </span>error messages are cryptic; it is very rare to see the root cause of the problem in the message. The way to deal with it is to enable <span class="caps">ORB </span>tracing. Add <code>-Dcom.ibm.CORBA.Debug=true</code> to your <span class="caps">JDK </span>parameters; other debug/tracing parameters are explained <a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/rtrb_orbcomp2.html">here</a>.</li>
</ul>




<ul>
<li>Another frequent source of errors is a missing bootstrap property in the connection factory configuration. It is specified in the "provider endpoint" field and has a form of &lt;host&gt;:&lt;SIB_Port&gt;:BootstrapBasicMessaging. If this is not provided, <span class="caps">WAS </span>will attempt to bootstrap the messaging engine using localhost. </li>
</ul>




<ul>
<li>Most <span class="caps">JMS </span>examples use <span class="caps">JNDI </span>lookup in order to get a queue object. It is more efficient to use session.crerateQueue() method. Note that in this case you need to provide the name of the <span class="caps">JMS </span>destination as opposed to the queue <span class="caps">JNDI </span>name. This is the "Queue name" parameter on the queue configuration screen in <span class="caps">WAS </span>admin console.</li>
</ul>




<ul>
<li>Finally, not all developers are aware that <span class="caps">WAS </span>admin console has a built-in <span class="caps">JMS </span>queue/topic browser. It takes a few steps to get to it from the console: Buses/Your bus name/Destinations/Your destination/Queue points/Your queue point/Runtime/Messages.</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://myarch.com/was-jms-client/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>DataPower Deployment Policies and XPath</title>
		<link>http://myarch.com/datapower-deployment-policies-and-xpath</link>
		<comments>http://myarch.com/datapower-deployment-policies-and-xpath#comments</comments>
		<pubDate>Thu, 16 Sep 2010 12:18:13 +0000</pubDate>
		<dc:creator>Alexander Ananiev</dc:creator>
				<category><![CDATA[DataPower]]></category>
		<category><![CDATA[WebSphere]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XML Appliances]]></category>
		<category><![CDATA[dpbuddy]]></category>

		<guid isPermaLink="false">http://myarch.com/?p=698</guid>
		<description><![CDATA[Deployment policy in IBM DataPower appliance is a very nice concept. Deployment policies allow for "tweaking" device and domain configuration for different environments. Let's face it, there are always differences between environments. Sometimes, these differences are small, such as different back-end hosts, and in other cases these differences could be significant, such as different security [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ibm.com/developerworks/websphere/library/techarticles/0904_rasmussen/0904_rasmussen.html">Deployment policy</a> in <span class="caps">IBM</span> DataPower appliance is a very nice concept. Deployment policies allow for "tweaking" device and domain configuration for different environments. Let's face it, there are always differences between environments. Sometimes, these differences are small, such as different back-end hosts, and in other cases these differences could be significant, such as different security policies. It is commendable that <span class="caps">IBM </span>recognized this fact and implemented a mechanism for dealing with this very common problem directly in their product.</p>

<p>Deployment policies do a decent job of dealing with differences between environments. Deployment policies support changing, adding and deleting configuration, so it  is possible to implement fairly complex transformations. </p>

<p>However, dealing with deployment policies could be confusing. Deployment policy's match rules utilize xpath, but the syntax of the rules is not pure xpath (note -- I'm using 3.7 firmware. The syntax might be different in 3.8). Consider this simple deployment policy match rule:</p>

<code>
*/*/protocol/http?Name=personSreviceHTTP&amp;amp;Property=LocalPort
</code>

<p>The part before "?" looks like xpath. But what schema is this xpath based on? There is no "protocol" element in the DataPower <span class="caps">XML </span>management schema. The part after "?" that uses name-value parameters is even more odd. Why use this instead of proper xpath? After all, DataPower has an <span class="caps">XML</span>-processing engine with full xpath support, so it would certainly be more logical to rely on <span class="caps">XML </span>standards.<br />
 <br />
The bottom line is that while deployment policies are useful, they have limitations. They have to be developed using Deployment Policy builder in WebGUI. They can only be applied to configuration elements supported in WebGUI. For example, creating a deployment policy that updates RemoteEndpointPort of a Web Services Proxy proves to be a non-trivial task. </p>

<p>This is why we added support for "plain" xpath-based overrides in our <a href="/dpbuddy"><span class="caps">DPB</span>uddy DataPower management tool</a>. Instead of dealing with the obscure syntax of deployment policies, developers can simply look at the configuration export file and specify an xpath expression against this file.  "dp:setConfig" task of <span class="caps">DPB</span>uddy will update the matching element of this expression with the new value. For example, to update RemoteEndpointPort, one can define the following task:</p>


<pre>
<code>
&lt;dp:setConfig&gt;
    &lt;configFile file=&quot;dpconfigs/config-wsproxy.xml&quot;&gt;
        &lt;override xpath=&quot;//RemoteEndpointPort&quot; value=&quot;${endpoint.port}&quot;/&gt;
    &lt;/configFile&gt;
&lt;/dp:setConfig&gt;
</code>
</pre>


<p>It is not possible to add or remove configuration using "dp:setConfig"; deployment policies still have to be used for this kind of config changes.  However, from our experience, majority of environment differences can be dealt with the xpath-based override mechanism.</p>

<p>MyArch, Inc. offers <a href="/why-pay-for-dpbuddy-support">paid support for dpbuddy</a>, including implementing custom enhancements. If you're interested, please contact us as <a href="mailto:info@myarch.com">info at myarch.com</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://myarch.com/datapower-deployment-policies-and-xpath/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>WebSphere 7 Business Level Applications</title>
		<link>http://myarch.com/was7bla</link>
		<comments>http://myarch.com/was7bla#comments</comments>
		<pubDate>Tue, 02 Mar 2010 03:08:36 +0000</pubDate>
		<dc:creator>Alexander Ananiev</dc:creator>
				<category><![CDATA[WebSphere]]></category>
		<category><![CDATA[WebSphere Application Server Administration]]></category>

		<guid isPermaLink="false">http://myarch.com/?p=606</guid>
		<description><![CDATA[Application management, including deployment, has remained mostly unchanged since WAS  5. 

WAS 7, however, introduced a new concept -- "Business Level Applications" (BLA).  It would be more accurate to use the term "composite application" because this is what BLAs are -- it's a composition of  Java EE applications (WARs or EARs) or [...]]]></description>
			<content:encoded><![CDATA[<p>Application management, including deployment, has remained mostly unchanged since <span class="caps">WAS </span> 5. </p>

<p><span class="caps">WAS</span> 7, however, introduced a new concept -- "Business Level Applications" (BLA).  It would be more accurate to use the term "composite application" because this is what <span class="caps">BLA</span>s are -- it's a composition of  Java EE applications (WARs or <span class="caps">EAR</span>s) or other "assets".  </p>

<p>Unfortunately, the term "composite application" is already used in a <a href="http://www.ibm.com/developerworks/websphere/library/techarticles/1002_lau/1002_lau.html?ca=drs-">different context</a> by <span class="caps">IBM. </span></p>

<p>The word "asset" is another confusing and terribly overused term. In <span class="caps">WAS7 </span>it's  a "catch all" word for any kind of artifact, including jar, zip, and, with the introduction of <span class="caps">OSG</span>i support, an <span class="caps">OSG</span>i bundle (you need to have a <a href="https://www14.software.ibm.com/iwm/web/cc/earlyprograms/websphere/wasfposgiajp/">beta <span class="caps">OSGI </span>feature pack</a>   installed  to be able to use <span class="caps">OSG</span>i).</p>

<p><span class="caps">BLA</span>s are created by combining applications and assets together either using admin console or scripting. <span class="caps">BLA </span>configuration is saved under $profile_root/config/cells/$cell_name/blas. Assets are saved under $profile_root/config/cells/$cell_name/assets.</p>

<p>I can see two use cases for <span class="caps">BLA</span>s:</p>


<ul>
<li><span class="caps">BLA</span>s can be used to start and stop multiple Java EE applications at once. This might be useful if operationally several applications have to be treated together or if there are run-time dependencies between applications. This is especially the case if scripting is used; <code>AdminTask.startBLA</code> and <code>AdminTask.startBLA</code> provide an easy way to restart several "regular" applications.</li>
</ul>




<ul>
<li><span class="caps">BLA</span>s can be used to manage shared libraries. There is no way to deploy "traditional" shared libraries ("Environment/Shared Libraries") using Deployment Manager; you have to use scp or ftp to copy binaries to target servers. With <span class="caps">BLA </span>you can simply import "assets" (e.g., a jar file) using <code>AdminTask.importAsset</code> command. You can then reference the jar file using "SharedLibRelationship" option of AdminApp install/update commands. This will automatically create a classloader for this library (note--this might require server restart, at least for me it did).  Being able to use regular administration <span class="caps">API</span>s for managing shared libraries is certainly a welcome feature.</li>
</ul>



<p>Unfortunately, <span class="caps">BLA</span>s also have limitations:</p>


<ul>
<li>I was not able to find a way to create an asset consisting of multiple jars. This severely limits the usefulness of utilizing <span class="caps">BLA</span>s for managing shared libraries since a library will almost always consist of multiple jars. It is possible to import jars individually, but this is tedious and difficult to manage. </li>
</ul>




<ul>
<li>It is not possible to deploy multiple Java EE applications using <span class="caps">BLA</span>s. You still have to deploy applications individually. </li>
</ul>




<ul>
<li>There is no support for version information in <span class="caps">BLA </span>assets. This is unfortunate. I wish <span class="caps">IBM </span>though about integrating  <span class="caps">BLA </span>assets with Maven repositories and supporting true dependency management (e.g., version resolution, transitive dependencies, etc.). As of right now the only way to import multiple version of the same asset is to append a version number to the asset's file name.</li>
</ul>



<p>To summarize, the <span class="caps">BLA </span>idea has some promise but its current implementation is too limited to be truly useful.  I'm sure <span class="caps">IBM </span>will be evolving <span class="caps">BLA </span>in future <span class="caps">WAS </span>releases.</p>

<p>You can find more information about <span class="caps">BLA </span>in <a href="http://www.ibm.com/developerworks/websphere/techjournal/0905_edwards/0905_edwards.html">this article</a> and in <a href="http://www-01.ibm.com/support/docview.wss?rs=180&amp;%23038;uid=swg27017416">this webcast</a></p>


<p style="font-size:smaller">
This post is part of the <a href="/category/wasadmin">series on WebSphere Application Server administration</a>. Please <a href="/feed">subscribe to our blog</a> if you'd like to receive updates. <br />
</p>

<p style="font-size:smaller">
<b>Note:</b>  We offer <a href="/services/middleware-operations-services"> professional services  in the area of WebSphere architecture, implementation and operations</a>.  If you're looking for help with any of these tasks, please <a href="mailto:info@myarch.com"> let us know</a>.<br />
</p>]]></content:encoded>
			<wfw:commentRss>http://myarch.com/was7bla/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WebSphere Adminstration: Getting Started with WebSphere Application Server Scripting</title>
		<link>http://myarch.com/getting-started-wsadmin</link>
		<comments>http://myarch.com/getting-started-wsadmin#comments</comments>
		<pubDate>Mon, 08 Feb 2010 03:52:03 +0000</pubDate>
		<dc:creator>Alexander Ananiev</dc:creator>
				<category><![CDATA[WebSphere]]></category>
		<category><![CDATA[WebSphere Application Server Administration]]></category>

		<guid isPermaLink="false">http://myarch.com/?p=597</guid>
		<description><![CDATA[If you're a WebSphere administrator or if you're trying to automate some tasks around the IBM WebSphere line of products, you'll inevitably be using WAS scripting (a.k.a. "wsadmin"). For the record, it is also possible to use Java and JMX-based APIs for automation, but it's is more complex and less documented. So  "wsadmin" scripting [...]]]></description>
			<content:encoded><![CDATA[<p>If you're a WebSphere administrator or if you're trying to automate some tasks around the <span class="caps">IBM</span> WebSphere line of products, you'll inevitably be using <span class="caps">WAS </span>scripting (a.k.a. "wsadmin"). For the record, it is also possible to use Java and <span class="caps">JMX</span>-based <span class="caps">API</span>s for automation, but it's is more complex and less documented. So  "wsadmin" scripting tool is the primary tool of trade for any WebSphere administrator.</p>

<p>There are several things that you need to do in order to be successful with wsadmin:</p>


<ul>
<li>Learn Python. Wsadmin uses Python as a language (JACL was deprecated a long time ago and should not be used) and relies on jython. Jython provides full implementation of Python language <a href="http://www.jython.org/docs/library/indexprogress.html">sans some libraries</a>. Needless to say that  good knowledge of Python is essential for developing wsadmin scripts. Most WebSphere admins have Java background. In my opinion (and speaking from personal experience), knowing Java does more harm than good for a Python developer. Java people usually speak Python "with accent" and have a hard time properly utilizing all python capabilities such as closures, list comprehensions and even modules and packages. It's no wonder, the two languages are very different. For example, in Java everything is a class and in most cases a class resides in its own file. In Python a module can encompass multiple classes and classes themselves are completely optional.  Learning how to properly use modules and classes takes some mental shift. </li>
</ul>




<ul>
<li>Invest in designing your scripts. I'm not even sure if "scripting" is the right word to use in this context. Scripts are usually relatively simple. Wsadmin scripts are anything but. A seemingly simple task of application deployment may require many lines of code if you want to do it right. Unless you're really trying to do something unsophisticated (e.g.,  <a href="/setting-heap-size">setting heap size</a>), you'll be developing a full-blown python application. Therefore, you'll need to think about its design. Python has excellent support for modules. You'll have at least one module in your application. Do not put any logic into the "main" file that you'll be calling from wsadmin. Instead, define appropriate functions and classes in your modules and call them from the main file.</li>
</ul>




<ul>
<li>Invest in setting up your development environment. Notepad or vi are not going to cut it. Remember, Python lacks compiler, so the only way to find out if your code is even syntactically correct is to execute it. That is, unless you use an <span class="caps">IDE, </span>such as <a href="http://pydev.org/">PyDev</a>. The latest version of PyDev is very good at detecting syntax errors and many other issues, such as uninitialized variables. It also has very decent (for a dynamic language) code completion.<br />
You will also need to setup your wsadmin shell script to supply python path (using <code>-javaoption &quot;-Dpython.path=your_path&quot;</code>). Do not forget to put python libraries (the ones that come with jython) on the python path. I prefer using <a href="/wsadmin-thin-client">thin administration client</a> as this is more flexible. I also <a href="/using-jython-221-with-wsadmin-tool">use 2.2.1 version of jython</a> since jython 2.1 that <a href="/was-70-is-still-on-jython-21">comes with wsadmin</a> is just too old and misses a lot of important language features.<br />
Another practical piece of advice is to never use "wsadmin -f" to test your scripts. Wsadmin takes eternity to come up, so running it every time you want to run your scripts is simply counterproductive. Instead, load it once and then run your script using Python "execfile" function. Don't forget to call <a href="http://docs.python.org/library/functions.html">reload</a> function for all modules that are part of your applications, otherwise you won't see the changes until your re-start wsadmin.</li>
</ul>




<ul>
<li>Help function is your best friend, so learn how to use it. I'm talking about the "help" function available for all key wsadmin modules (<a href="/admincontrol-vs-adminconfig">AdminConfig, AdminControl, etc</a>). Wsadmin <span class="caps">API</span>s, in my opinion, are poorly organized and difficult to learn. <a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=%2Fcom.ibm.websphere.soafep.multiplatform.doc%2Finfo%2Fae%2Fae%2Frxml_taskoptions.html">Ten thousand options</a> available for AdminApp.install function is an example of that. Also,  "lists of lists" data structures used by AdminTask and AdminApp are truly baffling. In any event, I usually run a separate wsadmin window that I use solely for consulting "help". This is much faster than searching for the same information in InfoCenter.</li>
</ul>




<ul>
<li>Finally, you will need a testing environment. You can do some development using a standalone <span class="caps">WAS </span>installation but eventually you'll need to test your code against a Network Deployment environment with deployment manager and, ideally, multiple servers and multiple nodes. In other words, your test environment should resemble the target environments where you're going to run your scripts. There are many things that are impossible to test with just a standalone profile, one such example is <a href="/how-to-force-node-synchronization">node synchronization</a>.</li>
</ul>




<p style="font-size:smaller">
This post is part of the <a href="/category/wasadmin">series on WebSphere Application Server administration</a>. Please <a href="/feed">subscribe to our blog</a> if you'd like to receive updates. <br />
</p>

<p style="font-size:smaller">
<b>Note:</b>  We offer <a href="/services/middleware-operations-services"> professional services  in the area of WebSphere architecture, implementation and operations</a>.  If you're looking for help with any of these tasks, please <a href="mailto:info@myarch.com"> let us know</a>.<br />
</p>]]></content:encoded>
			<wfw:commentRss>http://myarch.com/getting-started-wsadmin/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>WebSphere Administration: Using Thin Administration Client</title>
		<link>http://myarch.com/wsadmin-thin-client</link>
		<comments>http://myarch.com/wsadmin-thin-client#comments</comments>
		<pubDate>Fri, 29 Jan 2010 04:46:34 +0000</pubDate>
		<dc:creator>Alexander Ananiev</dc:creator>
				<category><![CDATA[WebSphere]]></category>
		<category><![CDATA[WebSphere Application Server Administration]]></category>

		<guid isPermaLink="false">http://myarch.com/?p=581</guid>
		<description><![CDATA[Most people assume that in order to run WAS admin scripts, you need to have full WAS installation available on the client machine. This is not correct. Starting with WAS 6.1, it is possible to use the so-called administration thin client instead.

The thin client has many benefits:



The client consists of only two jars approximately 33MB [...]]]></description>
			<content:encoded><![CDATA[<p>Most people assume that in order to run <span class="caps">WAS </span>admin scripts, you need to have full <span class="caps">WAS </span>installation available on the client machine. This is not correct. Starting with <span class="caps">WAS</span> 6.1, it is possible to use the so-called <a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Ftxml_adminclient.html">administration thin client</a> instead.</p>

<p>The thin client has many benefits:</p>


<ul>
<li>The client consists of only two jars approximately 33MB in size, so you can set it up anywhere. With the traditional wsadmin client, you have to get <span class="caps">WAS </span>installed on your machine just so you can run wsadmin scripts. This is especially tedious if you have to deal with multiple versions of WebSphere products (and most large organizations have <span class="caps">WAS </span>versions in parallel). With the thin client you can just copy the two jars from an existing <span class="caps">WAS </span>installation onto a client machine.  The only catch is that <span class="caps">IBM JDK </span>(or, more precisely, a <span class="caps">JDK </span>containing <span class="caps">IBM </span>security provider -- on Sun and HP-UX <span class="caps">WAS </span>actually comes with the Sun <span class="caps">JDK</span>) is still required. You can copy it  from an existing install as well (I hope it doesn't violate any licensing terms). </li>
</ul>




<ul>
<li>Since the client's size is so small, you can add it to your version control or to your Maven repository. This makes the build more repeatable for developers (your build does include deploying to the application server and <a href="/build-to-test">running tests against it</a>, doesn't it?).</li>
</ul>




<ul>
<li>The shell script to run the thin client could be easily customized. For example, you may want to add some Java classes to wsadmin classpath. This will make it possible to invoke these classes from your wsadmin scripts. Or you <a href="/using-jython-221-with-wsadmin-tool">may want to use a more modern jython version</a> for your scripts. In fact <span class="caps">IBM </span>does't supply a shell script with the thin client, they just provide an <a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Ftxml_j2se.html">example</a> .</li>
</ul>



<p>You'll need to make sure that you update your client jars whenever the server installation is upgraded.</p>

<p>Oh, and if you're using WebSphere <span class="caps">ESB</span>/Process Server and want to utilize some of <span class="caps">WESB</span>-specific admin tasks (available from AdminTask object), you're out of luck; the thin client will not support those.</p>


<p style="font-size:smaller">
This post is part of the <a href="/category/wasadmin">series on WebSphere Application Server administration</a>. Please <a href="/feed">subscribe to our blog</a> if you'd like to receive updates. <br />
</p>

<p style="font-size:smaller">
<b>Note:</b>  We offer <a href="/services/middleware-operations-services"> professional services  in the area of WebSphere architecture, implementation and operations</a>.  If you're looking for help with any of these tasks, please <a href="mailto:info@myarch.com"> let us know</a>.<br />
</p>]]></content:encoded>
			<wfw:commentRss>http://myarch.com/wsadmin-thin-client/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ClassNotFoundException: A List of Dumb Things to Check</title>
		<link>http://myarch.com/classnotfound</link>
		<comments>http://myarch.com/classnotfound#comments</comments>
		<pubDate>Thu, 14 Jan 2010 05:12:50 +0000</pubDate>
		<dc:creator>Alexander Ananiev</dc:creator>
				<category><![CDATA[Building software]]></category>
		<category><![CDATA[Troubleshooting]]></category>
		<category><![CDATA[WebSphere]]></category>
		<category><![CDATA[WebSphere Application Server Administration]]></category>

		<guid isPermaLink="false">http://myarch.com/?p=549</guid>
		<description><![CDATA[	You deploy a new version of your application into production environment, hit the application&#8217;s URL  and get a 500 error with a long error stack and nasty &#8220;java.lang.ClassNotFoundException&#8221; in bold at the top.

	&#8220;Class Not Found&#8221; exceptions could be quite tricky to troubleshoot because of the complexity of Java Web applications and application servers they [...]]]></description>
			<content:encoded><![CDATA[	<p>You deploy a new version of your application into production environment, hit the application&#8217;s <span class="caps">URL </span> and get a 500 error with a long error stack and nasty &#8220;java.lang.ClassNotFoundException&#8221; in bold at the top.</p>

	<p>&#8220;Class Not Found&#8221; exceptions could be quite tricky to troubleshoot because of the complexity of Java Web applications and application servers they run on.  An average web application nowadays comes bundled with dozens of jar file (and probably thousands of classes). An average application server&#8217;s classpath is many pages long. Not to mention separately deployed libraries containing jar files shared by a group of applications. There should be little surprise that it is quite common for all these different jars and classloaders to clash with each other, get out of sync or become otherwise corrupt and mis-configured.</p>

	<p>The list below represents a subset of all the possible causes of &#8220;ClassNotFoundException&#8221;.  Hopefully this list could serve as a starting point for attacking the problem. The list was inspired by <a href="http://everythingsysadmin.com/dumb-things-to-check.html" title="">A List of Dumb Things to Check</a>.</p>

	<ul>
		<li>To start, determine a type of the offending class. Is it a an application class, a third-party library class, a class provided by the application server or a <span class="caps">JDK</span> class?  Determine the jar file that should contain the class. Determine where that jar should be located on the file system. Is it part of application installation, application server installation or some shared library installation? You may need to search for the class within multiple jars. Here is the command to do it (<a href="http://www.unix.com/shell-programming-scripting/21551-jar-file-search.html">source</a>): <code>  find . &lt;del&gt;name *.jar -print -exec jar -tvf {} ; | awk '/YOURSEARCHSTRING/ || /jar/ {print} ' </code> (note</del>-it won&#8217;t search within <span class="caps">EAR</span> and <span class="caps">WAR</span> files)</li>
		<li> Does the jar that&#8217;s supposed to contain the class exist on the file system?</li>
		<li> Are you able to &#8220;unjar&#8221; the jar using <code>jar -xvf</code>?  Does the jar indeed contain the package and class in question?</li>
		<li>Check the version of the jar if you can&#8217;t find the class there. To determine the version, look at the jar&#8217;s <span class="caps">MANIFEST</span>.MF. Usually (but, unfortunately, not  always) you will find some version information there. You can also compare the file size with the &#8220;baseline&#8221;.</li>
		<li>Does the account that the application server&#8217;s <span class="caps">JVM</span> was started with have read access to the jar? An application server usually runs under some sort of a system account. The jar might have been copied to the file system using a personal account from a different group.</li>
		<li>Have all application jars been updated during deployment? Are all the jars (including shared libraries) at the right version? Manual deployment process is quite common, so missing to update a jar is always a possibility.</li>
		<li>Is the class in question packaged with the application (e.g., under <span class="caps">WEB</span>-INF/lib) and being loaded by one of the parent classloaders? Most application servers utilize a classloader hierarchy where <span class="caps">WAR</span> file&#8217;s classloader is a child of <span class="caps">EAR</span> classloader which in turn is a child of the system (JVM) classloader. Parent classloaders can&#8217;t go down to request a class from a child classloader. The problem occurs if, for example, some jars were moved to a shared library but they still depend on classes packaged with the application.<br />
In order to diagnose this situation, you&#8217;ll need to have a good understanding of your application server&#8217;s classloader hierarchy.  <a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.websphere.base.doc/info/aes/ae/crun_classload.html" title="">Here</a> is the information for WebSphere and  <a href="http://download.oracle.com/docs/cd/E15523_01/web.1111/e13706/classloading.htm" title="">here</a> is the WebLogic documentation on classloaders. <a href="http://josephamrithraj.wordpress.com/2010/02/24/class-loader-classnotfound-exception-in-websphere/" title="">Here</a> is another article covering WebSphere classloaders in depth.</li>
		<li>Is any of the jars packaged with the application also present on any of the parent classloader&#8217;s classpath? Running different versions of the same jar or library can cause all kinds of issues, including ClassNotFoundException.  Some app servers allow overriding default classloader behavior so that the jars packaged with the application are loaded first. This could fix the problem.</li>
		<li> If the jar with the class in question is part of a shared library (as opposed to packaged with the application), check if this library was made available to the application via the classloader configuration. For example, WebSphere configuration involves setting up a separate classloader for the library and explicitly associating it with the application.</li>
		<li>Is the version and patch level of the application server correct? Does it match your development environment? Look at the detailed version information for all the different components of your app servers and also get a list of installed patches. E.g., for WebSphere run <code>versionInfo -long</code> command.</li>
		<li> Is the application server running  under the right <span class="caps">JDK</span>? E.g., check if the server startup script relies on <span class="caps">JAVA</span>_HOME and see which <span class="caps">JDK</span> the <span class="caps">JAVA</span>_HOME points to.</li>
		<li>If the application runs in a cluster, does the problem occur on all nodes or just on some? Are you trying to troubleshoot the problem on the right node?</li>
		<li>If the classname is driven from a string, either in java source or some other file, have you spelled the class name correctly? (<a href="http://www.1060.org/blogxter/publish/5" title="">Steve Loughran</a>)</li>
	</ul>

	<p>Once again, this is by no means a complete list.  If anybody wants to contribute, please add a comment below and I&#8217;ll update the post.</p>


 ]]></content:encoded>
			<wfw:commentRss>http://myarch.com/classnotfound/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Eliminate the Need to Redeploy Your Web Files</title>
		<link>http://myarch.com/no-web-redeployment</link>
		<comments>http://myarch.com/no-web-redeployment#comments</comments>
		<pubDate>Sun, 10 May 2009 00:57:39 +0000</pubDate>
		<dc:creator>Alexander Ananiev</dc:creator>
				<category><![CDATA[Building software]]></category>
		<category><![CDATA[Developer productivity]]></category>
		<category><![CDATA[WebSphere]]></category>

		<guid isPermaLink="false">http://myarch.com/?p=256</guid>
		<description><![CDATA[	Some application servers require that location of the development workspace has to be different from the location of the deployed application. For example, you can easily point Tomcat to the root of your Web application using &#8220;docBase&#8221; of the &#8220;Context&#8221; element. But you&#8217;re out of luck with WebSphere Application Server (WAS). You have to go [...]]]></description>
			<content:encoded><![CDATA[	<p>Some application servers require that location of the development workspace has to be different from the location of the deployed application. For example, you can easily point Tomcat to the root of your Web application using &#8220;docBase&#8221; of the &#8220;Context&#8221; element. But you&#8217;re out of luck with WebSphere Application Server (WAS). You have to go through a separate application update process (using admin console or Rational Application Developer tooling) to synchronize your deployed application with the workspace. In my view, this update (a.k.a. &#8220;deployment&#8221;) step should never be required in a local development environment. It is one thing to have to deploy to a test or a production environment that consists of multiple servers that are segregated from the machine hosting the build artifacts. But in a situation when both the code and the application server are sitting on the same machine, the deployment step is redundant. We should be able to simply tell the app server where the code is and it can then do whatever is needed to load the code into <span class="caps">JVM</span>.</p>

	<p>Luckily, we can get pretty close to this vision with a few very simple (and free) tools.</p>

	<p>In my <a href="/instant-was-redeploy">previous post</a> I explained how to enable dynamic class reloading for WebSphere Application Server and avoid having to deploy your Java changes altogether. But what about changes to JSPs and other non-Java resources? How can we synchronize the directory used by the application server with the development workspace?</p>

	<p>Turns out, there is an Eclipse plugin that does exactly that. It&#8217;s <a href="http://andrei.gmxhome.de/filesync/index.html">Filesync plugin</a> developed by Andrei Loskutov.</p>

	<p>As the name implies, the plugin automatically synchronizes workspace directories with external directories by doing one-way copy of changed files. It allows to specify multiple directory pairs and also to define include/exclude patterns and even use variable substitution.</p>

	<p>To enable automatic updates of JSPs in the deployed application directory all you need to do is to define a folder pair that links web root in your workspace with the location of the exploded <span class="caps">WAS</span> directory in <span class="caps">WAS </span>(usually located under profile_root/installedApps/cell_name/app_name.ear/app_name.war).</p>

	<p>With <span class="caps">WAS</span> you need to watch for static &#8220;<%@ include %>&#8221; directives in your JSPs. <span class="caps">WAS</span> will not reload included files unless you also update including <span class="caps">JSP</span>. A workaround here is to turn everything into &#8220;jsp:include&#8221; actions or use <span class="caps">JSTL</span>&#8217;s &#8220;c:import&#8221;. There might be a slight performance penalty for doing that but improved productivity is well worth it.</p>

	<p>You can use Filesync plugin to synchronize your class files as well. This provides an alternative to the resource link-based approach that I described in the <a href="/instant-was-redeploy">previous post</a>. I still like using resource links better because they can be defined using Eclipse variables which makes it easier to share the configuration within a team. As far as I can tell, with Filesync you have to use absolute paths.</p>

	<p>Here&#8217;s how the filesync configuration screen looks like:<br />
<img src="/files/filesync/filesync.jpg" alt="Filesync configuration" /></p>

	<p>Another good use of Filesync is to pull jar files from an external directory. Projects typically have a repository-like location where all third-party jars are checked-in (or it could be a full-blown Maven repository). You can easily add an external jar to your classpath in Eclipse. But how to put it under &#8220;WEB-INF/lib&#8221; where it needs to end up for the application server? With filesync it can be done easily by adding yet another folder pair.</p>

	<p>In short, Filesync allows you to assemble your application &#8220;on the fly&#8221; without having to run an external build process. It also completely eliminates the need to explicitly update deployed applications.</p>


 ]]></content:encoded>
			<wfw:commentRss>http://myarch.com/no-web-redeployment/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

