<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-315508520962829459</id><updated>2010-06-30T12:33:31.085-07:00</updated><title type='text'>School of BitRock</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.bitrock.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default?start-index=26&amp;max-results=25'/><author><name>BitRock Team</name><uri>http://www.blogger.com/profile/14660332720215938837</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>67</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-3246790810092285618</id><published>2010-06-14T11:30:00.000-07:00</published><updated>2010-06-14T11:30:43.952-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='installbuilder'/><category scheme='http://www.blogger.com/atom/ns#' term='new releases'/><category scheme='http://www.blogger.com/atom/ns#' term='installer'/><category scheme='http://www.blogger.com/atom/ns#' term='cross platform'/><title type='text'>InstallBuilder 6.4 Released!</title><content type='html'>We just released version 6.4.0 of BitRock InstallBuilder. The new release features the following improvements:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Added support for nested variables&lt;/li&gt;&lt;li&gt;Now all variable references are case insensitive&lt;/li&gt;&lt;li&gt;New&amp;nbsp;&amp;lt;createShortcuts&amp;gt;&amp;nbsp;action&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;Prevent GUI builder from accepting incorrect values in its dialogs&lt;/li&gt;&lt;li&gt;Added new&amp;nbsp;&amp;lt;while&amp;gt;&amp;nbsp;and&amp;nbsp;&amp;lt;break&amp;gt;&amp;nbsp;actions&lt;/li&gt;&lt;li&gt;New&amp;nbsp;&amp;lt;autodetectDotNetFramework&amp;gt;&amp;nbsp;action&lt;/li&gt;&lt;li&gt;New&amp;nbsp;&amp;lt;locate&amp;gt;&amp;nbsp;action&lt;/li&gt;&lt;li&gt;Added new&amp;nbsp;&amp;lt;zip&amp;gt;&amp;nbsp;action&lt;/li&gt;&lt;li&gt;Added matchHiddenFiles flag to&amp;nbsp;&amp;lt;touchFile&amp;gt;,&amp;nbsp;&amp;lt;copyFile&amp;gt;&amp;nbsp;and&amp;nbsp;&amp;lt;deleteFile&amp;gt;&amp;nbsp;actions&lt;/li&gt;&lt;li&gt;Added OS X support for user and group manipulation actions&lt;/li&gt;&lt;li&gt;Added new built-in variable windows_os_flavor&lt;/li&gt;&lt;li&gt;Allow&amp;nbsp;&amp;lt;foreach&amp;gt;&amp;nbsp;and&amp;nbsp;&amp;lt;if&amp;gt;&amp;nbsp;actions to be accessed through the GUI&lt;/li&gt;&lt;li&gt;Fixed Qt installer abnormaly resizing in "custom" mode&lt;/li&gt;&lt;li&gt;Fixed patterns in folders' inclusion filters not resolved when using backslashes&lt;/li&gt;&lt;li&gt;Allow&amp;nbsp;&amp;lt;showProgressDialog&amp;gt;&amp;nbsp;to display a download progress bar when containing a single&amp;nbsp;&amp;lt;httpGet&amp;gt;&amp;nbsp;child action&lt;/li&gt;&lt;li&gt;Normalize all relative paths to reference project directory in Autoupdate tool&lt;/li&gt;&lt;li&gt;New validation of duplicated project tags&lt;/li&gt;&lt;li&gt;Disabled RPM registration in platforms with non-native RPM support&lt;/li&gt;&lt;li&gt;Increase size of builder project properties dialog&lt;/li&gt;&lt;li&gt;Allow empty user and password to be provided in&amp;nbsp;&amp;lt;addScheduledTask&amp;gt;&amp;nbsp;action&lt;/li&gt;&lt;li&gt;New&amp;nbsp;&amp;lt;runOnlyIfLoggedOn&amp;gt;&amp;nbsp;tag in&amp;nbsp;&amp;lt;addScheduledTask&amp;gt;&amp;nbsp;action&lt;/li&gt;&lt;li&gt;Disable language selection dialog when a value is provided through command line&lt;/li&gt;&lt;li&gt;Allow InstallBuilder license to be saved to and loaded from user personal directory on Windows&lt;/li&gt;&lt;li&gt;Added Japanese string for Installer.DirectorySelection built-in string&lt;/li&gt;&lt;li&gt;Fixed glitch in button states after installation page&lt;/li&gt;&lt;li&gt;Allow task name with spaces in&amp;nbsp;&amp;lt;addScheduledTask&amp;gt;&amp;nbsp;action&lt;/li&gt;&lt;/ul&gt;Visit&amp;nbsp;&lt;a href="http://installbuilder.bitrock.com/"&gt;installbuilder.bitrock.com&lt;/a&gt;&amp;nbsp;to&amp;nbsp;&lt;a href="http://installbuilder.bitrock.com/download.html"&gt;download&lt;/a&gt;&amp;nbsp;or to view our&amp;nbsp;&lt;a href="http://installbuilder.bitrock.com/changelog.html"&gt;changelog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-3246790810092285618?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/3246790810092285618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=3246790810092285618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/3246790810092285618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/3246790810092285618'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2010/06/installbuilder-64-released.html' title='InstallBuilder 6.4 Released!'/><author><name>Erica Brescia</name><uri>http://www.blogger.com/profile/02065317823546496697</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02357292580845573015'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-3955580669972049928</id><published>2010-05-06T05:23:00.000-07:00</published><updated>2010-05-06T05:23:18.411-07:00</updated><title type='text'>InstallBuilder 6.3.1 released!</title><content type='html'>We recently released version 6.3.1 of InstallBuilder, which includes the following improvements:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;New &amp;lt;sha1&amp;gt; action&lt;/li&gt;&lt;li&gt;New &amp;lt;md4&amp;gt; action&lt;/li&gt;&lt;li&gt;New &amp;lt;addDirectoriesToUninstaller&amp;gt; action&lt;/li&gt;&lt;li&gt;Added &amp;lt;password&amp;gt; tag to &amp;lt;addUser&amp;gt; action&lt;/li&gt;&lt;li&gt;Improved &amp;lt;httpProxyInit&amp;gt; to autodetect system proxy settings&lt;/li&gt;&lt;li&gt;Improved RPM integration&lt;/li&gt;&lt;li&gt;Improved Qt look and feel on Windows and OS X&lt;/li&gt;&lt;li&gt;Validate user provided input for parameters while creating them.&lt;/li&gt;&lt;li&gt;Added Windows support for user and group manipulation actions&lt;/li&gt;&lt;li&gt;Fixed &amp;lt;registryDelete&amp;gt; failing to delete keys on Windows 64bit&lt;/li&gt;&lt;li&gt;Documented windows_os_service_pack&lt;/li&gt;&lt;li&gt;Prevent fileTest rule from failing when testing a non-existent link&lt;/li&gt;&lt;li&gt;Fixed autoupdate returning update available when check_for_updates was set to '0'&lt;/li&gt;&lt;li&gt;Fixed Windows 7 not being recognized when Windows 7 Logo Toolkit is installed&lt;/li&gt;&lt;li&gt;Fixed symbolic links not being properly packed when included as &amp;lt;distributionFile&amp;gt;&lt;/li&gt;&lt;li&gt;Fixed variables not being resolved in some Autoupdate project tags.&lt;/li&gt;&lt;li&gt;Fixed error parsing Autoupdate projects containing utf-8 BOM&lt;/li&gt;&lt;li&gt;Built-in registry keys are now created in the 64bit view when &amp;lt;windows64bitMode&amp;gt; is enabled&lt;/li&gt;&lt;li&gt;Fixed Windows 2008 autodetection failing in some environments&lt;/li&gt;&lt;/ul&gt;&lt;br/&gt;Visit &lt;a href="http://installbuilder.bitrock.com"&gt;installbuilder.bitrock.com&lt;/a&gt; to &lt;a href="http://installbuilder.bitrock.com/download.html"&gt;download&lt;/a&gt; or to view our &lt;a href="http://installbuilder.bitrock.com/changelog.html"&gt;changelog&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-3955580669972049928?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/3955580669972049928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=3955580669972049928' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/3955580669972049928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/3955580669972049928'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2010/05/installbuilder-631-released.html' title='InstallBuilder 6.3.1 released!'/><author><name>Santiago</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14609551556002628142'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-2165873896996889793</id><published>2010-04-21T10:48:00.000-07:00</published><updated>2010-04-21T10:48:49.524-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jobs'/><title type='text'>We're Hiring!</title><content type='html'>BitRock is growing and we’re looking for smart, motivated and talented individuals to join our team! The position we’re currently working to fill is for a Stack Engineer. Our Stack Engineers work with clients throughout the world to deliver customized native installers, virtual machine images and cloud templates for their software. These are similar to the software stacks we build for the &lt;a href="http://bitnami.org/"&gt;BitNami&lt;/a&gt; project.&amp;nbsp;Stack Engineers also bring new BitNami Stacks to market and keep the current ones up to date. This position provides an excellent opportunity to work with technologies such as Ruby on Rails, PHP, Python, Apache, MySQL and many other Open Source projects across Windows, Linux, OS X and various cloud platforms such as Amazon, Rackspace, GoGrid and OpSource. If you are a distro packager or a sysadmin who likes to automate his or her work, you’ll love this job!&lt;br /&gt;&lt;br /&gt;Qualified applicants must be fluent in a scripting language such as Ruby, Python or Tcl, and familiar with common Open Source development tools. Interaction with customers is mostly over email, so the ability to write fluently and communicate effectively in English is a must. A big chunk of the development team is in Spain, so a bit of ‘Spanglish’ would not hurt, either :)&lt;br /&gt;&lt;br /&gt;If you’re local (or would like to live in) Seville, Spain, we have an office there ready and waiting for the right candidate. We also have several employees in other countries who work from home, so if you have a home office and are comfortable working remotely, we will be happy to consider your application. To apply, please send your CV along with a letter telling us a little about yourself and why you’d like to join our team to careers@bitrock.com.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-2165873896996889793?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/2165873896996889793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=2165873896996889793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/2165873896996889793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/2165873896996889793'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2010/04/were-hiring.html' title='We&apos;re Hiring!'/><author><name>Erica Brescia</name><uri>http://www.blogger.com/profile/02065317823546496697</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02357292580845573015'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-6703467912786894575</id><published>2010-04-20T16:35:00.000-07:00</published><updated>2010-04-20T16:35:28.329-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='events'/><title type='text'>DevOps Meetup Tomorrow in Palo Alto</title><content type='html'>We're excited to announce the first San Francisco Bay Area &lt;a href="http://dev2ops.org/meetup"&gt;DevOps Meetup&lt;/a&gt;, happening April 21st at &lt;a href="http://www.oldpropa.com/"&gt;The Old Pro in Palo Alto&lt;/a&gt;. If you're not familiar with the term DevOps, take a look at this &lt;a href="http://dev2ops.org/blog/2010/2/22/what-is-devops.html"&gt;article&lt;/a&gt;, which gives a great explanation.&lt;br /&gt;&lt;br /&gt;This first meetup is all about getting to know and networking with your fellow DevOps enthusiasts. We'll be meeting at 7pm to drink beer, eat food, and talk DevOps. We're co-sponsoring the event with DTO Solutions and rPath to make sure there is some tasty food and beer to keep everyone fueled up. We hope you're able to join us!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-6703467912786894575?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/6703467912786894575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=6703467912786894575' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/6703467912786894575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/6703467912786894575'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2010/04/devops-meetup-tomorrow-in-palo-alto.html' title='DevOps Meetup Tomorrow in Palo Alto'/><author><name>Erica Brescia</name><uri>http://www.blogger.com/profile/02065317823546496697</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02357292580845573015'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-8384252766790127311</id><published>2010-04-19T15:02:00.000-07:00</published><updated>2010-04-19T15:02:41.263-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='new release'/><category scheme='http://www.blogger.com/atom/ns#' term='installbuilder'/><title type='text'>InstallBuilder 6.3 Released - Localization and Memory Improvements</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;We recently released version 6.3.0 of InstallBuilder, which includes a number of improvements, including the ability to include localized license agreements and set the default installation language based on the previous installation. We have &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;also reduced the memory consumption when unpacking large single-file installers. Other InstallBuilder improvements include:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;Multiple improvements to CD-ROM installers&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Allow HTML license files in Qt mode&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;New installer_builder_version and installer_builder_timestamp built-in variables&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;New&amp;nbsp;&lt;span class="Apple-style-span" style="color: black; line-height: normal;"&gt;&amp;lt;&lt;/span&gt;httpProxyInit&lt;span class="Apple-style-span" style="color: black; line-height: normal;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;action to configure proxy to use with http actions&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;New&amp;nbsp;&lt;span class="Apple-style-span" style="color: black; line-height: normal;"&gt;&amp;lt;&lt;/span&gt;xmlFileGet&lt;span class="Apple-style-span" style="color: black; line-height: normal;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;and&amp;nbsp;&lt;span class="Apple-style-span" style="color: black; line-height: normal;"&gt;&amp;lt;&lt;/span&gt;xmlFileSet&lt;span class="Apple-style-span" style="color: black; line-height: normal;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;actions&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;New&amp;nbsp;&lt;span class="Apple-style-span" style="color: black; line-height: normal;"&gt;&amp;lt;&lt;/span&gt;addScheduledTask&lt;span class="Apple-style-span" style="color: black; line-height: normal;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;and&amp;nbsp;&lt;span class="Apple-style-span" style="color: black; line-height: normal;"&gt;&amp;lt;&lt;/span&gt;deleteScheduledTask&lt;span class="Apple-style-span" style="color: black; line-height: normal;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;Windows actions&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;New .password suffix to mask passwords in log messages&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Support for osx-intel and osx-pcc in platform test&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Add support for FreeBSD 8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Improve the RPM removal process&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="color: black; line-height: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Visit installbuilder.bitrock.com to&amp;nbsp;&lt;/span&gt;&lt;a href="http://installbuilder.bitrock.com/download.html"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;downloa&lt;/span&gt;d&lt;/a&gt;&amp;nbsp;or to view our &lt;a href="http://installbuilder.bitrock.com/changelog.html"&gt;changelog&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-8384252766790127311?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/8384252766790127311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=8384252766790127311' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/8384252766790127311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/8384252766790127311'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2010/04/installbuilder-63-released-localization.html' title='InstallBuilder 6.3 Released - Localization and Memory Improvements'/><author><name>Erica Brescia</name><uri>http://www.blogger.com/profile/02065317823546496697</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02357292580845573015'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-7896118647300083095</id><published>2010-01-25T13:37:00.000-08:00</published><updated>2010-01-26T04:25:27.827-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='new release'/><category scheme='http://www.blogger.com/atom/ns#' term='installbuilder'/><title type='text'>InstallBuilder 6.2.7 Released</title><content type='html'>We just released v6.2.7 of InstallBuilder which includes the following improvements:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;New &amp;lt;useMSDOSPath&amp;gt; property in &amp;lt;runProgram&amp;gt; action to configure whether to use or not 8.3 format in the &amp;lt;program&amp;gt; path&lt;/li&gt;&lt;li&gt;Added encoding property in &amp;lt;addTextToFile&amp;gt; action and &amp;lt;fileContentTest&amp;gt; rule&lt;/li&gt;&lt;li&gt;New &amp;lt;unix2dos&amp;gt; action&lt;/li&gt;&lt;li&gt;Allow file type filters in &amp;lt;fileParameter&amp;gt; dialogs for xwindow, osx and win32 modes&lt;/li&gt;&lt;li&gt;Include InstallBuilder version by default in the generated installers version info&lt;/li&gt;&lt;li&gt;Fixed error with file selection crashing if third-party Explorer extensions change locale&lt;/li&gt;&lt;li&gt;Fixed unpacking error in some Windows environments due to antivirus software locking files&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Check out our &lt;a href="http://installbuilder.bitrock.com/changelog.html"&gt;changelog&lt;/a&gt;&amp;nbsp;and &lt;a href="http://installbuilder.bitrock.com/download.html"&gt;download&lt;/a&gt; the latest release to benefit from the new features and bug fixes.&lt;/div&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-7896118647300083095?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/7896118647300083095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=7896118647300083095' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/7896118647300083095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/7896118647300083095'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2010/01/installbuilder-627-released.html' title='InstallBuilder 6.2.7 Released'/><author><name>Erica Brescia</name><uri>http://www.blogger.com/profile/02065317823546496697</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02357292580845573015'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-2846991749470051416</id><published>2010-01-04T09:20:00.000-08:00</published><updated>2010-02-05T00:27:04.801-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cross platform installer'/><category scheme='http://www.blogger.com/atom/ns#' term='ACL'/><category scheme='http://www.blogger.com/atom/ns#' term='installbuilder'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Handling Access Control List on Windows With BitRock InstallBuilder</title><content type='html'>Access Control List (ACL) is the way in which Windows manages permissions on NTFS file systems. &lt;br /&gt;&lt;br /&gt;There are several command line tools on Windows for handling this: cacls, xcals, icacls. Unfortunately, these tools are not always present in a default Windows installation and depending on the Windows version, different tools may be required. &lt;br /&gt;&lt;br /&gt;BitRock InstallBuilder now provides you with &amp;lt;setWindowsACL&amp;gt; built-in actions. This powerful action for managing permissions allows you to modify ACL on Windows. It is based in the icacls windows tool (&lt;a href="http://technet.microsoft.com/en-us/library/cc753525(WS.10).aspx"&gt;http://technet.microsoft.com/en-us/library/cc753525(WS.10).aspx&lt;/a&gt;). &lt;br /&gt;&lt;br /&gt;You can define the files you want to apply the permissions to. It allows you to specify if you want to "allow" or "deny" access.  You can also match a list of users for which the permissions will be applied, and to specify any of the allowed permissions types.  &lt;br /&gt;&lt;br /&gt;You can define the users either using names or SIDs. Please take into account that special users, like "Everyone" are localized so it is a good practice to use SIDs instead for these users. You can find a list of the well known SIDs  in this article: &lt;br /&gt;&lt;br /&gt;http://support.microsoft.com/kb/243330 &lt;br /&gt;&lt;br /&gt;The most common file permissions are also detailed below: &lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa364399(VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/aa364399(VS.85).aspx&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://support.microsoft.com/kb/243330"&gt;http://support.microsoft.com/kb/243330&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Note that ACL are only supported on NFTS file systems. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example 1 - Basic:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;The following example will allow all users in the system to read, write and execute the files that match the pattern in &amp;lt;files&amp;gt;. For the directories that match that pattern, the users will be allowed to read the content and write new content in that directory. &lt;br /&gt;&lt;pre&gt;&amp;lt;setWindowsACL&amp;gt;&lt;br /&gt;&amp;lt;user&amp;gt;Everyone&amp;lt;/users&amp;gt; &lt;br /&gt;&amp;lt;permissions&amp;gt;file_read_data file_write_data file_execute&amp;lt;/permissions&amp;gt;&lt;br /&gt;&amp;lt;files&amp;gt;c:\myfolder\*;c:\myfolder\*\*;c:\myfolder\*\*\*&amp;lt;/files&amp;gt;&lt;br /&gt;&amp;lt;action&amp;gt;allow&amp;lt;/action&amp;gt;&lt;br /&gt;&amp;lt;/setWindowsACL&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Example 2 – Inheritance:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;It is also possible to define the inheritance level: &lt;br /&gt;&lt;pre&gt;&amp;lt;setWindowsACL&amp;gt;&lt;br /&gt;     &amp;lt;action&amp;gt;deny&amp;lt;/action&amp;gt;&lt;br /&gt;     &amp;lt;files&amp;gt;c:\some\folder&amp;lt;/files&amp;gt;&lt;br /&gt;     &amp;lt;permissions&amp;gt;file_read_data&amp;lt;/permissions&amp;gt;&lt;br /&gt;     &amp;lt;recurseContainers&amp;gt;0&amp;lt;/recurseContainers&amp;gt;&lt;br /&gt;     &amp;lt;recurseObjects&amp;gt;0&amp;lt;/recurseObjects&amp;gt;&lt;br /&gt;     &amp;lt;recurseOneLevelOnly&amp;gt;0&amp;lt;/recurseOneLevelOnly&amp;gt;&lt;br /&gt;     &amp;lt;self&amp;gt;1&amp;lt;/self&amp;gt;&lt;br /&gt;     &amp;lt;users&amp;gt;Everyone&amp;lt;/users&amp;gt;&lt;br /&gt;&amp;lt;/setWindowsACL&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&amp;lt;self&amp;gt; : determines if the objects specified in the &amp;lt;files&amp;gt; tag will be modified or just their children, if the recursion tags are enabled.&lt;/li&gt;&lt;li&gt;&amp;lt;recurseOneLevelOnly&amp;gt; : Only applies inheritance to the first level of hierarchy if one of the below are enabled.&lt;/li&gt;&lt;li&gt;&amp;lt;recurseObjects&amp;gt; : Applies inheritance to objects (files).&lt;/li&gt;&lt;li&gt;&amp;lt;recurseContainers&amp;gt; : Applies inheritance to containers (folders).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example 3 – Using InstallBuilder GUI:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Of course this action is also available from the InstallBuilder GUI. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_NAHlhQTNQmw/SxfI7UnG8lI/AAAAAAAAAPs/wPCRRKAYIyI/s1600-h/handling-access-control-list-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/SxfI7UnG8lI/AAAAAAAAAPs/wPCRRKAYIyI/s400/handling-access-control-list-1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_NAHlhQTNQmw/SxfJRZVRU3I/AAAAAAAAAP0/GKL6cdhTmik/s1600-h/handling-access-control-list-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/SxfJRZVRU3I/AAAAAAAAAP0/GKL6cdhTmik/s400/handling-access-control-list-2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-2846991749470051416?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/2846991749470051416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=2846991749470051416' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/2846991749470051416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/2846991749470051416'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2010/01/handling-access-control-list-on-windows.html' title='Handling Access Control List on Windows With BitRock InstallBuilder'/><author><name>Santiago</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14609551556002628142'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_NAHlhQTNQmw/SxfI7UnG8lI/AAAAAAAAAPs/wPCRRKAYIyI/s72-c/handling-access-control-list-1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-3535181766362919386</id><published>2010-01-04T09:16:00.000-08:00</published><updated>2010-01-04T09:16:34.381-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cross platform installer'/><category scheme='http://www.blogger.com/atom/ns#' term='installbuilder'/><category scheme='http://www.blogger.com/atom/ns#' term='command line'/><category scheme='http://www.blogger.com/atom/ns#' term='multiplatform installer'/><title type='text'>How to use Custom Build Targets</title><content type='html'>One of the most useful features of InstallBuilder is the ability to automate the build process. Installers can be built from a command line prompt such as:&lt;br /&gt;&lt;br /&gt;installbuilder-6.2.6/bin/builder build /path/to/project.xml linux&lt;br /&gt;&lt;br /&gt;The above describes the basic command line build process. You can also make changes to the project prior to the build process to adapt it to your needs using the --setvars flag.&lt;br /&gt;&lt;br /&gt;In most cases, this is used to modify project properties such as the &amp;lt;version&amp;gt;, the &amp;lt;fullName&amp;gt; or the &amp;lt;windowsExecutableIcon&amp;gt;:&lt;br /&gt;&lt;pre&gt;builder build project.xml --setvars version=1.2.3  project.fullName="New Installer Name"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;However, there is much more you can achieve using this functionality.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt; Lets assume we have a complete project, including documentation, some optional applications and a lightweight installer that bundles the main project files. The obvious solution would be to have two projects: one that bundles all of the components and the other with the primary project files. This can be achieved by organizing the files and logic into components and using the &amp;lt;include&amp;gt; directive, which allows us to separate them into multiple .xml files.&lt;br /&gt;&lt;br /&gt;This approach forces us to repeat some logic, such as the project properties. A more efficient approach would be to have a single XML project file and decide whether or not to pack the components based on the build target. For example, we could use:&lt;br /&gt;&lt;br /&gt;builder build project.xml --setvars buildFlavor=full&lt;br /&gt;&lt;br /&gt;To build the complete installer and&lt;br /&gt;&lt;br /&gt;builder build project.xml --setvars buildFlavor=minimal&lt;br /&gt;&lt;br /&gt;to only pack the main application. &lt;br /&gt;&lt;br /&gt;For this approach, you simply have to create a hidden parameter to make the buildFlavor type persistent at runtime and use the &amp;lt;shouldPackRuleList&amp;gt;:&lt;br /&gt;&lt;pre&gt;&amp;lt;project&amp;gt;&lt;br /&gt;   &amp;lt;shortName&amp;gt;myProject&amp;lt;/shortName&amp;gt;&lt;br /&gt;   &amp;lt;version&amp;gt;1.4&amp;lt;/version&amp;gt;&lt;br /&gt;   ...&lt;br /&gt;   &amp;lt;parameterList&amp;gt;&lt;br /&gt;      ...&lt;br /&gt;      &amp;lt;stringParameter name="buildFlavor" value="minimal" ask="0"/&amp;gt; &lt;br /&gt;      ...&lt;br /&gt;   &amp;lt;/parameterList&amp;gt;&lt;br /&gt;   &amp;lt;componentList&amp;gt;&lt;br /&gt;       &amp;lt;component&amp;gt;&lt;br /&gt;          &amp;lt;name&amp;gt;main&amp;lt;/name&amp;gt;&lt;br /&gt;          ...&lt;br /&gt;       &amp;lt;/component&amp;gt;&lt;br /&gt;       &amp;lt;component&amp;gt;&lt;br /&gt;          &amp;lt;name&amp;gt;optionalComponent&amp;lt;/name&amp;gt;&lt;br /&gt;          ...&lt;br /&gt;          &amp;lt;shouldPackRuleList&amp;gt;&lt;br /&gt;              &amp;lt;compareText text="${buildFlavor}" logic="equals" value="full"/&amp;gt;&lt;br /&gt;          &amp;lt;/shouldPackRuleList&amp;gt;&lt;br /&gt;       &amp;lt;/component&amp;gt;&lt;br /&gt;   &amp;lt;/componentList&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You could also combine it with the &amp;lt;preBuildActionList&amp;gt; and customize the particular aspects of the project as in:&lt;br /&gt;&lt;pre&gt;&amp;lt;preBuildActionList&amp;gt;&lt;br /&gt;   &amp;lt;actionGroup&amp;gt;&lt;br /&gt;      &amp;lt;actionList&amp;gt;&lt;br /&gt;          &amp;lt;setInstallerVariable name="project.fullName" value="Basic Product Installation"/&amp;gt;&lt;br /&gt;          &amp;lt;setInstallerVariable name="project.windowsExecutableIcon" value="/path/to/minimal.ico"/&amp;gt;&lt;br /&gt;          &amp;lt;setInstallerVariable name="project.installerFilename" value="minimal-installation.exe"/&amp;gt;&lt;br /&gt;      &amp;lt;/actionList&amp;gt;&lt;br /&gt;      &amp;lt;ruleList&amp;gt;&lt;br /&gt;         &amp;lt;compareText text="${buildFlavor}" logic="equals" value="minimal"/&amp;gt;&lt;br /&gt;      &amp;lt;/ruleList&amp;gt;&lt;br /&gt;   &amp;lt;/actionGroup&amp;gt;&lt;br /&gt;   &amp;lt;actionGroup&amp;gt;&lt;br /&gt;      &amp;lt;actionList&amp;gt;&lt;br /&gt;          &amp;lt;setInstallerVariable name="project.fullName" value="Full Product Installation"/&amp;gt;&lt;br /&gt;          &amp;lt;setInstallerVariable name="project.windowsExecutableIcon" value="/path/to/full.ico"/&amp;gt;&lt;br /&gt;          &amp;lt;setInstallerVariable name="project.installerFilename" value="full-installation.exe"/&amp;gt;&lt;br /&gt;      &amp;lt;/actionList&amp;gt;&lt;br /&gt;      &amp;lt;ruleList&amp;gt;&lt;br /&gt;         &amp;lt;compareText text="${buildFlavor}" logic="equals" value="full"/&amp;gt;&lt;br /&gt;      &amp;lt;/ruleList&amp;gt;&lt;br /&gt;   &amp;lt;/actionGroup&amp;gt;&lt;br /&gt;&amp;lt;/preBuildActionList&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;All the above functionality would work if we defined buildFlavor as a regular variable instead of creating a hidden parameter, but we would not be able to access it at runtime in that case. We can use that functionality, for example, to show a link to a download page at the end of installation if the user wants to download optional applications:&lt;br /&gt;&lt;pre&gt;&amp;lt;finalPageActionList&amp;gt;&lt;br /&gt;    &amp;lt;launchBrowser url="www.downloads.com/optional" progressText="Would you like to visit our website to download additional modules?"&amp;gt;&lt;br /&gt;       &amp;lt;ruleList&amp;gt;&lt;br /&gt;           &amp;lt;compareText text="${buildFlavor}" logic="equals" value="minimal"/&amp;gt;&lt;br /&gt;       &amp;lt;/ruleList&amp;gt;&lt;br /&gt;    &amp;lt;/launchBrowser&amp;gt;&lt;br /&gt;&amp;lt;/finalPageActionList&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Additional information can be found in the links below:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Building through command line:&lt;br /&gt;&lt;a href="http://support.bitrock.com/article/can-bitrock-installbuilder-generate-installers-from-the-command-line"&gt;http://support.bitrock.com/article/can-bitrock-installbuilder-generate-installers-from-the-command-line&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://support.bitrock.com/article/when-i-try-to-build-the-installer-on-windows-from-the-command-line-it-returns-to-the-prompt-immediately-but-no-error-message-is-shown"&gt;http://support.bitrock.com/article/when-i-try-to-build-the-installer-on-windows-from-the-command-line-it-returns-to-the-prompt-immediately-but-no-error-message-is-shown&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Setvars Flag:&lt;br /&gt;&lt;a href="http://support.bitrock.com/article/how-to-set-variables-at-build-time"&gt;http://support.bitrock.com/article/how-to-set-variables-at-build-time&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-3535181766362919386?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/3535181766362919386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=3535181766362919386' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/3535181766362919386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/3535181766362919386'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2010/01/how-to-use-custom-build-targets.html' title='How to use Custom Build Targets'/><author><name>Santiago</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14609551556002628142'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-9092104808806544069</id><published>2009-11-10T06:06:00.000-08:00</published><updated>2009-11-11T01:46:37.141-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='installbuilder'/><category scheme='http://www.blogger.com/atom/ns#' term='automation'/><category scheme='http://www.blogger.com/atom/ns#' term='ant'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>How to Integrate InstallBuilder with Apache Ant and Apache Maven</title><content type='html'>Apache Ant and Apache Maven are two of the most popular tools for building projects. This article explains how to integrate InstallBuilder with these two tools.&lt;br /&gt;&lt;br /&gt;If you use &lt;b&gt;Apache Ant&lt;/b&gt; for building your projects, you can include the following section for building your binary installer.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;build.xml&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;project name=&amp;quot;MyProject&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;exec executable=&amp;quot;/home/bitrock/installbuilder-6.2.4/bin/builder&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;arg line=&amp;quot;build /home/bitrock/installbuilder-6.2.4/projects/demo.xml linux&amp;quot;&amp;gt;&amp;lt;/arg&amp;gt;&lt;br /&gt;    &amp;lt;/exec&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Where the executable tag sets the path of the builder program and the arg tag defines the build process, the location of your InstallBuilder project file and the target platform.&lt;br /&gt;&lt;br /&gt;During the build process, you will see something similar to:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Buildfile: build.xml&lt;br /&gt;     [exec]  Building Demo Project linux&lt;br /&gt;     [exec]  0% ______________ 50% ______________ 100%&lt;br /&gt;     [exec]  #########################################&lt;br /&gt;     [exec] &lt;br /&gt;&lt;br /&gt;BUILD SUCCESSFULTotal time: 1 second&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If you use &lt;b&gt;Apache Maven&lt;/b&gt; for building your projects, you can find below an example of a pom.xml file to build a demo project.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;pom.xml&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;project&amp;gt;&lt;br /&gt;  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;com.mycompany.app&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;my-app&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;1&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;build&amp;gt;&lt;br /&gt;    &amp;lt;plugins&amp;gt;&lt;br /&gt;      &amp;lt;plugin&amp;gt;&lt;br /&gt;        &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;&lt;br /&gt;        &amp;lt;artifactId&amp;gt;exec-maven-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;        &amp;lt;version&amp;gt;1.1&amp;lt;/version&amp;gt;&lt;br /&gt;        &amp;lt;executions&amp;gt;&lt;br /&gt;          &amp;lt;execution&amp;gt;&lt;br /&gt;            &amp;lt;goals&amp;gt;&lt;br /&gt;              &amp;lt;goal&amp;gt;exec&amp;lt;/goal&amp;gt;&lt;br /&gt;            &amp;lt;/goals&amp;gt;&lt;br /&gt;          &amp;lt;/execution&amp;gt;&lt;br /&gt;        &amp;lt;/executions&amp;gt;&lt;br /&gt;        &amp;lt;configuration&amp;gt;&lt;br /&gt;          &amp;lt;executable&amp;gt;/home/bitrock/installbuilder-6.2.4/bin/builder&amp;lt;/executable&amp;gt;&lt;br /&gt;          &amp;lt;arguments&amp;gt;&lt;br /&gt;            &amp;lt;argument&amp;gt;build&amp;lt;/argument&amp;gt;&lt;br /&gt;            &amp;lt;argument&amp;gt;/home/bitrock/installbuilder-6.2.4/projects/demo.xml&amp;lt;/argument&amp;gt;&lt;br /&gt;            &amp;lt;argument&amp;gt;linux&amp;lt;/argument&amp;gt;&lt;br /&gt;          &amp;lt;/arguments&amp;gt;&lt;br /&gt;        &amp;lt;/configuration&amp;gt;&lt;br /&gt;      &amp;lt;/plugin&amp;gt;&lt;br /&gt;    &amp;lt;/plugins&amp;gt;&lt;br /&gt;  &amp;lt;/build&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The executable tag contains the path to the builder program and the argument tags describe the build process, the location of your InstallBuilder project file and the platform target.&lt;br /&gt;&lt;br /&gt;You can launch the build using the following command:&lt;br /&gt;&lt;br /&gt;$ mvn exec:exec&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[INFO] Scanning for projects...&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[INFO] Building Unnamed - com.mycompany.app:my-app:jar:1&lt;br /&gt;[INFO]    task-segment: [exec:exec]&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[INFO] [exec:exec {execution: default-cli}]&lt;br /&gt;[INFO]  Building Demo Project linux&lt;br /&gt;[INFO]  0% ______________ 50% ______________ 100%&lt;br /&gt;[INFO]  #########################################&lt;br /&gt;[INFO] &lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[INFO] BUILD SUCCESSFUL&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[INFO] Total time: 2 seconds&lt;br /&gt;[INFO] Finished at: Thu Nov 05 11:47:09 CET 2009&lt;br /&gt;[INFO] Final Memory: 3M/64M&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-9092104808806544069?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/9092104808806544069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=9092104808806544069' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/9092104808806544069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/9092104808806544069'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2009/11/how-to-integrate-installbuilder-with.html' title='How to Integrate InstallBuilder with Apache Ant and Apache Maven'/><author><name>Santiago</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14609551556002628142'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-4786680221869466909</id><published>2009-10-20T00:44:00.000-07:00</published><updated>2009-11-04T02:50:27.354-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cross platform installer'/><category scheme='http://www.blogger.com/atom/ns#' term='installbuilder'/><category scheme='http://www.blogger.com/atom/ns#' term='cross platform'/><title type='text'>InstallBuilder Action Lists</title><content type='html'>Creating an installer is not as straightforward as most people think. This is especially the case for more sophisticated configurations, such as when you need to execute different platform-specific actions at different stages of the installation process. You may need to check a registry value, create a configuration file, execute a particular command, make substitutions in text files or even connect to an external server via a HTTP POST request. BitRock InstallBuilder includes a number of useful built-in actions to facilitate adding complex functionality to your installer. Actions can be accessed by editing the XML project file directly or in the 'Advanced' section of the InstallBuilder GUI.&lt;br /&gt;&lt;br /&gt;InstallBuilder actions are organized in what are called action lists, which are executed at specific points of the installation process. It is important to understand how and when each action must be performed, what differences exist between action lists inside components and within the primary installer, how the installer will behave when you run it in different installation modes (GUI, text, or unattended) and what happens when you generate rpm or deb packages.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NAHlhQTNQmw/St1vqke1oBI/AAAAAAAAAPc/FSkaY2ndHYw/s1600-h/installbuilder-action-lists.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 221px; height: 400px;" src="http://3.bp.blogspot.com/_NAHlhQTNQmw/St1vqke1oBI/AAAAAAAAAPc/FSkaY2ndHYw/s400/installbuilder-action-lists.png" alt="" id="BLOGGER_PHOTO_ID_5394590705797931026" border="0" /&gt;&lt;/a&gt; You can place your action lists in the main installer project or in one of its components. Action lists include your actions of choice and are executed at a specific point of the installation process as outlined below.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;BitRock InstallBuilder Action Lists (in order of execution)&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;h5&gt;BUILDING THE INSTALLER&lt;/h5&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;preBuildActionList&lt;/b&gt;&lt;br /&gt;Executes before generating the installer file. These actions usually include setting environment variables or performing some kind of processing on the files that will go into the installer before they are packed into it. For multi-platform CDROM installers, the preBuildActionList is executed once at the beginning of the CDROM build, and then again for every one of the specific platform installers.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;postBuildActionList&lt;/b&gt;&lt;br /&gt;Executes after generating the installer file. These actions are usually useful to reverse any changes made to the files during the preBuildActionList or to perform additional actions on the generated installer, such as signing it by invoking an external tool. For multi-platform CDROM installers, the postBuildActionList is executed once for every one of the specific platform installers and then it is executed one final time for the whole CDROM build.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h5&gt;INSTALLATION&lt;/h5&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;preShowHelpActionList&lt;/b&gt;&lt;br /&gt;Executes before help information is displayed.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;initializationActionList&lt;/b&gt;&lt;br /&gt;Executes when the installer has started, just before the parsing of the command line options.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h5&gt;LANGUAGE SELECTION&lt;/h5&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;preInstallationActionlist&lt;/b&gt;&lt;br /&gt;Executes before the first page of the installer is displayed, right after the parsing of the command line options takes place. It is commonly used for setting user-defined installer variables that will be used later on or for detecting a Java (tm) Runtime Environment.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h5&gt;COMPONENTS SELECTION&lt;/h5&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;componentSelectionValidationActionList&lt;/b&gt;&lt;br /&gt;Executes after the component page is displayed to check that the selected components are a valid combination.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h5&gt;PARAMETER PAGES&lt;/h5&gt;&lt;br /&gt;&lt;br /&gt;For each parameterPage, you can specify 3 different action lists: validationActionList,  preShowPageActionList and postShowPageActionList. Note that those actions are not executed if the installer is executed in unattended mode.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;validationActionList&lt;/b&gt;&lt;br /&gt;Executes once the user has specified a value in the user interface page associated with the parameter and has pressed the 'Next' button (or 'Enter' in a text-based interface). The actions can be used to check that the value is valid (for example, that it specifies a path to a valid Perl interpreter). If any of the actions result in an error, an error message will be displayed to the user and the user will be prompted to enter a valid value.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;preShowPageActionList&lt;/b&gt;&lt;br /&gt;Executes before the corresponding parameter page is displayed. This can be useful for changing the value of the parameter before it is displayed.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;postShowPageActionList&lt;/b&gt;&lt;br /&gt;Executes after the corresponding parameter page has been displayed. This can be useful for performing actions or setting environment variables based on the value of the parameter.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h5&gt;COPYING FILES&lt;/h5&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;readyToInstallActionList&lt;/b&gt;&lt;br /&gt;Executes right before the file copying step starts. It is commonly used to execute actions that depend on user input.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Folder actionList&lt;/b&gt;&lt;br /&gt;Executes just after files defined in the particular folder are installed, the next folder files are copied and its actionList executed, etc.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;postInstallationActionList&lt;/b&gt;&lt;br /&gt;Executes after the installation process has taken place but before the uninstaller is created and the final page is displayed.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;postUninstallerCreationActionList&lt;/b&gt;&lt;br /&gt;Executes after the uninstaller has been created but before the final page has been displayed.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;finalPageActionlist&lt;/b&gt;&lt;br /&gt;Executes after the installation has completed and the final page has been displayed to the user. These actions usually include launching the program that has just been installed. For each one of the actions contained in this list, a checkbox will be displayed (or a question in text mode). If the checkbox is selected, then the action will be executed when the 'Finish' button is pressed. The text displayed can be specified in the &lt;progresstext&gt; property.&lt;/progresstext&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h5&gt;UNINSTALLATION&lt;/h5&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;preUinstallationActionList&lt;/b&gt;&lt;br /&gt;Executes before the uninstallation process takes place, such as unsetting user-defined installer variables or deleting files created after installation occured.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;postUninstallationActionList&lt;/b&gt;&lt;br /&gt;Executes after the uninstallation process takes place.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h5&gt;SPECIAL ACTION LISTS&lt;/h5&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;installationAbortedActionList&lt;/b&gt;&lt;br /&gt;Executes when the installation process is aborted.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Order of Execution of Action Lists&lt;/b&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NAHlhQTNQmw/St2Nt7VYjfI/AAAAAAAAAPk/nAVGjN-mJRE/s1600-h/action-lists-execution-order-installbuilder.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 250px; height: 269px;" src="http://3.bp.blogspot.com/_NAHlhQTNQmw/St2Nt7VYjfI/AAAAAAAAAPk/nAVGjN-mJRE/s400/action-lists-execution-order-installbuilder.png" alt="" id="BLOGGER_PHOTO_ID_5394623748820733426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Each action list may be included in the main project or inside the components. Lets take an initializationActionList as an example. We have one main initializationActionList and 4 others in the components A, B, C and D. The components are declared following the order A, B, C, D (A is the first entry and D is the last one). In this case, the main initializationActionList is executed first and then each component's action lists are executed (A, B, C, D - the order of component declaration is important).&lt;br /&gt;&lt;br /&gt;We can divide all action lists into two groups based on what is executed earlier: main project or components action lists:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the main project action lists then components onespreBuildActionList, initializationActionList, preIstallationActionList, readyToInstallActionList, preUninstallationActionList&lt;/li&gt;&lt;li&gt;components action lists then the main project onespostBuildActionList, postInstallationActionList, postUninstallationActionList&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The installer executes action lists by group, which means that first all initializationActionList actions take place and then all preInstallationActionList actions are executed.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Unattended mode,  RPM and DEB packages&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;These are special cases. There is no interaction with the user and the following action lists are not executed:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;componentSelectionValidationActionList&lt;/li&gt;&lt;br /&gt;&lt;li&gt;finalPageActionList&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Any parameter's validationActionList&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Any parameter's preShowPageActionList&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Any parameter's postShowPageActionList&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The installationAbortedActionList will only be executed if the error was generated by any of the actions performed directly by the installer. If the error is generated during the file installation step, which is performed by the RPM / DEB package manager, the BitRock installer application will not be notified and therefore the installationAbortedActionList will not be executed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-4786680221869466909?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/4786680221869466909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=4786680221869466909' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/4786680221869466909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/4786680221869466909'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2009/10/installbuilder-action-lists.html' title='InstallBuilder Action Lists'/><author><name>Santiago</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14609551556002628142'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_NAHlhQTNQmw/St1vqke1oBI/AAAAAAAAAPc/FSkaY2ndHYw/s72-c/installbuilder-action-lists.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-4451071427415762770</id><published>2009-10-13T01:08:00.000-07:00</published><updated>2009-10-20T02:07:05.097-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unattended'/><category scheme='http://www.blogger.com/atom/ns#' term='automated'/><category scheme='http://www.blogger.com/atom/ns#' term='command line'/><category scheme='http://www.blogger.com/atom/ns#' term='silent'/><category scheme='http://www.blogger.com/atom/ns#' term='automatic'/><category scheme='http://www.blogger.com/atom/ns#' term='multiplatform installer'/><title type='text'>Unattended Mode</title><content type='html'>As you may know, installers generated with InstallBuilder provide different execution modes using the command line option "--mode". The mode "unattended" is particularly useful when we need to incorporate installations into an automated process. With this mode, the installer will not prompt the user for any information and will instead take the default settings configured for each of the parameters. That way, it is possible to incorporate the installer execution into scripts since no input is required from the user during the installation.&lt;br /&gt;&lt;br /&gt;Note that you are not forced to use only the default values when running the installer in this mode. You can also define the values through command line switches which are generated for each parameter definition inside the InstallBuilder project. If we want to use specific values, we should run the installation as follows:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;"$ installer_binary --mode unattended --param1 value1 --param2 value2 ...."&lt;br /&gt;&lt;br /&gt;As the number of parameters grows, it may be best to define the options values inside a text file. This is possible using the command line switch "--optionfile &amp;lt;filename&amp;gt;". This will instruct the installer to take the values from the specified file. Here is an example:&lt;br /&gt;&lt;br /&gt;"$ installer_binary --mode unattended  --optionfile optionfile"&lt;br /&gt;&lt;br /&gt;Where optionfile should contain a list of pairs &amp;lt;key&amp;gt;=&amp;lt;value&amp;gt;. For instance:&lt;br /&gt;&lt;br /&gt;param1=value1&lt;br /&gt;param2=value2&lt;br /&gt;....&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Configuring Unattended Mode Parameters in an Installer&lt;/h4&gt;&lt;br /&gt;Let's take a look at how you can configure the installer so it behaves as expected in unattended mode and provides the appropriate feedback to the user through "--help".&lt;br /&gt;&lt;br /&gt;In order to configure the default values for each parameter, you need to edit the field "default" which appears in the "Main" tab inside parameter window or adding the property "default" to its definition inside the XML file:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/StRJXqFZWfI/AAAAAAAAAO8/bUExSZnxHwI/s1600-h/unattended-mode-install-installbuilder-1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px; height: 345px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/StRJXqFZWfI/AAAAAAAAAO8/bUExSZnxHwI/s1600/unattended-mode-install-installbuilder-1.png" alt="" id="BLOGGER_PHOTO_ID_5392015324652067314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;stringParameter&amp;gt;&lt;br /&gt; &amp;lt;name&amp;gt;port&amp;lt;/name&amp;gt;&lt;br /&gt; &amp;lt;default&amp;gt;8080&amp;lt;/default&amp;gt;&lt;br /&gt;&amp;lt;/stringParameter&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As mentioned earlier, each parameter will have its own command line option. When the installer is run with the --help option, the whole list of available command line switches is displayed. Each parameter is shown with a message similar to:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;--option_name  option_description&lt;br /&gt;   default: option_default_value&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The given information can be modified using the properties inside the "Command Line" tab in the parameter window or adding the properties "cliOptionName", "cliOptionText" and "cliOptionShow" to its definition in the XML file:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; option_name will be set to the value in "Command Line Name" (cliOptionName) or to the property name if it is not defined.&lt;/li&gt;&lt;br /&gt;&lt;li&gt; option_description will be set to the value in "Command Line Text" (cliOptionText) or to the property description if it is not defined.&lt;/li&gt;&lt;br /&gt;&lt;li&gt; It is also possible to hide parameters from the --help menu by setting the option "Show in Command Line" (cliOptionShow) to false.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NAHlhQTNQmw/StRJ8IVk1WI/AAAAAAAAAPE/rTl2zIRn7cU/s1600-h/unattended-mode-install-installbuilder-2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px; height: 345px;" src="http://3.bp.blogspot.com/_NAHlhQTNQmw/StRJ8IVk1WI/AAAAAAAAAPE/rTl2zIRn7cU/s1600/unattended-mode-install-installbuilder-2.png" alt="" id="BLOGGER_PHOTO_ID_5392015951248282978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;stringParameter&amp;gt;&lt;br /&gt; &amp;lt;name&amp;gt;port&amp;lt;/name&amp;gt;&lt;br /&gt; &amp;lt;default&amp;gt;8080&amp;lt;/default&amp;gt;&lt;br /&gt; &amp;lt;description&amp;gt;...&amp;lt;/description&amp;gt;&lt;br /&gt; &amp;lt;cliOptionName&amp;gt;webport&amp;lt;/cliOptionName&amp;gt;&lt;br /&gt; &amp;lt;cliOptionText&amp;gt;Web server port&amp;lt;/cliOptionText&amp;gt;&lt;br /&gt; &amp;lt;cliOptionShow&amp;gt;1&amp;lt;/cliOptionShow&amp;gt;&lt;br /&gt;&amp;lt;/stringParameter&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Using this settings, help will show the following entry:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;--webport   Web server port&lt;br /&gt;    default: 8080&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Additional Switches&lt;/h4&gt;&lt;br /&gt;As previously mentioned, each parameter will have its own command line option. However, there are additional command line switches that may be useful while performing installations in unattended mode.&lt;br /&gt;&lt;br /&gt;You can enable and disable components from the command line using the following options:&lt;br /&gt;&lt;br /&gt;--enable-components name1,name2,name3&lt;br /&gt;--disable-components name1,name2,name3&lt;br /&gt;&lt;br /&gt;where name1, name2,... are the names inside the &amp;lt;name&amp;gt; tag of each component. Component names are case sensitive.&lt;br /&gt;&lt;br /&gt;You can also modify the user interface shown during the installation process adding the option "--unattendedmodeui" It can take the values:&lt;br /&gt;&lt;br /&gt;"none" : no progress bar will be shown when performing an unattended installation (default).&lt;br /&gt;&lt;br /&gt;"minimal" : this value will show a graphical progress bar during an unattended installation.&lt;br /&gt;&lt;br /&gt;"minimalWithDialogs" : In this mode, pop-ups will also be displayed in addition to the progress bar of the minimal mode.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Behaviour Modifications in Unattended Mode&lt;/h4&gt;&lt;br /&gt;While using unattended mode, the installation process is altered. It is important to note that all of the actions inside action lists that require user interaction are &lt;b&gt;not&lt;/b&gt; executed, including those inside:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;componentselectionvalidationactionlist&amp;gt;&lt;br /&gt;&amp;lt;finalpageactionlist&amp;gt;&lt;br /&gt;Any parameter's &amp;lt;validationactionlist&amp;gt;&lt;br /&gt;Any parameter's &amp;lt;preshowpageactionlist&amp;gt;&lt;br /&gt;Any parameter's &amp;lt;postshowpageactionlist&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Also, be sure to take into account that during "initializationActionList", the parameters haven't yet been initialized with the values provided through the command line switches. They will contain the default values.&lt;br /&gt;&lt;br /&gt;You may need to modify your installer behavior according to the mode used. In order to do this, you can use the "${installer_ui}" variable, which contains the mode that has been used to run the installer (gui, text, unattended).&lt;br /&gt;&lt;br /&gt;You can define specific actions for unattended mode or prevent any actions from running in that mode by adding one of the following rules inside the specific ruleList.&lt;br /&gt;&lt;br /&gt;&amp;lt;compareText text="${installer_ui}" logic="does_not_equal" value="unattended"/&amp;gt;&lt;br /&gt;&amp;lt;compareText text="${installer_ui}" logic="equals" value="unattended"/&amp;gt;&lt;br /&gt;&lt;br /&gt;For example, you can de-select a component at initialization if the installer detects that it is in unattended mode as follows:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;initializationActionList&amp;gt;&lt;br /&gt;&amp;lt;componentSelection deselect="componentname"&amp;gt;&lt;br /&gt; &amp;lt;ruleList&amp;gt;&lt;br /&gt; &amp;lt;compareText text="${installer_ui}" logic="equals" value="unattended"/&amp;gt;&lt;br /&gt; &amp;lt;/ruleList&amp;gt;&lt;br /&gt;&amp;lt;/componentSelection&amp;gt;&lt;br /&gt;&amp;lt;/initialiationActionList&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Unattended Uninstallation&lt;/h4&gt;&lt;br /&gt;Unattended mode is also present in the uninstaller and it behaves in a similar way. This functionality may be useful for performing an uninstallation operation in the background without requiring any user feedback during an upgrade. Assuming that the path to the uninstaller is known, we could add the following action before starting to copy the new files:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;runProgram&amp;gt;&lt;br /&gt; &amp;lt;program&amp;gt;${uninstaller_path}&amp;lt;/program&amp;gt;&lt;br /&gt; &amp;lt;programArguments&amp;gt;--mode unattended&amp;lt;/programArguments&amp;gt;&lt;br /&gt; &amp;lt;ruleList&amp;gt;&lt;br /&gt;     &amp;lt;fileTest&amp;gt;&lt;br /&gt;         &amp;lt;path&amp;gt;${uninstaller_path}&amp;lt;/path&amp;gt;&lt;br /&gt;         &amp;lt;condition&amp;gt;exists&amp;lt;/condition&amp;gt;&lt;br /&gt;     &amp;lt;/fileTest&amp;gt;&lt;br /&gt; &amp;lt;/ruleList&amp;gt;&lt;br /&gt;&amp;lt;/runProgram&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Of course, we may also need to backup the application data before running the uninstaller and recover it once the new version is in place.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Usage Examples&lt;/h4&gt;&lt;br /&gt;Unattended mode may be used to automate any process that requires performing several installations with different settings. A few examples are provided below.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Simple Installer Tests&lt;/h4&gt;&lt;br /&gt;After building an installer, we may want to check to make sure it will work correctly while being run with different configurations. Instead of doing this by hand each time you build a new version, you can write a script that will try to install the application and ensure that no errors are thrown during the process. This script may use different option files containing the specific settings to be tested.&lt;br /&gt;&lt;br /&gt;For example, under Unix systems we may implement a shell script as follows:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;OPTIONFILES_PATH="option_files/"&lt;br /&gt;for optionfile in `ls $OPTIONFILES_PATH | cat`&lt;br /&gt;do&lt;br /&gt;installer.bin --mode-unattended --optionfile $optionfile&lt;br /&gt;if [ $? -eq 0 ]&lt;br /&gt;then&lt;br /&gt; echo "Test $optionfile: OK"&lt;br /&gt;else&lt;br /&gt; echo "Test $optionfile: FAILED"&lt;br /&gt;fi&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Each of  the configurations that we want to test should be defined inside optionfile in option_files folder. We may want to run the script in different machines or operating systems to detect if any parameter combination causes the installer to fail. Additional checks may be also included once each installation finishes.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Simple Automated Script&lt;/h4&gt;&lt;br /&gt;Let's imagine you have an application which could act as client or server. Each client installation has to be configured to connect to a specific server. If you want to perform a network installation with several client machines and one server you may proceed as follows:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; Define the necessary parameters inside the installer. For instance: nodetype, servernode, servernodeport.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;stringParameter name="nodetype"   default="client"/&amp;gt;&lt;br /&gt;&amp;lt;stringParameter name="servernode"   default=""/&amp;gt;&lt;br /&gt;&amp;lt;stringParameter name="servernodeport"   default=""/&amp;gt;&lt;br /&gt;&amp;lt;stringParameter name="port"   default="8080"/&amp;gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Write the different optionfile configurations needed:&lt;br /&gt;&lt;pre&gt;server_options.ini:&lt;br /&gt;nodetype=server&lt;br /&gt;port=8003&lt;br /&gt;client_options.ini:&lt;br /&gt;nodetype=client&lt;br /&gt;servernode=192.168.1.200&lt;br /&gt;serverport=8003&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Write a simple script which performs the installations in unattended mode with the proper option files. In Unix systems we may do something like:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;CLIENT_OPTIONS=client_options.ini&lt;br /&gt;SERVER_OPTIONS=server_options.ini&lt;br /&gt;&lt;br /&gt;SERVER=192.168.1.200&lt;br /&gt;CLIENTS="192.168.1.201 192.168.1.202 192.168.1.203 192.168.1.204"&lt;br /&gt;INSTALLER=node-installer.bin&lt;br /&gt;&lt;br /&gt;scp $INSTALLER $SERVER:/tmp&lt;br /&gt;scp $SERVER_OPTIONS $SERVER:/tmp&lt;br /&gt;ssh $SERVER chmod +x /tmp/$INSTALLER&lt;br /&gt;ssh $SERVER /tmp/$INSTALLER --mode unattended --optionfile /tmp/$SERVER_OPTIONS&lt;br /&gt;&lt;br /&gt;for c in $CLIENTS&lt;br /&gt;do&lt;br /&gt; scp $INSTALLER $c:/tmp&lt;br /&gt; scp $CLIENT_OPTIONS $c:/tmp&lt;br /&gt; ssh $c chmod +x /tmp/$INSTALLER&lt;br /&gt; ssh $c /tmp/$INSTALLER --mode unattended --optionfile /tmp/$CLIENT_OPTIONS&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; After running the script, all the machines will be configured with the appropriate configuration and without requiring any user interaction in the process.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;We are assuming that the proper ssh keys have been configured in the network and the user running the script has access to all of them and required permissions.&lt;br /&gt;&lt;br /&gt;As you can see, the script acts as a template network configuration that may be used on different environments.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Modular Installer&lt;/h4&gt;&lt;br /&gt;Let's imagine that we have an application which contains several modules. We want to have the ability to install/uninstall them separately with a global installer / uninstaller. How could we achieve this ?&lt;br /&gt;&lt;br /&gt;One possible approach is to use unattended mode. We could generate one installer for each module and then construct a primary installer which will package them as binary files. When the primary installation is performed, each of the additional installers would be run in unattended mode in the background. The primary installation process should ask for the necessary parameters and send them to the background installations through the command line switches. For example, we can use a parameter "prefix" to tell each module where it should be installed.&lt;br /&gt;&lt;br /&gt;Each installation will generate its own uninstaller so they can be run separately. Once again, to achieve global uninstallation, we will need to run each uninstaller in unattended mode.&lt;br /&gt;&lt;br /&gt;Taking all of this into account, we can define a component inside primary installer for each module as follows:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;component&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;module1&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;canBeEdited&amp;gt;1&amp;lt;/canBeEdited&amp;gt;&lt;br /&gt;&amp;lt;selected&amp;gt;1&amp;lt;/selected&amp;gt;&lt;br /&gt;&amp;lt;show&amp;gt;1&amp;lt;/show&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;folderList&amp;gt;&lt;br /&gt; &amp;lt;folder&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;module1_installer&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;destination&amp;gt;${installdir}&amp;lt;/destination&amp;gt;&lt;br /&gt;   &amp;lt;platforms&amp;gt;all&amp;lt;/platforms&amp;gt;&lt;br /&gt;   &amp;lt;distributionFileList&amp;gt;&lt;br /&gt;      &amp;lt;distributionFile origin="module1_installer.bin"/&amp;gt;&lt;br /&gt;   &amp;lt;/distributionFileList&amp;gt;&lt;br /&gt;   &amp;lt;actionList&amp;gt;&lt;br /&gt;     &amp;lt;runProgram&amp;gt;&lt;br /&gt;       &amp;lt;program&amp;gt;${installdir}/module1_installer.bin&amp;lt;/program&amp;gt;&lt;br /&gt;       &amp;lt;programArguments&amp;gt;--mode unattended --prefix=${installdir}/module1&amp;lt;/programArguments&amp;gt;&lt;br /&gt;     &amp;lt;/runProgram&amp;gt;&lt;br /&gt;   &amp;lt;/actionList&amp;gt;&lt;br /&gt;   &amp;lt;deleteFile path="${installdir}/module1_installer.bin"/&amp;gt;&lt;br /&gt; &amp;lt;/folder&amp;gt;&lt;br /&gt;&amp;lt;/folderList&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;postUninstallationActionList&amp;gt;&lt;br /&gt; &amp;lt;runProgram&amp;gt;&lt;br /&gt;   &amp;lt;program&amp;gt;${installdir}/module1/uninstaller&amp;lt;/program&amp;gt;&lt;br /&gt;   &amp;lt;programArguments&amp;gt;--mode unattended&amp;lt;/programArguments&amp;gt;&lt;br /&gt;   &amp;lt;ruleList&amp;gt;&lt;br /&gt;     &amp;lt;fileTest&amp;gt;&lt;br /&gt;       &amp;lt;path&amp;gt;${installdir}/module1/uninstaller&amp;lt;/path&amp;gt;&lt;br /&gt;       &amp;lt;condition&amp;gt;exists&amp;lt;/condition&amp;gt;&lt;br /&gt;     &amp;lt;/fileTest&amp;gt;&lt;br /&gt;   &amp;lt;/ruleList&amp;gt;&lt;br /&gt; &amp;lt;/runProgram&amp;gt;&lt;br /&gt;&amp;lt;/postUninstallationActionList&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/component&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As we can see, the component packs the module installer. During installation, it is copied to the installation directory and executed with the specific parameters. Then, the binary is removed.&lt;br /&gt;&lt;br /&gt;During uninstallation, we run the module uninstaller, checking to make sure that the binary is still there, as it might have already been uninstalled by the user.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-4451071427415762770?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/4451071427415762770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=4451071427415762770' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/4451071427415762770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/4451071427415762770'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2009/10/unattended-mode.html' title='Unattended Mode'/><author><name>Santiago</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14609551556002628142'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_NAHlhQTNQmw/StRJXqFZWfI/AAAAAAAAAO8/bUExSZnxHwI/s72-c/unattended-mode-install-installbuilder-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-3763700686607227134</id><published>2009-10-07T04:40:00.000-07:00</published><updated>2009-10-07T11:11:31.433-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='multiplatform'/><category scheme='http://www.blogger.com/atom/ns#' term='OS X installer'/><category scheme='http://www.blogger.com/atom/ns#' term='qt'/><category scheme='http://www.blogger.com/atom/ns#' term='installshield'/><category scheme='http://www.blogger.com/atom/ns#' term='bitrock'/><category scheme='http://www.blogger.com/atom/ns#' term='java installer'/><category scheme='http://www.blogger.com/atom/ns#' term='installer'/><category scheme='http://www.blogger.com/atom/ns#' term='cross platform'/><title type='text'>InstallBuilder 6.2.4 Now Available</title><content type='html'>We just released version 6.2.4 of InstallBuilder our crossplatform installation and automatic update tool. The new release includes several enhancements, such as an improved builder tool on Mac OS X x86 and unattended install support for the autoupdate mechanism. The addition of unattended mode in the automatic update tool means that updates can be applied silently without user interaction. A complete list of improvements can be viewed in &lt;a href="http://installbuilder.bitrock.com/changelog.html"&gt;InstallBuilder's changelog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-3763700686607227134?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/3763700686607227134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=3763700686607227134' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/3763700686607227134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/3763700686607227134'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2009/10/installbuilder-624-now-available.html' title='InstallBuilder 6.2.4 Now Available'/><author><name>Santiago</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14609551556002628142'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-6271972319142024284</id><published>2009-09-24T02:10:00.000-07:00</published><updated>2009-11-04T02:39:12.238-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='deploy'/><category scheme='http://www.blogger.com/atom/ns#' term='package'/><category scheme='http://www.blogger.com/atom/ns#' term='cross platform installer'/><category scheme='http://www.blogger.com/atom/ns#' term='installbuilder'/><category scheme='http://www.blogger.com/atom/ns#' term='bundle'/><category scheme='http://www.blogger.com/atom/ns#' term='java installer'/><category scheme='http://www.blogger.com/atom/ns#' term='tomcat'/><category scheme='http://www.blogger.com/atom/ns#' term='installer'/><category scheme='http://www.blogger.com/atom/ns#' term='cross platform'/><title type='text'>Bundle Tomcat in Your BitRock InstallBuilder installer</title><content type='html'>If you develop a Java Web Application, you may want to create an installer and redistribute Tomcat together with your software. This allows your users to avoid the time-consuming process of installing and configuring Tomcat in order to use your software and guarantees that the optimal version is used. In this article, we explain how to bundle Tomcat into a BitRock installer. We also provide &lt;a href="http://installbuilder.bitrock.com/blog-resources/bundled-tomcat-project-files.zip"&gt;the code&lt;/a&gt; so you can start with that and create an installer that not only installs your software but also configures the Tomcat server according to your requirements.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Product Details&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;We are going to create a demo installer for installing Tomcat. Of course, you can develop more advanced functionality than what we'll show today, but in this installer we'll focus on the basics. First, we are going to configure the Product Details of our installer. The License File will be shown at the beginning of the installation. The user must agree to it to be able to proceed with the installation process.&lt;br /&gt;At the end of the installation process, an option to view the Readme file will appear if we provide a Readme File field in the Product Details section.&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/SrnkmlOndoI/AAAAAAAAAIc/IDoEcnj83tc/s1600/productinfo1.png" alt="" id="BLOGGER_PHOTO_ID_5384586180977718914" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="clear: both;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Check installation requirements&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/Srnq8oXmHwI/AAAAAAAAAIk/IhDVRG55Rlk/s1600/preinstallation1.png" alt="" id="BLOGGER_PHOTO_ID_5384593156847574786" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_NAHlhQTNQmw/Srns2cDYoRI/AAAAAAAAAI0/W3vUPL0le2Y/s1600/autodetectjava.png" alt="" id="BLOGGER_PHOTO_ID_5384595249485619474" align="right" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;For this installer, we want to require the user to have a valid version of Java installed in the system to be able to continue the installation. For this, we will add an action to the pre-installation action list to look for Java in the system. The Autodetect Java action allows us to specify the minumum Java version required, vendor and if a JDK is required or if a JRE will also work.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Screen and validations (I)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/Srn6weAfC6I/AAAAAAAAAJE/aIqXwInvYZ0/s1600/parameters1.png" alt="" id="BLOGGER_PHOTO_ID_5384610540093901730" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Once we ensure that the user's machine has the required software installed, we will ask the user for some information for the installation. We use the Parameters section for this.&lt;br /&gt;&lt;br /&gt;We will prompt the user for:&lt;br /&gt;&lt;ul class="blank-list"&gt;&lt;li&gt; Installation directory&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Tomcat HTTP port&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Tomcat Shutdown port&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;We will also add validation rules to check that the information provided by the user is correct.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Screen and validations (II)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Installation Directory&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/Srn_54o6wLI/AAAAAAAAAJU/tyxcnZJmIAk/s1600/parameters2.png" alt="" id="BLOGGER_PHOTO_ID_5384616199419773106" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;This parameter is created by default as it is used in most installations.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/SroBHE-AvDI/AAAAAAAAAJc/UUiMBEAv_rQ/s1600-h/parameters3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/SroBHE-AvDI/AAAAAAAAAJc/UUiMBEAv_rQ/s400/parameters3.png" alt="" id="BLOGGER_PHOTO_ID_5384617525579398194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Screen and validations (III)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Tomcat Configuration&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Next, we will ask the user which ports we should use for Tomcat. We want to prompt the user for the HTTP port and the Shutdown Port. To minimize the number of screens in the installation process, we will group these ports in a Parameter Group, which will ask for all parameters on one screen.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NAHlhQTNQmw/SroBHsl9bEI/AAAAAAAAAJk/PHDUtcYQcRI/s1600-h/parameters4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/SroBHsl9bEI/AAAAAAAAAJk/PHDUtcYQcRI/s400/parameters4.png" alt="" id="BLOGGER_PHOTO_ID_5384617536215936066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The internal name that we will use for this screen will be tomcat_configuration and the title will be 'Tomcat Configuration'.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroBH32qN3I/AAAAAAAAAJs/arLMxTY0fn0/s1600-h/parameters5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroBH32qN3I/AAAAAAAAAJs/arLMxTY0fn0/s400/parameters5.png" alt="" id="BLOGGER_PHOTO_ID_5384617539238770546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Screen and validations (IV)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;We will use two String parameters. Each one will represent one of the ports that we want to configure.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NAHlhQTNQmw/SroBIk60UOI/AAAAAAAAAJ8/dycGKSPxMiw/s1600-h/parameters7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://3.bp.blogspot.com/_NAHlhQTNQmw/SroBIk60UOI/AAAAAAAAAJ8/dycGKSPxMiw/s400/parameters7.png" alt="" id="BLOGGER_PHOTO_ID_5384617551335805154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We'll focus on the tomcat_http_port. The steps for the tomcat_shutdown_port will be very similar. You will just need to change the default value and the description.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NAHlhQTNQmw/SroCCetpNoI/AAAAAAAAAKE/-3EHwDbwigQ/s1600-h/parameters8.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://3.bp.blogspot.com/_NAHlhQTNQmw/SroCCetpNoI/AAAAAAAAAKE/-3EHwDbwigQ/s400/parameters8.png" alt="" id="BLOGGER_PHOTO_ID_5384618546102351490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Screen and validations (V)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;In order to ensure the application starts correctly once it is installed, we will check that the selected ports are free and can be used for the Tomcat configuration.&lt;br /&gt;&lt;br /&gt;In the Validation Action for each port, we will add a Throw Error action. A Throw Error action usually exits the installer. However, the behavior is a bit different when it is used in a Validation Action context; after showing the error message, the installer will return to the screen allowing the user to re-enter the parameters.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/SroCC9r5ehI/AAAAAAAAAKU/6J7yUHmasBI/s1600-h/parameters10.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/SroCC9r5ehI/AAAAAAAAAKU/6J7yUHmasBI/s400/parameters10.png" alt="" id="BLOGGER_PHOTO_ID_5384618554416527890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the Throw Error action we will configure the text that we want to show in case the selected port is already taken.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NAHlhQTNQmw/SroC2f8-s1I/AAAAAAAAAK0/rhWtVmAhCZ0/s1600-h/parameters14.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/SroC2f8-s1I/AAAAAAAAAK0/rhWtVmAhCZ0/s400/parameters14.png" alt="" id="BLOGGER_PHOTO_ID_5384619439788307282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Screen and validations (VI)&lt;/h2&gt;In order to throw the error only if the port is not free, we will add a Port Test rule in the Throw Error action. The error will only be thrown if the condition 'cannot bind to selected port' is true. The port selected by the user is stored (according to the rest of the document) in the variable tomcat_http_port. We want to check its value, so in Port we will enter ${tomcat_http_port}.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NAHlhQTNQmw/SroCDtGNezI/AAAAAAAAAKk/2OF08leXszM/s1600-h/parameters12.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/SroCDtGNezI/AAAAAAAAAKk/2OF08leXszM/s400/parameters12.png" alt="" id="BLOGGER_PHOTO_ID_5384618567143357234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The same steps are valid for the tomcat_shutdown_port.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroC2Jc5HDI/AAAAAAAAAKs/kafppUXsPc0/s1600-h/parameters13.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroC2Jc5HDI/AAAAAAAAAKs/kafppUXsPc0/s400/parameters13.png" alt="" id="BLOGGER_PHOTO_ID_5384619433748143154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Folders and Files (I)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;The next step in the installation process will be to copy the Tomcat files to the user's machine.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroC2m4zT6I/AAAAAAAAAK8/U-G1ux8LU2w/s1600-h/parameters15.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroC2m4zT6I/AAAAAAAAAK8/U-G1ux8LU2w/s400/parameters15.png" alt="" id="BLOGGER_PHOTO_ID_5384619441649831842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As Tomcat is a Java application, the same files will run on Windows and Linux. We'll create a new InstallBuilder folder which will be installed in the installation directory selected by the user, ${installdir}. That will be installed in 'All Platforms' and we'll add the Tomcat directory that we want to pack.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroC27U-l3I/AAAAAAAAALE/BN5CNp-wjz8/s1600-h/parameters16.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroC27U-l3I/AAAAAAAAALE/BN5CNp-wjz8/s400/parameters16.png" alt="" id="BLOGGER_PHOTO_ID_5384619447136720754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Folders and Files (II)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;To make it easier for the user to start and stop Tomcat, we have created some start/stop scripts.&lt;br /&gt;&lt;br /&gt;These scripts differ for each platform, so we'll add two new folders: one setting Linux as platform and the other setting Windows as platform.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NAHlhQTNQmw/SroC3Uee2RI/AAAAAAAAALM/PkbMNSY7PI8/s1600-h/parameters17.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/SroC3Uee2RI/AAAAAAAAALM/PkbMNSY7PI8/s400/parameters17.png" alt="" id="BLOGGER_PHOTO_ID_5384619453887469842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can set the description and shortname you prefer for each folder. In both cases the destination of these scripts will be ${installdir}.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroDZrc_8vI/AAAAAAAAALc/6Yo9Q77lkWM/s1600-h/parameters19.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroDZrc_8vI/AAAAAAAAALc/6Yo9Q77lkWM/s400/parameters19.png" alt="" id="BLOGGER_PHOTO_ID_5384620044170818290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Folders and Files (III)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Now you will need to add the script files for each platform: .sh for the Linux folder and .bat for the Windows folder.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/SroDZPbgDMI/AAAAAAAAALU/EYKHEjuGZ4A/s1600-h/parameters18.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/SroDZPbgDMI/AAAAAAAAALU/EYKHEjuGZ4A/s400/parameters18.png" alt="" id="BLOGGER_PHOTO_ID_5384620036648340674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroDZ4gSttI/AAAAAAAAALk/BU2cyYYKkWE/s1600-h/parameters20.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroDZ4gSttI/AAAAAAAAALk/BU2cyYYKkWE/s400/parameters20.png" alt="" id="BLOGGER_PHOTO_ID_5384620047674291922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Windows Start Menu Entries (I)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;In the File section we can also configure the Start Menu entries for our application.&lt;br /&gt;&lt;br /&gt;We'll add entries for:&lt;br /&gt;&lt;br /&gt;&lt;ul class="blank-list"&gt;&lt;br /&gt;&lt;li&gt;Start Tomcat: This will be an 'application' type shortcut pointing to the start .bat script we are including.&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Stop Tomcat: This will be an 'application' type shortcut pointing to the stop .bat script we are including.&lt;/li&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NAHlhQTNQmw/SroGkUT940I/AAAAAAAAAOc/xKwXQUtElqg/s1600-h/parameters25.png"&gt;&lt;img style="margin: 0px auto 10px 10px; display: block; text-align: center; float: right; cursor: pointer; width: 262px; height: 84px;" src="http://3.bp.blogspot.com/_NAHlhQTNQmw/SroGkUT940I/AAAAAAAAAOc/xKwXQUtElqg/s400/parameters25.png" alt="" id="BLOGGER_PHOTO_ID_5384623525472363330" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;li&gt; Uninstall Tomcat:  This will be an 'application' type shortcut pointing to the uninstaller.&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Launch Tomcat application:  This will be a 'url' type shortcut pointing to the url where the Tomcat application can be accessed.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroDafBk71I/AAAAAAAAALs/Oy3xXRHnQ58/s1600-h/parameters21.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroDafBk71I/AAAAAAAAALs/Oy3xXRHnQ58/s400/parameters21.png" alt="" id="BLOGGER_PHOTO_ID_5384620058014445394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Windows Start Menu Entries (II)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NAHlhQTNQmw/SroDagWEq3I/AAAAAAAAAL0/gt0KSAwbEB8/s1600-h/parameters22.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://3.bp.blogspot.com/_NAHlhQTNQmw/SroDagWEq3I/AAAAAAAAAL0/gt0KSAwbEB8/s400/parameters22.png" alt="" id="BLOGGER_PHOTO_ID_5384620058368846706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NAHlhQTNQmw/SroD3nIcm2I/AAAAAAAAAL8/ylivj3eyBRs/s1600-h/parameters23.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 316px;" src="http://3.bp.blogspot.com/_NAHlhQTNQmw/SroD3nIcm2I/AAAAAAAAAL8/ylivj3eyBRs/s400/parameters23.png" alt="" id="BLOGGER_PHOTO_ID_5384620558406949730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Windows Start Menu Entries (III)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NAHlhQTNQmw/SroFVsbpEVI/AAAAAAAAAOU/gPgIn2KzkRU/s1600-h/parameters24.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/SroFVsbpEVI/AAAAAAAAAOU/gPgIn2KzkRU/s400/parameters24.png" alt="" id="BLOGGER_PHOTO_ID_5384622174737338706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NAHlhQTNQmw/SroGkxw3UOI/AAAAAAAAAOk/rLSXIDYwlro/s1600-h/parameters26.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://3.bp.blogspot.com/_NAHlhQTNQmw/SroGkxw3UOI/AAAAAAAAAOk/rLSXIDYwlro/s400/parameters26.png" alt="" id="BLOGGER_PHOTO_ID_5384623533378195682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Post Installation Actions (I)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroD3942rTI/AAAAAAAAAME/cBayKws8nMg/s1600-h/postinstallation1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroD3942rTI/AAAAAAAAAME/cBayKws8nMg/s400/postinstallation1.png" alt="" id="BLOGGER_PHOTO_ID_5384620564515564850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Once the files are copied to the user system, we need to implement some additional configuration steps:&lt;br /&gt;&lt;ul class="blank-list"&gt;&lt;br /&gt;&lt;li&gt; Configure Tomcat to use the ports selected by the user.&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Set the right executable permissions for the Tomcat binaries on Linux.&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Get JAVA_HOME in order to configure the startup and stop scripts to use the correct Java version.&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Configure the start and stop scripts to use the right JAVA_HOME.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;On Linux, set the correct permissions for the start and stop scripts.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Post Installation Actions (II)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/SroD4G04n1I/AAAAAAAAAMM/ivQEC2_vK2A/s1600-h/postinstallation2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/SroD4G04n1I/AAAAAAAAAMM/ivQEC2_vK2A/s400/postinstallation2.png" alt="" id="BLOGGER_PHOTO_ID_5384620566914834258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The main Tomcat configuration file is server.xml. In this file we can configure the ports Tomcat is using.  We will use substitution actions for this.&lt;br /&gt;&lt;br /&gt;By default, server.xml contains hard-coded references to 8080 and 8005. These ports represent the http port and the shutdown port respectively.&lt;br /&gt;&lt;br /&gt;With the substitution actions, we will replace 8080 with the value of the port selected by the user for the HTTP request and 8005 with the value of the port selected by the user for the Shutdown port. In our example, these values are stored in ${tomcat_http_port} and ${tomcat_shutdown_port}.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Post Installation Actions (III)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/SroD42HVohI/AAAAAAAAAMc/XcJiLwRGnMM/s1600-h/postinstallation4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/SroD42HVohI/AAAAAAAAAMc/XcJiLwRGnMM/s400/postinstallation4.png" alt="" id="BLOGGER_PHOTO_ID_5384620579608699410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroEZHcZmOI/AAAAAAAAAMk/EJvymuccmco/s1600-h/postinstallation5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroEZHcZmOI/AAAAAAAAAMk/EJvymuccmco/s400/postinstallation5.png" alt="" id="BLOGGER_PHOTO_ID_5384621134016256226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Post Installation Actions (IV)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Now, we will add write permissions to the Tomcat executable files in the bin folder. Note that this action will only take effect in Unix platforms so we don't need to add a rule for not executing it on Windows.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroEZVxEkUI/AAAAAAAAAMs/iFTDkIdZWOE/s1600-h/postinstallation6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroEZVxEkUI/AAAAAAAAAMs/iFTDkIdZWOE/s400/postinstallation6.png" alt="" id="BLOGGER_PHOTO_ID_5384621137861054786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroEZ4q2TuI/AAAAAAAAAM0/m0YVTwhIFOQ/s1600-h/postinstallation7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroEZ4q2TuI/AAAAAAAAAM0/m0YVTwhIFOQ/s400/postinstallation7.png" alt="" id="BLOGGER_PHOTO_ID_5384621147230195426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Post Installation Actions (V)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;At the beginning of the installation, we detected Java. InstallBuilder will create an internal variable named java_executable. However, according to the Tomcat documentation, we need to set the JAVA_HOME variable.&lt;br /&gt;&lt;br /&gt;We'll use a regular expression for getting the right value of JAVA_HOME.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroEaAhRQzI/AAAAAAAAAM8/ZzbZ4n_VmPk/s1600-h/postinstallation8.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroEaAhRQzI/AAAAAAAAAM8/ZzbZ4n_VmPk/s400/postinstallation8.png" alt="" id="BLOGGER_PHOTO_ID_5384621149337502514" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NAHlhQTNQmw/SroEaTDdjoI/AAAAAAAAANE/cDmGBFzgGgw/s1600-h/postinstallation9.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://3.bp.blogspot.com/_NAHlhQTNQmw/SroEaTDdjoI/AAAAAAAAANE/cDmGBFzgGgw/s400/postinstallation9.png" alt="" id="BLOGGER_PHOTO_ID_5384621154312752770" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Post Installation Actions (VI)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Previously, when we created the start/stop scripts, we used patterns that will be replaced during the installation process with the correct value.  We will now replace those patterns with the path to CATALINA_HOME and the path to JAVA_HOME. This is also valid for both Linux and Windows.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NAHlhQTNQmw/SroE1Uz5TyI/AAAAAAAAANU/8eDYeF05Ddc/s1600-h/postinstallation11.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://3.bp.blogspot.com/_NAHlhQTNQmw/SroE1Uz5TyI/AAAAAAAAANU/8eDYeF05Ddc/s400/postinstallation11.png" alt="" id="BLOGGER_PHOTO_ID_5384621618640801570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NAHlhQTNQmw/SroE1kt9rKI/AAAAAAAAANc/Jp30briiAwY/s1600-h/postinstallation12.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/SroE1kt9rKI/AAAAAAAAANc/Jp30briiAwY/s400/postinstallation12.png" alt="" id="BLOGGER_PHOTO_ID_5384621622910889122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Post Installation Actions (VII)&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Finally, we will give executable permissions to the start and stop scripts on Linux. With this, we finish with the post installation configuration steps.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/SroE2KxMoKI/AAAAAAAAANk/sgsAwRml_34/s1600-h/postinstallation13.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/SroE2KxMoKI/AAAAAAAAANk/sgsAwRml_34/s400/postinstallation13.png" alt="" id="BLOGGER_PHOTO_ID_5384621633124999330" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Final Page&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Once the installation is complete, we will offer the user the option of starting Tomcat. If the user opts to do so, on Linux we will execute the start.sh script, while on Windows we will execute the start.bat script. When the Tomcat server has been started, we will open the browser and show the user that Tomcat is working.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroFUom_huI/AAAAAAAAAN8/KyEzxTXVcQY/s1600-h/finalpage1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroFUom_huI/AAAAAAAAAN8/KyEzxTXVcQY/s400/finalpage1.png" alt="" id="BLOGGER_PHOTO_ID_5384622156531336930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NAHlhQTNQmw/SroFUzEAeHI/AAAAAAAAAOE/ScK1jph56hs/s1600-h/finalpage2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/SroFUzEAeHI/AAAAAAAAAOE/ScK1jph56hs/s400/finalpage2.png" alt="" id="BLOGGER_PHOTO_ID_5384622159337388146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Build&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Now we can build our multiplatform installers and give them a try. By default, the installers will be created in your InstallBuilder directory, in the 'output' folder.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroE2RL8DYI/AAAAAAAAANs/ZZnF63fIvHY/s1600-h/build1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 316px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SroE2RL8DYI/AAAAAAAAANs/ZZnF63fIvHY/s400/build1.png" alt="" id="BLOGGER_PHOTO_ID_5384621634847772034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NAHlhQTNQmw/SroFUHo7XPI/AAAAAAAAAN0/kaHRDOXZjJg/s1600-h/build2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px;" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/SroFUHo7XPI/AAAAAAAAAN0/kaHRDOXZjJg/s400/build2.png" alt="" id="BLOGGER_PHOTO_ID_5384622147681082610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Resources&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://installbuilder.bitrock.com/blog-resources/bundled-tomcat-project-files.zip"&gt;Sample Tomcat installer files&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-6271972319142024284?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/6271972319142024284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=6271972319142024284' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/6271972319142024284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/6271972319142024284'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2009/09/bundle-tomcat-in-your-bitrock.html' title='Bundle Tomcat in Your BitRock InstallBuilder installer'/><author><name>Santiago</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14609551556002628142'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_NAHlhQTNQmw/SrnkmlOndoI/AAAAAAAAAIc/IDoEcnj83tc/s72-c/productinfo1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-3769239111672313779</id><published>2009-09-23T05:04:00.000-07:00</published><updated>2009-09-25T01:47:56.175-07:00</updated><title type='text'>LinuxCon and JEI</title><content type='html'>BitRock will be attending &lt;a href="http://events.linuxfoundation.org/events/linuxcon"&gt;LinuxCon&lt;/a&gt; in Portland and the &lt;a href="http://www.fundacionzcc.org/2009/09/11/jei-startup-zaragoza-emprendedores-espanoles-buscan-en-zaragoza-formacion-y-financiacion-para-lanzar-y-consolidar-proyectos-innovadores/"&gt;JEI Startup event&lt;/a&gt; in Zaragoza (Spain). Let us know if you are around and would like to chat with us.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-3769239111672313779?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/3769239111672313779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=3769239111672313779' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/3769239111672313779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/3769239111672313779'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2009/09/linuxcon-and-jei.html' title='LinuxCon and JEI'/><author><name>BitRock Team</name><uri>http://www.blogger.com/profile/14660332720215938837</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='16193056018172352147'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-759416423350209368</id><published>2009-07-24T05:58:00.000-07:00</published><updated>2009-09-24T01:38:24.799-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cross platform installer'/><category scheme='http://www.blogger.com/atom/ns#' term='installbuilder'/><category scheme='http://www.blogger.com/atom/ns#' term='unpack'/><title type='text'>Managing Bundled Files</title><content type='html'>In this entry we are going to discuss how to manage files bundled within an installer.&lt;br /&gt;&lt;br /&gt;It is common to have a separate tool or program that must be bundled with and run from the installer, but before the file copying part of the installation process has completed. A common example would be a license validation program. Typically, all files bundled within an installer are unpacked and then any tools would be run. In the case of a license validator, that is less than ideal because the user may end up waiting for the files to be unpacked only to find that the license is not valid. The user would then have to wait for the installation to be rolled back.&lt;br /&gt;&lt;br /&gt;InstallBuilder provides you with actions to deal with these situations. The most important are &amp;lt;unpackFile&amp;gt; and &amp;lt;unpackDirectory&amp;gt;. Let's assume we are in the situation detailed above. A typical project XML file would look something like:&lt;br /&gt;&lt;span style="float:right !important;"&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;project&amp;gt;&lt;br /&gt;    ...&lt;br /&gt;    &amp;lt;componentList&amp;gt;&lt;br /&gt;        &amp;lt;component&amp;gt;&lt;br /&gt;            &amp;lt;name&amp;gt;default&amp;lt;/name&amp;gt;&lt;br /&gt;            &amp;lt;folderList&amp;gt;&lt;br /&gt;                &amp;lt;folder&amp;gt;&lt;br /&gt;                    &amp;lt;name&amp;gt;programfiles&amp;lt;/name&amp;gt;&lt;br /&gt;                    &amp;lt;destination&amp;gt;${installdir}&amp;lt;/destination&amp;gt;&lt;br /&gt;                    &amp;lt;distributionFileList&amp;gt;&lt;br /&gt;                        &amp;lt;distributionDirectory origin="/path/to/dir/to/pack"/&amp;gt;&lt;br /&gt;                        &amp;lt;distributionFile origin="/path/to/checker"/&amp;gt;&lt;br /&gt;                    &amp;lt;/distributionFileList&amp;gt;&lt;br /&gt;                &amp;lt;/folder&amp;gt;&lt;br /&gt;            &amp;lt;/folderList&amp;gt;&lt;br /&gt;        &amp;lt;/component&amp;gt;&lt;br /&gt;    &amp;lt;/componentList&amp;gt;&lt;br /&gt;    &amp;lt;parameterList&amp;gt;&lt;br /&gt;        &amp;lt;stringParameter&amp;gt;&lt;br /&gt;            &amp;lt;name&amp;gt;licenseCheck&amp;lt;/name&amp;gt;&lt;br /&gt;            &amp;lt;description&amp;gt;Introduce your license key&amp;lt;/description&amp;gt;&lt;br /&gt;            &amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;br /&gt;        &amp;lt;/stringParameter&amp;gt;&lt;br /&gt;    &amp;lt;/parameterList&amp;gt;&lt;br /&gt;    ...&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As you can see, the user is asked to supply a license key. Without the &amp;lt;unpack&amp;gt; actions, the information provided would not be checked until several steps later, which is not our desired behavior. Instead, we can do the following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;parameterlist&amp;gt;&lt;br /&gt;   &amp;lt;stringparameter&amp;gt;&lt;br /&gt;       &amp;lt;name&amp;gt;licenseCheck&amp;lt;/name&amp;gt;&lt;br /&gt;       &amp;lt;title&amp;gt;Introduce your license key&amp;lt;/title&amp;gt;&lt;br /&gt;       &amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;br /&gt;       &amp;lt;validationactionlist&amp;gt;&lt;br /&gt;           &amp;lt;unpackfile component="default" folder="programfiles" origin="checker" destination="/tmp"&amp;gt;&lt;br /&gt;           &amp;lt;runprogram&amp;gt;&lt;br /&gt;               &amp;lt;program&amp;gt;/tmp/checker&amp;lt;/program&amp;gt;&lt;br /&gt;               &amp;lt;programarguments&amp;gt;${project.parameter(licenseCheck).value}&amp;lt;/programarguments&amp;gt;&lt;br /&gt;           &amp;lt;/runprogram&amp;gt;&lt;br /&gt;           &amp;lt;throwerror text="Wrong license key, please enter a valid one or cancel the installation"&amp;gt;&lt;br /&gt;               &amp;lt;rulelist&amp;gt;&lt;br /&gt;                   &amp;lt;comparetext text="${program_stdout}" logic="equals" value="1"&amp;gt;&lt;br /&gt;                   &amp;lt;/comparetext&amp;gt;&lt;br /&gt;               &amp;lt;/rulelist&amp;gt;&lt;br /&gt;           &amp;lt;/throwerror&amp;gt;&lt;br /&gt;           &amp;lt;/unpackfile&amp;gt;&lt;br /&gt;       &amp;lt;/validationactionlist&amp;gt;&lt;br /&gt;   &amp;lt;/stringparameter&amp;gt;&lt;br /&gt;&amp;lt;/parameterlist&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The packed file can even be a zip file. You just need to use an &amp;lt;unzip&amp;gt; action before executing it:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;unzip&amp;gt;&lt;br /&gt;  &amp;lt;destinationdirectory&amp;gt;${installdir}&amp;lt;/destinationdirectory&amp;gt;&lt;br /&gt;  &amp;lt;zipfile&amp;gt;/tmp/unpacked/file.zip&amp;lt;/zipfile&amp;gt;&lt;br /&gt;&amp;lt;/unzip&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As you can see in the example above, the &amp;lt;origin&amp;gt; in the unpack action corresponds with the location of the file inside the installer, not with the path to the file in the build machine. If you packed a directory "/path/to/dir/to/pack" containing three files, fileA, fileB and fileC, to unpack fileB, you should use an &amp;lt;unpackfile&amp;gt; with origin="pack/fileB":&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;distributiondirectory origin="/path/to/dir/to/pack"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;unpackfile component="default" folder="programfiles" origin="pack/fileB" destination="/some/destination"&amp;gt;&lt;br /&gt;&amp;lt;/unpackfile&amp;gt;&lt;br /&gt;&amp;lt;/distributiondirectory&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You could imagine this structure inside the installer:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NAHlhQTNQmw/Smm0VzH9aGI/AAAAAAAAAIU/BgbLB2TvkCs/s1600-h/packed_files_table.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 326px;" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/Smm0VzH9aGI/AAAAAAAAAIU/BgbLB2TvkCs/s400/packed_files_table.png" alt="" id="BLOGGER_PHOTO_ID_5362015117955131490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To reference logo.jpg:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;unpackfile component="componentA" folder="folder1" origin="someDirectory/logo.jpg" destination="${installdir}"&amp;gt;&lt;br /&gt;&amp;lt;/unpackfile&amp;gt;&lt;/pre&gt;&lt;br /&gt;It does not matter where the file was located originally in the building machine, just the path inside the installer:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;component name="componentA"&amp;gt;&lt;br /&gt;&amp;lt;folderlist&amp;gt;&lt;br /&gt;&amp;lt;folder&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;folder1&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;distributionfilelist&amp;gt;&lt;br /&gt;   &amp;lt;distributiondirectory&amp;gt;&lt;br /&gt;        &amp;lt;origin&amp;gt;/some/long/path/in/the/building/machine/someDirectory&amp;lt;/origin&amp;gt;&lt;br /&gt;   &amp;lt;/distributiondirectory&amp;gt;&lt;br /&gt;&amp;lt;/distributionfilelist&amp;gt;&lt;br /&gt;&amp;lt;/folder&amp;gt;&lt;br /&gt;&amp;lt;/folderlist&amp;gt;&lt;br /&gt;&amp;lt;/component&amp;gt;&lt;/pre&gt;&lt;br /&gt;InstallBuilder also includes functionality to facilitate uninstalling bundled programs or tools. When an uninstaller is run, all files packed are automatically deleted, but if one of the bundled applications generates other files or directories, those have to be manually deleted using &amp;lt;deletefile&amp;gt; actions. Another way to take care of deleting all of the files is to use the &amp;lt;addfilestouninstaller&amp;gt; action:&lt;br /&gt;&lt;pre&gt;&amp;lt;addfilestouninstaller path="/some/path/to/the/file"&amp;gt;&amp;lt;/addfilestouninstaller&amp;gt;&lt;/pre&gt;&lt;br /&gt;Note that this action will only work with existing files. You cannot add a file that is going to be created but does not yet exist. As a workaround for these situations, you can use a &amp;lt;touchfile&amp;gt; action:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;touchfile path="/some/path/to/the/file"&amp;gt;&lt;br /&gt;&amp;lt;addfilestouninstaller path="/some/path/to/the/file"&amp;gt;&lt;br /&gt;&amp;lt;deletefile path="/some/path/to/the/file"&amp;gt;&lt;br /&gt;&amp;lt;/deletefile&amp;gt;&amp;lt;/addfilestouninstaller&amp;gt;&amp;lt;/touchfile&amp;gt;&lt;/pre&gt;&lt;br /&gt;Even if the real file is a directory, the uninstaller will register it correctly.&lt;br /&gt;&lt;br /&gt;You can also remove files to be deleted from the uninstaller to avoid deleting them during uninstallation:&lt;br /&gt;&lt;pre&gt;&amp;lt;removefilesfromuninstaller files="${installdir}/*" exclude="*.txt"&amp;gt;&amp;lt;/removefilesfromuninstaller&amp;gt;&lt;/pre&gt;&lt;br /&gt;This will exclude from the uninstaller all of the contents of "installdir" except for .txt files.&lt;br /&gt;&lt;br /&gt;The example above uses the &amp;lt;exclude&amp;gt; tag, introduced in InstallBuilder  6.1.1, which allows you to specify patterns of file that should not be affected by the action.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-759416423350209368?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/759416423350209368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=759416423350209368' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/759416423350209368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/759416423350209368'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2009/07/managing-bundled-files.html' title='Managing Bundled Files'/><author><name>Santiago</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14609551556002628142'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_NAHlhQTNQmw/Smm0VzH9aGI/AAAAAAAAAIU/BgbLB2TvkCs/s72-c/packed_files_table.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-7665544139623379017</id><published>2009-07-21T00:28:00.000-07:00</published><updated>2009-09-25T00:48:57.709-07:00</updated><title type='text'>How to use Rules with InstallBuilder</title><content type='html'>The installation of your application does not have to be a rigid, linear sequence of actions. For example, maybe you need to copy certain files only if the target platform is Mac or Linux, but not if it is Windows. Or  you may want to modify or add some content to a file, but only if it is needed (you don't want to duplicate configuration settings). Here's another example of common functionality: You may want to discard or accept user input depending on whether it meets certain criteria.&lt;br /&gt;&lt;br /&gt;Rules in InstallBuilder allow you to determine when to perform certain actions depending on the circumstances, variables and user inputs that are involved in the installation.  It allows you to set conditions related to an action or an action group at any step of the installation, and they will be performed only if the condition is met. You can set not only one, but a set of multiple conditions that can be evaluated with an AND/OR group logic statement.&lt;br /&gt;&lt;br /&gt;This article will explain how to implement conditional rules in your actions, how to select the appropriate rule for each case, and how this can help you to optimize your project and avoid duplicating code.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you don't already have InstallBuilder installed on your system, you can download the latest version from &lt;a href="http://installbuilder.bitrock.com/"&gt;http://installbuilder.bitrock.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Now, let's begin!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We will start with GUI in our first, simple example for a fictitious commercial application for Windows. Imagine that you want to distribute your product offering with the option of installing it for a time-limited evaluation period, or installing it as a registered “Enterprise Edition”, depending on whether or not the user has a valid license key on his or her machine.&lt;br /&gt;&lt;ul class="blank-list" type="none"&gt;&lt;li&gt;Your desired behavior is:&lt;/li&gt;&lt;li&gt;&lt;ul class="blank-list"&gt;&lt;br /&gt;&lt;li&gt;- Your product will be installed as an “Enterprise Edition” if the installer finds a valid license file, “product.lic”, in the user's desktop folder. If that is the case, the installer will report that it is deploying an “Enterprise Edition”.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;- If a valid license file is not found on the user's desktop, the product will be installed as a “Trial Edition” and the installer will inform the user of that.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Of course, this is a very simple case,  but it is a good example for demonstrating how rules can work for you. Now, start InstallBuilder and open the Demo project. To do so, use one of the following methods:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NAHlhQTNQmw/SmVxHkEya0I/AAAAAAAAAGc/ewpIbBGAAIo/s1600-h/open-project.png"&gt;&lt;img style="border: 1px solid silver; margin: 0pt 12px 10px 0pt; float: left; cursor: pointer; width: 244px; height: 127px;" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/SmVxHkEya0I/AAAAAAAAAGc/ewpIbBGAAIo/s400/open-project.png" alt="" id="BLOGGER_PHOTO_ID_5360815306211224386" border="0" /&gt;&lt;/a&gt;&lt;div style="padding-top: 30px;"&gt;a) Go to [File -&gt; Open Project -&gt; From file...] and double-click on demo.xml file...&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="clear: left; padding-top: 26px;"&gt;b) Click on the Open Project button at the toolbar (see the image on the left), and double-click on demo.xml file.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="display: block; font-weight: bold;"&gt;NOTE:&lt;/span&gt; It's strongly recommended that you preserve the Demo project for future testing purposes, so it is a good idea to save the project you're working on as a new one. For example, you can save it as  'myruleproject.xml'.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/SmVxtXkoRaI/AAAAAAAAAGk/WEGsjQFcAzo/s1600-h/advanced-tab.png"&gt;&lt;img style="border: 1px solid silver; margin: 0pt 20px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 130px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/SmVxtXkoRaI/AAAAAAAAAGk/WEGsjQFcAzo/s400/advanced-tab.png" alt="" id="BLOGGER_PHOTO_ID_5360815955690145186" border="0" /&gt;&lt;/a&gt;Now, click on the  Advanced tab on the left side of the InstallBuilder GUI. This will show you all of the installation steps, components and distribution files/directories, and allow you to specify highly customized settings for your installer.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="float:left;height:180px"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SmV0CIka6pI/AAAAAAAAAGs/qTebe43AGOU/s1600-h/pre-installation-actions.png"&gt;&lt;img style="border: 1px solid silver; margin: 0pt 20px 10px 0pt; float: left; cursor: pointer; width: 256px; height: 134px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SmV0CIka6pI/AAAAAAAAAGs/qTebe43AGOU/s400/pre-installation-actions.png" alt="" id="BLOGGER_PHOTO_ID_5360818511463246482" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;We want to check if there is a license file before  deciding what edition (evaluation or enterprise) will be deployed,  so select 'Pre-Installation-Actions'. This step defines the actions the installer must execute before the first page of the installer is displayed. Right-click the item and select 'Add'.&lt;br /&gt;&lt;br /&gt;&lt;div style="clear: left; margin-bottom: 0pt; padding-bottom: 0pt;"&gt;Now, we need a variable in which we will store a value that will depend of whether or not there is a license file found. We will call this variable 'edition_type', and it will store one the following values:&lt;/div&gt;&lt;ul class="blank-list" style="padding-left: 0pt; margin-left: 14px;" type="none"&gt;&lt;li&gt;- trial: If there is not any license file found, it will be a 'trial' edition.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;- enterprise: If the installer finds a license file, it will be an 'enterprise' edition.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Depending on which of the above values is returned, the installer will install the application as either an 'Enterprise Edition' or a 'Trial Edition'. So, how do you set the right value for the variable? The answer is: with InstallBuilder rules. We will set the variable with rules that will check if there is a license file present.&lt;br /&gt;&lt;br /&gt;You can think about a rule like a condition that needs to be met to allow the related action to be be executed. If the rule is met, the action will be performed; if it isn't met, the action will not.&lt;br /&gt;&lt;ul class="blank-list" style="padding-left: 0pt; margin-left: 20px;" type="none"&gt;&lt;li&gt;We need to set the value depending on which rule is met:&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;ul class="blank-list" style="padding-left: 0pt; margin-left: 20px;" type="none"&gt;&lt;li&gt;-Set: edition_type=trial      if a license file is not found)&lt;/li&gt;&lt;li&gt;-Set: edition_type=enterprise      (if a license file is found)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;After selecting 'Add', we will find a new dialog window where you can select the type of action that you want to add to this step. We will select 'Installer Actions' on the left, and 'Set Installer Variable' on the right.  Then press 'Ok'.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NAHlhQTNQmw/SmV67XJzp8I/AAAAAAAAAG0/Z5CLCIDt5kQ/s1600-h/type-of-action.png"&gt;&lt;img style="margin: 0px auto; cursor: pointer; width: 400px; height: 312px;" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/SmV67XJzp8I/AAAAAAAAAG0/Z5CLCIDt5kQ/s400/type-of-action.png" alt="" id="BLOGGER_PHOTO_ID_5360826091700463554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We will be presented with a new dialog window where you must enter the needed parameter for the action.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SmV7L-2vr8I/AAAAAAAAAG8/rMic_X1Tyi4/s1600-h/set-installer-variable.png"&gt;&lt;img style="margin: 0px auto; cursor: pointer; width: 400px; height: 280px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SmV7L-2vr8I/AAAAAAAAAG8/rMic_X1Tyi4/s400/set-installer-variable.png" alt="" id="BLOGGER_PHOTO_ID_5360826377235836866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In this case, the 'Set Installer Variable' action will need the following parameter to work:&lt;br /&gt;&lt;br /&gt;&lt;ul class="blank-list" type="none"&gt;&lt;li&gt;-Name: The name of the variable that we want to create. It will be 'edition_type'.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;-Value: The value we want to store in the variable. It will be 'trial'.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="clear: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NAHlhQTNQmw/SmV968EUtAI/AAAAAAAAAHE/akxzW2EbiCs/s1600-h/new-set-installer-variable-action.png"&gt;&lt;img style="border: 1px solid silver; margin: 0pt 20px 10px 0pt; float: left; cursor: pointer; width: 313px; height: 197px;" src="http://3.bp.blogspot.com/_NAHlhQTNQmw/SmV968EUtAI/AAAAAAAAAHE/akxzW2EbiCs/s400/new-set-installer-variable-action.png" alt="" id="BLOGGER_PHOTO_ID_5360829382964589570" border="0" /&gt;&lt;/a&gt;After that, we will be returned to the advanced section of our project. Notice that there is a new item included as a Pre-installation action. This is the newly created Set Installer Variable action.&lt;/div&gt;&lt;div style="clear: both;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="clear: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SmV-9FwCvFI/AAAAAAAAAHM/TFyo9HF6GQo/s1600-h/2-actions.png"&gt;&lt;img style="border: 1px solid silver; margin: 0pt 0px 0px 20px; float: right; padding-top: 0pt; cursor: pointer; width: 303px; height: 188px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SmV-9FwCvFI/AAAAAAAAAHM/TFyo9HF6GQo/s400/2-actions.png" alt="" id="BLOGGER_PHOTO_ID_5360830519435246674" border="0" /&gt;&lt;/a&gt;Now we will repeat the process and add the same action type, but this time the value for 'edition_type' will be 'enterprise'. As a result, we will get two items in the Pre-installation Actions trunk, each one with the two possibilities.&lt;/div&gt;&lt;br /&gt;&lt;div style="padding-top: 10px; margin-top: 30px; clear: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NAHlhQTNQmw/SmV_1B7kjGI/AAAAAAAAAHU/2tW7DrXIG88/s1600-h/rules.png"&gt;&lt;img style="border: 1px solid silver; margin: 0pt 20px 10px 0pt; float: left; cursor: pointer; width: 236px; height: 158px;" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/SmV_1B7kjGI/AAAAAAAAAHU/2tW7DrXIG88/s400/rules.png" alt="" id="BLOGGER_PHOTO_ID_5360831480482532450" border="0" /&gt;&lt;/a&gt;Notice that you can expand any of the actions that you have just created, and there is a parent node called 'Rules'. Here is where we will set the rule that must be met for the action to be performed.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="padding-top:20px;font-weight: bold; display: block; clear: left;"&gt;Windows environment variables&lt;/span&gt;&lt;br /&gt;Now that we are ready to add rules to our actions, there is another question to resolve: If the installer will look for a license file in the user's desktop, and the path to this location depends on the user's name and the Windows edition, how do we add the path? The answer is: with environment variables.&lt;br /&gt;&lt;br /&gt;All operating systems, including Windows, have environment variables that help us to determine certain variable values and locations. If we read  the Windows documentation, we will find that the environment variable called HOMEPATH will return the home directory of the current user. So if the user that executed our installer is named 'Joseph' , this variable will return something like: C:\Documents and Settings\Joseph.&lt;br /&gt;&lt;br /&gt;InstallBuilder can read these environment variables for us and return the result. For this purpose we will use ${env()} to load the value of  HOMEPATH:&lt;br /&gt;&lt;pre&gt;${env(HOMEPATH)}&lt;/pre&gt;&lt;br /&gt;We are now able to set the location where we want the installer to look for the license file (the user's desktop):&lt;br /&gt;&lt;pre&gt;${env(HOMEPATH)}/Desktop/product.lic&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Adding the rules&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, select the Rule node for the first action (edition_type=trial), and right-click to select Add. You will find a new dialog asking for the rule type. Select 'File Exists'. That allows us to check if there is a file present.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SmWC4WAJrhI/AAAAAAAAAHc/cs5_m1Znia0/s1600-h/file-exists.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 291px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SmWC4WAJrhI/AAAAAAAAAHc/cs5_m1Znia0/s400/file-exists.png" alt="" id="BLOGGER_PHOTO_ID_5360834835944943122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="clear: left;"&gt;Then press 'Ok'.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="clear: left; float: left; height: 150px;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NAHlhQTNQmw/SmWEtY6PnOI/AAAAAAAAAHk/0tS7PKWsbA8/s1600-h/file-exists-2.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 242px; height: 138px;" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/SmWEtY6PnOI/AAAAAAAAAHk/0tS7PKWsbA8/s400/file-exists-2.png" alt="" id="BLOGGER_PHOTO_ID_5360836846770167010" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;We will get a new dialog window that asks for the path that points to the where the file would be stored if it exists.&lt;br /&gt;&lt;div style="clear: left;"&gt;&lt;br /&gt;In the field 'Path name' type:  &lt;br /&gt;&lt;pre&gt;${env(HOMEPATH)}\Desktop\product.lic&lt;/pre&gt;&lt;br /&gt;Remember to check the Negate option, since what we want is to set the value 'trial' to the variable 'edition_type' if the file does not exist.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="clear: left; float: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/SmWGa32GVCI/AAAAAAAAAHs/GxqTjflMA-g/s1600-h/rule-item.png"&gt;&lt;img style="border: 1px solid silver; margin: 0pt 20px 10px 0pt; float: left; cursor: pointer; width: 341px; height: 187px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/SmWGa32GVCI/AAAAAAAAAHs/GxqTjflMA-g/s400/rule-item.png" alt="" id="BLOGGER_PHOTO_ID_5360838727680021538" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;Notice that now there is a new item in the Rules node for the first action, so this action will be performed ONLY if the file is not found at the given path.&lt;br /&gt;&lt;br /&gt;&lt;div style="clear: left; padding-top: 10px;"&gt;Now try to add the rule for the second action. This action should try to set the value 'enterprise' to the variable 'edition_type' if the license file is found, so it will be equal to the previous rule, except for the fact that it is not negated this time.&lt;/div&gt;&lt;br /&gt;&lt;div style="clear: left; float: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/SmWHsaEoDkI/AAAAAAAAAH0/v3qRkVc7ggg/s1600-h/2-actions-with-rules.png"&gt;&lt;img style="padding-bottom:52px;border: 1px solid silver; margin: 0pt 20px 10px 0pt; float: left; cursor: pointer; width: 336px; height: 191px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/SmWHsaEoDkI/AAAAAAAAAH0/v3qRkVc7ggg/s400/2-actions-with-rules.png" alt="" id="BLOGGER_PHOTO_ID_5360840128437161538" border="0" /&gt;&lt;/a&gt;As result, you will have two actions in the Pre-installation Actions folder, each one with its own rule. We have now finished the process during which the installer determines the properly value for the variable 'edition_type'. Let's check if it is all correct.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="padding-top: 10px; clear: left;"&gt;&lt;span style="font-weight: bold;"&gt;Adding an info dialog&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Now that we have the actions and its rules, we need to create an action to show a dialog to inform  the user which edition he or she is installing. For this, we need a Show Info Dialog.&lt;br /&gt;&lt;div style="clear: left; margin-top: 15px;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/SmWKURKUrxI/AAAAAAAAAH8/saLpcE3-rG0/s1600-h/dialog-action.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt;  cursor: pointer; width: 400px; height: 301px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/SmWKURKUrxI/AAAAAAAAAH8/saLpcE3-rG0/s400/dialog-action.png" alt="" id="BLOGGER_PHOTO_ID_5360843012263161618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Now that you know how to add an action, you can do it by yourself. Add a 'Dialog Action', type 'Show Info Dialog' just after the last action on Pre-installation Actions.&lt;/div&gt;&lt;br /&gt;&lt;div style="clear: left; padding-top: 0px;"&gt;The text for this dialog will be: &lt;span style="font-style: italic;color:grey;" &gt;The installer will deploy the ${edition_type} edition on your computer.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="clear: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SmWLjHiS9AI/AAAAAAAAAIE/Oce2FWDoDJg/s1600-h/show-info-dialog.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 285px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SmWLjHiS9AI/AAAAAAAAAIE/Oce2FWDoDJg/s400/show-info-dialog.png" alt="" id="BLOGGER_PHOTO_ID_5360844366889022466" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="clear: left; padding-top: 20px;"&gt;Notice that the expression &lt;span style="font-style: italic;color:grey;" &gt;${edition_type}&lt;/span&gt; will return the current value for the variable 'edition_type', which would be 'trial' or 'enterprise'  in this case. Press 'Ok'.&lt;/div&gt;&lt;br /&gt;&lt;div style="clear: left; margin-top: 0px;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/SmWNBt7zIhI/AAAAAAAAAIM/rNjIWOTJIuY/s1600-h/3-actions.png"&gt;&lt;img style="border: 1px solid silver; margin: 0pt 20px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 177px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/SmWNBt7zIhI/AAAAAAAAAIM/rNjIWOTJIuY/s400/3-actions.png" alt="" id="BLOGGER_PHOTO_ID_5360845992104239634" border="0" /&gt;&lt;/a&gt;Now we have three actions on our installer. The last one will be a dialog box that will report which edition will be installed.&lt;br /&gt;&lt;br /&gt;We are ready to test the installer.&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Testing the installer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To quickly test our installer, we can use the 'Test Run' button that is located in the tool-bar of InstallBuilder. Press it, wait for the build process to complete and the installer will start. Create an empty file on your desktop called 'product.lic' to test the way the installer responds depending on whether or not the file is present.&lt;br /&gt;&lt;br /&gt;Of course, if you were to build an installer for production, you would want to check more than just whether or not a license file is present – you would want to confirm that it is actually valid. That can certainly be done using InstallBuilder, but is a topic for another how-to.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;And now?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here are some additional rules that you may find of use:&lt;ul class="blank-list" style="margin-left: 18px; padding-left: 0;" type="none"&gt;&lt;li&gt;- &lt;span style="font-style: italic; text-decoration: underline;color:grey;" &gt;Compare Text&lt;/span&gt;: Compares two values and check whether or not they are equal.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;- &lt;span style="font-style: italic; text-decoration: underline;color:grey;" &gt;Component test&lt;/span&gt;: Checks if a certain component is present in the installer.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;- &lt;span style="font-style: italic; text-decoration: underline;color:grey;" &gt;File Content Test&lt;/span&gt;: Checks if a file contains certain text. Very useful for checking configuration files.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;- &lt;span style="font-style: italic; text-decoration: underline;color:grey;" &gt;Host Validation&lt;/span&gt;: Helps you to check if a given host is valid.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;- &lt;span style="font-style: italic; text-decoration: underline;color:grey;" &gt;Platform Test&lt;/span&gt;: Checks to see if the target system is on your list of supported platforms.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;- &lt;span style="font-style: italic; text-decoration: underline;color:grey;" &gt;Process Test&lt;/span&gt;: Checks for the execution of a process in the target system.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;- &lt;span style="font-style: italic; text-decoration: underline;color:grey;" &gt;Regular Expression Match&lt;/span&gt;: Checks for a match between a given value and a pattern using regular expressions.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;- &lt;span style="font-style: italic; text-decoration: underline;color:grey;" &gt;Registry Test&lt;/span&gt;: Looks for certain keys/values in the registry. A must-know rule for Windows installers.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;- &lt;span style="font-style: italic; text-decoration: underline;color:grey;" &gt;User Test&lt;/span&gt;: Checks for the existence of a certain user in the system, or checks its password is valid.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;- &lt;span style="font-style: italic; text-decoration: underline;color:grey;" &gt;Windows Service Test&lt;/span&gt;: checks whether a service exists or whether it is running.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-7665544139623379017?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/7665544139623379017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=7665544139623379017' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/7665544139623379017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/7665544139623379017'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2009/07/how-to-use-rules-with-installbuilder.html' title='How to use Rules with InstallBuilder'/><author><name>Santiago</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14609551556002628142'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_NAHlhQTNQmw/SmVxHkEya0I/AAAAAAAAAGc/ewpIbBGAAIo/s72-c/open-project.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-61064854194505054</id><published>2009-07-02T02:36:00.000-07:00</published><updated>2009-09-25T00:51:36.856-07:00</updated><title type='text'>How to Use the AutoUpdater in InstallBuilder</title><content type='html'>In version 6.0 of InstallBuilder, we started shipping a new tool called AutoUpdater . This tool allows you to enable users to check for, download and apply updates for your software on their  machines, getting the necessary files through HTTP or FTP. Although the Autoupdater is not yet available through the InstallBuilder GUI, it is very simple to configure.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;How Does it Work?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There is a binary file which will poll the server to get information about the software versions available. The behavior of this binary is:&lt;br /&gt;&lt;ul type="ordered"&gt;&lt;li&gt;Read the INI file that contains information about where to contact the server and which version is currently installed (which should be delivered together with the binary)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Get the XML file from the server, which contains available versions for each platform.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If there's a newer version available (checking that the version ID received is higher than the current one stored in INI file), download and install it or notify the user (return code = 0) if it is run in unattended mode.&lt;/li&gt;&lt;/ul&gt;This binary may be customized to fit your needs using the command line tool 'customize' which is available in the AutoUpdater directory after performing InstallBuilder installation. The binary may be generated for several platforms: windows, linux or linux-x64; and an XML file will be used to indicate the tool how should the updater be customized.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The syntax to use the tool is:&lt;br /&gt;&lt;br /&gt;{IB_installdir}/autoupdater/bin/customize build /path/to/project.xml [windows,linux,linux-x64]&lt;br /&gt;&lt;br /&gt;The project XML file  must have  the main tag '&amp;lt;autoUpdateProject&amp;gt;' containing a list of customizations. The ones currently available are:&lt;br /&gt;&lt;ul type="ordered"&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;General settings:&lt;/span&gt; allowLanguageSelection, allowedLanguages, customLanguageFileList, rebootRequired (after performing update), requireInstallationByRootUser (only the Administrator can run Autoupdater), saveRelativePaths, singleInstanceCheck (check that theres only one instance running)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Application:&lt;/span&gt; fullName, shortName, vendor, version&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Modify view:&lt;/span&gt; height, width, leftImage (163x314 GIF or PNG), logoImage (48x48 GIF or PNG), splashImage(GIF or PNG image), splashScreenDelay, disableSplashScreen, overrideGtkButtonText, wmImage (48x48 GIF or PNG shown in the window manager task bar on Unix systems)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Windows binary options:&lt;/span&gt; windowsExecutableIcon, windowsResourceComments, windowsResourceCompanyName, windowsResourceFileDescription, windowsResourceFileVersion, windowsResourceInternalName, windowsResourceLegalCopyright, windowsResourceLegalTrademarks, windowsResourceOriginalFilename, windowsResourceProductName, windowsResourceProductVersion&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;After applying the customizations, the new file may be found inside {IB_installdir}/autoupdater/output.&lt;br /&gt;&lt;br /&gt;The INI file should be delivered together with the update binary containing next fields inside [Update] section:&lt;br /&gt;&lt;ul type="disc"&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;URL:&lt;/span&gt; The URL of the server from which the updates XML file should be obtained&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;version_id:&lt;/span&gt; The identifier of current installed version&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;update_download_location:&lt;/span&gt; The temporary path where downloaded installers should be stored&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;check_for_updates:&lt;/span&gt; It is possible to enable and disable the AutoUpdater on demand by setting this boolean value&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The server XML file with latest version details should be present on the server located at the URL provided in the INI file with the following information inside the '&amp;lt;installerInformation&amp;gt;' tag:&lt;br /&gt;&lt;ul type="disc"&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;version:&lt;/span&gt; name of the version to be shown to the user&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;versionId:&lt;/span&gt; version identifier&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;platformFileList:&lt;/span&gt; list of installer names by platform&lt;/li&gt;&lt;br /&gt;&lt;li&gt;downloadLocationList: list of download locations (downloadLocation), each containing a URL which points to a mirror where the software can be downloaded&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Note:&lt;/span&gt; versionId must be an integer which takes higher values for the newest versions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Simple example&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Imagine we have an application called 'My Application' and we want to include  AutoUpdater functionality in version 1.0.0. We may also want, for example, for the update process to be run by an Administrator and while only one process is being run. We can generate a custom binary having the appropriate application name, version and required flags:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;autoUpdateProject&amp;gt;&lt;br /&gt; &amp;lt;fullName&amp;gt;My Application&amp;lt;/fullName&amp;gt;&lt;br /&gt; &amp;lt;shortName&amp;gt;myapp&amp;lt;/shortName&amp;gt;&lt;br /&gt; &amp;lt;vendor&amp;gt;Acme Inc.&amp;lt;/vendor&amp;gt;&lt;br /&gt; &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;singleInstanceCheck&amp;gt;1&amp;lt;/singleInstanceCheck&amp;gt;&lt;br /&gt; &amp;lt;requireInstallationByRootUser&amp;gt;1&amp;lt;/requireInstallationByRootUser&amp;gt;&lt;br /&gt;&amp;lt;/autoUpdateProject&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You may want to change the images and icons to have application specific ones. To do so, you can add the options: leftImage, logoImage, splashImage, wmImage. Once all desired options are included in project.xml file, we run the customize command:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;{IB_installdir}/autoupdater/bin/customize.bin build project.xml linux&lt;br /&gt;{IB_installdir}/autoupdater/bin/customize.bin build project.xml windows&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;After that, binary files for Linux and Windows should be found in AutoUpdater output directory.&lt;br /&gt;&lt;br /&gt;Apart from the AutoUpdater binary, you will need to setup a server with the new installers and update.xml file. In our case, we will use a server running locally in port 8080. (You can easily setup a web server using &lt;a href="http://bitnami.org/stack/lampstack"&gt;LAMPStack&lt;/a&gt; or &lt;a href="http://bitnami.org/stack/wampstack"&gt;WAMPStack&lt;/a&gt; from &lt;a href="http://bitnami.org/"&gt;BitNami.org&lt;/a&gt;). We just need to copy there the latest installers and an update.xml file describing that version, the filenames and mirrors:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;installerInformation&amp;gt;&lt;br /&gt;   &amp;lt;versionId&amp;gt;200&amp;lt;/versionId&amp;gt;&lt;br /&gt;   &amp;lt;version&amp;gt;2.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;   &amp;lt;platformFileList&amp;gt;&lt;br /&gt;       &amp;lt;platformFile&amp;gt;&lt;br /&gt;           &amp;lt;filename&amp;gt;myapplication-installer-2.0.0.exe&amp;lt;/filename&amp;gt;&lt;br /&gt;           &amp;lt;platform&amp;gt;windows&amp;lt;/platform&amp;gt;&lt;br /&gt;       &amp;lt;/platformFile&amp;gt;&lt;br /&gt;       &amp;lt;platformFile&amp;gt;&lt;br /&gt;           &amp;lt;filename&amp;gt;myapplication-installer-2.0.0.bin&amp;lt;/filename&amp;gt;&lt;br /&gt;           &amp;lt;platform&amp;gt;linux&amp;lt;/platform&amp;gt;&lt;br /&gt;       &amp;lt;/platformFile&amp;gt;&lt;br /&gt;   &amp;lt;/platformFileList&amp;gt;&lt;br /&gt;   &amp;lt;downloadLocationList&amp;gt;&lt;br /&gt;       &amp;lt;downloadLocation&amp;gt;&lt;br /&gt;           &amp;lt;url&amp;gt;http://127.0.0.1:8080/downloads/&amp;lt;/url&amp;gt;&lt;br /&gt;       &amp;lt;/downloadLocation&amp;gt;&lt;br /&gt;   &amp;lt;/downloadLocationList&amp;gt;&lt;br /&gt;&amp;lt;/installerInformation&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;where versionId has been set to a higher integer value than previous ones and we have configured a single mirror. We can include any number of mirrors by adding multiple download location elements though. That way, the installers will be downloaded from:&lt;br /&gt;&lt;br /&gt;http://127.0.0.1:8080/downloads/myapplication-installer-2.0.0.bin&lt;br /&gt;http://127.0.0.1:8080/downloads/myapplication-installer-2.0.0.exe&lt;br /&gt;&lt;br /&gt;AutoUpdater should be able to locate that update.xml file as well as know which software version is currently installed. That is done using an “update.ini” file with the following content:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[Update]&lt;br /&gt;url = http://127.0.0.1:8080/update.xml&lt;br /&gt;version_id = 100&lt;br /&gt;check_for_updates = 1&lt;br /&gt;update_download_location = /tmp&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In this case, update.xml will be obtained from localhost, saving temporary installers inside the /tmp path.  The application upgrade process will be done if received version ID is greater than 100.&lt;br /&gt;&lt;br /&gt;Once we have the files available and update.ini is in the same path as the AutoUpdater binary, we can check its behavior:&lt;br /&gt;&lt;br /&gt;When it is started , the rules included in customization will be checked: if the user is not an Administrator, he or she will be notified and the AutoUpdate process ends. If there is another instance already running, a notification will let the user know and he or she will be able to chose if the process should continue or not. If both requirements are met, a welcome screen will appear.&lt;br /&gt;&lt;br /&gt;Here is what the process will look like from the user's perspective:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SkyPnf-2qDI/AAAAAAAAAF0/YGXr7dz7oFo/s1600-h/welcome-auto-update.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 280px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SkyPnf-2qDI/AAAAAAAAAF0/YGXr7dz7oFo/s400/welcome-auto-update.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5353811965799475250" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After clicking 'Next' button we'll get a screen to configure a proxy if it is necessary.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SkyP7KLPX0I/AAAAAAAAAF8/Aj8kdbhb-XE/s1600-h/connect-to-internet.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 280px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SkyP7KLPX0I/AAAAAAAAAF8/Aj8kdbhb-XE/s400/connect-to-internet.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5353812303543230274" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It will contact the server and check if there are new versions available. If there is an update, the following screen will be shown:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/SkyRMY0JpHI/AAAAAAAAAGE/bbvLcSzW5_E/s1600-h/check-for-updates.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 280px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/SkyRMY0JpHI/AAAAAAAAAGE/bbvLcSzW5_E/s400/check-for-updates.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5353813699042321522" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you click 'Next', a new window with the list of mirrors is shown.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/SkyRs5uL6KI/AAAAAAAAAGM/YfXyEj9_siw/s1600-h/mirror-selection.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 280px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/SkyRs5uL6KI/AAAAAAAAAGM/YfXyEj9_siw/s400/mirror-selection.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5353814257631488162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NAHlhQTNQmw/SkySE0e2V2I/AAAAAAAAAGU/3QKUGRRtst4/s1600-h/downloading-updates.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 280px;" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/SkySE0e2V2I/AAAAAAAAAGU/3QKUGRRtst4/s400/downloading-updates.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5353814668541843298" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Once the new version is downloaded, the installer is started&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Adding AutoUpdate to an Existing InstallBuilder Project&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The only steps required to include the new feature as part of the application installation is to copy  the appropriate AutoUpdate binary file for each operating system and place update.ini file in the same folder. For instance, we can define a component in the following way:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;component&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;autoupdater&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;description&amp;gt;includes tool to perform updates&amp;lt;/description&amp;gt;&lt;br /&gt;   &amp;lt;canBeEdited&amp;gt;0&amp;lt;/canBeEdited&amp;gt;&lt;br /&gt;   &amp;lt;selected&amp;gt;1&amp;lt;/selected&amp;gt;&lt;br /&gt;   &amp;lt;show&amp;gt;0&amp;lt;/show&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;folderList&amp;gt;&lt;br /&gt;       &amp;lt;folder&amp;gt;&lt;br /&gt;           &amp;lt;name&amp;gt;autoupdaterwin&amp;lt;/name&amp;gt;&lt;br /&gt;           &amp;lt;destination&amp;gt;${installdir}&amp;lt;/destination&amp;gt;&lt;br /&gt;           &amp;lt;platforms&amp;gt;windows&amp;lt;/platforms&amp;gt;&lt;br /&gt;           &amp;lt;distributionFileList&amp;gt;&lt;br /&gt;               &amp;lt;distributionFile origin="autoupdater-windows.exe"/&amp;gt;&lt;br /&gt;           &amp;lt;/distributionFileList&amp;gt;&lt;br /&gt;       &amp;lt;/folder&amp;gt;&lt;br /&gt;       &amp;lt;folder&amp;gt;&lt;br /&gt;           &amp;lt;name&amp;gt;autoupdaterlinux&amp;lt;/name&amp;gt;&lt;br /&gt;           &amp;lt;destination&amp;gt;${installdir}&amp;lt;/destination&amp;gt;&lt;br /&gt;           &amp;lt;platforms&amp;gt;linux&amp;lt;/platforms&amp;gt;&lt;br /&gt;           &amp;lt;distributionFileList&amp;gt;&lt;br /&gt;               &amp;lt;distributionFile origin="autoupdater-linux.bin"/&amp;gt;&lt;br /&gt;           &amp;lt;/distributionFileList&amp;gt;&lt;br /&gt;       &amp;lt;/folder&amp;gt;&lt;br /&gt;   &amp;lt;/folderList&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;postInstallationActionList&amp;gt;&lt;br /&gt;       &amp;lt;writeFile&amp;gt;&lt;br /&gt;           &amp;lt;path&amp;gt;${installdir}/update.ini&amp;lt;/path&amp;gt;&lt;br /&gt;           &amp;lt;text&amp;gt;[update]&lt;br /&gt;url = ${update_xml_url}&lt;br /&gt;version_id = ${application_version_id}&lt;br /&gt;update_download_location = ${system_temp_directory}&lt;br /&gt;check_for_updates = 1&lt;br /&gt;&amp;lt;/text&amp;gt;&lt;br /&gt;       &amp;lt;/writeFile&amp;gt;&lt;br /&gt;   &amp;lt;/postInstallationActionList&amp;gt;&lt;br /&gt;&amp;lt;/component&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Where the 'update_xml_url' installer variable must be setup to point to where update.xml can be fetched and 'application_version_id' must be modified to a higher value on each installer update. Of course, it will be also needed to copy the 'autoupdate-*' binary files to project directory.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Using AutoUpdate as a notifier&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Another approach can be to include the AutoUpdate but use it as a notifier which just checks if there are new updates available or not. This can be achieved calling the tool in unattended mode:&lt;br /&gt;&lt;pre&gt;$ autoupdater.bin --mode unattended&lt;/pre&gt;&lt;br /&gt;The exit code will be 0 if an update is available and 1 if not. You can use this approach to show a 'There's a new update available' message to users. To do so, you just call the process in background and generate the message if the returned code is 0:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;if (system(“path/to/autoupdater –mode unattended”) == 0){&lt;br /&gt; printf(“Update available. Run autoupdate to apply it.”);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Something similar may be added when the application starts, or as a cron task if it is a web application, so that the user detects that there's a new update without having to run AutoUpdater manually to check it.&lt;br /&gt;&lt;br /&gt;For more information on AutoUpdater, please see the AutoUpdate documentation included with each download of InstallBuilder.&lt;br /&gt;&lt;br /&gt;You can also watch the following video, that displays the needed steps:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin: 0px auto;" align="center"&gt;&lt;br /&gt;&lt;object width="500" height="375"&gt;&lt;param name="movie" value="http://www.youtube.com/v/WLfYVIqEn60&amp;amp;hl=en&amp;amp;fs=1&amp;amp;ap=%2526fmt%3D22"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="allowNetworking" value="all" &gt;&lt;embed src="http://www.youtube.com/v/WLfYVIqEn60&amp;amp;hl=en&amp;amp;fs=1&amp;amp;ap=%2526fmt%3D22" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" allowfullscreen="true" allowNetworking="all" height="375" width="500"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-61064854194505054?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/61064854194505054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=61064854194505054' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/61064854194505054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/61064854194505054'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2009/07/how-to-use-autoupdater-in.html' title='How to Use the AutoUpdater in InstallBuilder'/><author><name>Santiago</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14609551556002628142'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_NAHlhQTNQmw/SkyPnf-2qDI/AAAAAAAAAF0/YGXr7dz7oFo/s72-c/welcome-auto-update.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-2819212613014851180</id><published>2009-07-01T00:43:00.000-07:00</published><updated>2009-09-25T01:30:48.971-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='custom stacks'/><category scheme='http://www.blogger.com/atom/ns#' term='installbuilder'/><category scheme='http://www.blogger.com/atom/ns#' term='bitrock'/><category scheme='http://www.blogger.com/atom/ns#' term='components'/><title type='text'>How to Add Components and Make them Optional</title><content type='html'>BitRock InstallBuilder allows you to create cross platform installers that make it easy for end users to install your software. Though users are often presented with a simple 5-click process, the software bundled inside and its configuration are typically very complex and difficult to set up manually. Examples of this are posted on &lt;a href="http://www.bitnami.org/"&gt;BitNami.org&lt;/a&gt;, where stacks like Redmine, Alfresco or KnowledgeTree, which are fairly complex to install manually, can be installed in minutes thanks to installers that automate the process.&lt;br /&gt;&lt;br /&gt;All of the applications available via BitNami have many different dependencies, such as: libraries, databases, web servers, programming languages, run-times, etc. Apart from that, each of them has to be configured a certain way and then all of the pieces need to be integrated to work together. The installation process gets even more complicated if you want to make those 'modules' optional and allow the end user choose which ones should be installed and how they should be configured. BitRock InstallBuilder's components make the task easier.&lt;br /&gt;&lt;br /&gt;&lt;font style="font-weight: bold;"&gt;What is a Component?&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;You can think of a component as a 'black box' you use to simplify the way you build the installer. It is kind of a partial installer inside the primary installer that only applies to a subset of the software you are packaging (such as Apache, MySQL, etc).  This makes it very easy to re-use pieces of your installer and add and remove them as necessary. You can bundle files within components and add rules, scripts, actions, variables or parameter pages (which are used to ask the user how they want to configure that piece of software). Various components are then bundled inside the primary installer to present end users with a complete package. If you are familiar with &lt;a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;DRY&lt;/a&gt; (Do not Repeat Yourself) or KISS (Keep It Simple Stupid) terms, then InstallBuilder components will surely make you happy.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;font style="font-weight: bold;"&gt;How to Add Components&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;The InstallBuilder demo project comes with a default component. It is important to understand that BitRock InstallBuilder is very component-oriented - even when you create a very simple installer, you will probably have at least one component.&lt;br /&gt;&lt;br /&gt;Once you have InstallBuilder running in the GUI mode, go to 'Files' or the 'Advanced' section. All available components are displayed there. There are two ways to add a new one:&lt;br /&gt;&lt;br /&gt;- From the &lt;font style="font-style: italic;"&gt;'Files'&lt;/font&gt; section: click &lt;font style="font-style: italic;"&gt;'New Component'&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;- From the &lt;font style="font-style: italic;"&gt;'Advanced'&lt;/font&gt; section: select &lt;font style="font-style: italic;"&gt;'Components'&lt;/font&gt; and click &lt;font style="font-style: italic;"&gt;'add'&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;The window shown below should be on your screen.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/SksgV_3kG7I/AAAAAAAAAFM/fFma-1moJ04/s1600-h/installer-component-options.png"&gt;&lt;img style="border: 1px solid silver; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 242px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/SksgV_3kG7I/AAAAAAAAAFM/fFma-1moJ04/s400/installer-component-options.png" alt="" id="BLOGGER_PHOTO_ID_5353408144353794994" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here, you specify the three primary options:&lt;br /&gt;&lt;br /&gt;&lt;font style="font-style: italic;"&gt;'Install by default'&lt;/font&gt;: The component will be selected by default.&lt;br /&gt;&lt;font style="font-style: italic;"&gt;'Can be edited':&lt;/font&gt;  The end user is able to select or deselect the component in the Component Selection Window.&lt;br /&gt;&lt;font style="font-style: italic;"&gt;'Show'&lt;/font&gt;: The component will be shown in the Component Selection Window.&lt;br /&gt;&lt;br /&gt;You can do the same by editing the 'project.xml' file and adding the following snippet of XML:&lt;br /&gt;&lt;pre style="white-space: pre-wrap; font-size: 12px; color: grey;"&gt;&lt;br /&gt;&amp;lt;componentList&amp;gt;&lt;br /&gt;     ...&lt;br /&gt;     &amp;lt;component&amp;gt;&lt;br /&gt;         &amp;lt;name&amp;gt;componentabc&amp;lt;/name&amp;gt;&lt;br /&gt;         &amp;lt;description&amp;gt;Component ABC&amp;lt;/description&amp;gt;&lt;br /&gt;         &amp;lt;canBeEdited&amp;gt;1&amp;lt;/canBeEdited&amp;gt;&lt;br /&gt;         &amp;lt;detailedDescription&amp;gt;simple description for the component ABC&amp;lt;/detailedDescription&amp;gt;&lt;br /&gt;         &amp;lt;selected&amp;gt;0&amp;lt;/selected&amp;gt;&lt;br /&gt;         &amp;lt;shouldPackRuleEvaluationLogic&amp;gt;or&amp;lt;/shouldPackRuleEvaluationLogic&amp;gt;&lt;br /&gt;         &amp;lt;show&amp;gt;1&amp;lt;/show&amp;gt;&lt;br /&gt;     &amp;lt;/component&amp;gt;&lt;br /&gt;     ...&lt;br /&gt;&amp;lt;/componentList&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;People usually associate installer components with a window where the user can select or deselect software to be installed on their machine. This window is not shown by default in the case of InstallBuilder. Very often, you use components to make your installers well organized, clean and your XML code easier to reuse. If you want to show this window during installation, go to the &lt;font style="font-style: italic;"&gt;'Advanced'&lt;/font&gt; section, select &lt;font style="font-style: italic;"&gt;'project'&lt;/font&gt;, click &lt;font style="font-style: italic;"&gt;'More'&lt;/font&gt;, select &lt;font style="font-style: italic;"&gt;'Installation'&lt;/font&gt; in a new window and then &lt;font style="font-style: italic;"&gt;'Allow Component Selection'&lt;/font&gt;..&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/SksgWLYogCI/AAAAAAAAAFU/0Pfhlq-Rqls/s1600-h/installer-allow-component-selection.png"&gt;&lt;img style="border: 1px solid silver; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 121px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/SksgWLYogCI/AAAAAAAAAFU/0Pfhlq-Rqls/s400/installer-allow-component-selection.png" alt="" id="BLOGGER_PHOTO_ID_5353408147445284898" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can do the same by editing your xml file:&lt;br /&gt;&lt;pre&gt;&amp;lt;allowComponentSelection&amp;gt;1&amp;lt;/allowComponentSelection&amp;gt;&lt;/pre&gt;&lt;br /&gt;and during installation the following window will be displayed:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NAHlhQTNQmw/SkshQsUvawI/AAAAAAAAAFc/_FR9wMrkgrg/s1600-h/installer-component-show.png"&gt;&lt;img style="border: 1px solid silver; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 261px;" src="http://3.bp.blogspot.com/_NAHlhQTNQmw/SkshQsUvawI/AAAAAAAAAFc/_FR9wMrkgrg/s400/installer-component-show.png" alt="" id="BLOGGER_PHOTO_ID_5353409152719743746" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;font style="font-weight: bold;"&gt;Summary&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;As we have mentioned at the beginning of this post, components are like sub-installers. Inside them, you can bundle part of your application files, configuration, scripts, etc. Try to design your components in such a way that they can be reused in the future. Almost all InstallBuilder functionality, such as parameter pages, action lists, and rule lists are available for components:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NAHlhQTNQmw/Sksh2wL_a5I/AAAAAAAAAFk/10MO_7sN0eQ/s1600-h/installer-all-available-for-components.png"&gt;&lt;img style="border: 1px solid silver; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 296px; height: 273px;" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/Sksh2wL_a5I/AAAAAAAAAFk/10MO_7sN0eQ/s400/installer-all-available-for-components.png" alt="" id="BLOGGER_PHOTO_ID_5353409806591814546" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Additionally, you can place your components inside separate files and then include them in the main file:&lt;br /&gt;&lt;pre style="white-space: pre-wrap; font-size: 12px; color: grey;"&gt;&lt;br /&gt;&amp;lt;componentList&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;include file="component_abc.xml"/&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/componentList&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;... but it is a topic for another article.&lt;br /&gt;&lt;br /&gt;You can find more information about components in our online &lt;a href="http://support.bitrock.com/"&gt;knowledge base&lt;/a&gt;. Here are a few articles that may be of interest:&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://support.bitrock.com/article/how-do-components-work-in-installbuilder"&gt;http://support.bitrock.com/article/how-do-components-work-in-installbuilder&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://support.bitrock.com/article/does-installbuilder-support-component-selection"&gt;http://support.bitrock.com/article/does-installbuilder-support-component-selection&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://support.bitrock.com/article/is-there-a-command-line-option-for-component-selection"&gt;http://support.bitrock.com/article/is-there-a-command-line-option-for-component-selection&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://support.bitrock.com/article/what-are-the-components-of-a-rulelist"&gt;http://support.bitrock.com/article/what-are-the-components-of-a-rulelist&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We have also made a video demonstrating this procedure:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin: 0px auto;" align="center"&gt;&lt;br /&gt;&lt;object classid="clasid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/CD_jjq9uarI&amp;amp;hl=en&amp;amp;fs=1&amp;amp;ap=%2526fmt%3D18"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="allowNetworking" value="all" &gt;&lt;embed src="http://www.youtube.com/v/CD_jjq9uarI&amp;amp;hl=en&amp;amp;fs=1&amp;amp;ap=%2526fmt%3D18" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" allowfullscreen="true" allowNetworking="all" height="360" width="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-2819212613014851180?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/2819212613014851180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=2819212613014851180' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/2819212613014851180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/2819212613014851180'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2009/07/how-to-add-components-and-make-them.html' title='How to Add Components and Make them Optional'/><author><name>Santiago</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14609551556002628142'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_NAHlhQTNQmw/SksgV_3kG7I/AAAAAAAAAFM/fFma-1moJ04/s72-c/installer-component-options.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-8716022029928724647</id><published>2009-06-16T00:51:00.000-07:00</published><updated>2009-09-25T01:36:29.195-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='installbuilder'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='bitrock'/><category scheme='http://www.blogger.com/atom/ns#' term='installer'/><title type='text'>How To Integrate Bitrock InstallBuilder with Eclipse</title><content type='html'>Did you know that it is possible to integrate InstallBuilder into your development environment?&lt;br /&gt;&lt;br /&gt;You may already be familiar with the advanced GUI builder that was added in InstallBuilder 6. You can access most InstallBuilder features from the GUI, so you can develop complex installers without writing a line of code. However, there are situations in which that is not the ideal way to work with InstallBuilder. In addition to the GUI builder, you can work directly with the XML project file or interact with the tool using the command line interface. Both the XML project file and the command line builder interface turn InstallBuilder into a powerful development tool that can be integrated into your development environment.&lt;br /&gt;&lt;br /&gt;There are a variety of Integrated Development Environments (IDEs) that support functions such as source code editing, compilation, automation and version control. You can also integrate the packaging functionality that BitRock InstallBuilder provides because most IDEs can be configured to use external tools.&lt;br /&gt;&lt;br /&gt;In this article, we'll explain how to configure Eclipse to package your software with InstallBuilder. The configuration with other IDEs would be similar to this. This article is focused only on the basics - more complex configuration can be done to further customize your environment.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Getting BitRock InstallBuilder&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;To get started, you need to have InstallBuilder installed on your system. You can download the latest version from &lt;a href="http://installbuilder.bitrock.com/download.html"&gt;http://installbuilder.bitrock.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To install &lt;a href="http://installbuilder.bitrock.com/index.html"&gt;InstallBuilder&lt;/a&gt;, you can either click through the steps presented by the GUI installation wizard or you can run the installer in unattended mode.  In this case, we'll install it in unattended mode. Once you have downloaded the edition you'd like to use, you just need to execute from a command line console:&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-size:13;color:grey;"  &gt;$ installbuilder-enterprise-6.1.0-linux-installer.bin --mode unattended --prefix /path/to/installation/directory&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Creating a demo project in Eclipse&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If you don't already have Eclipse installed in your system you can get it and the installation instructions from &lt;a href="http://www.eclipse.org/"&gt;http://www.eclipse.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Once it is installed, open it and go to [File tab --&gt; New --&gt; Project]. You will be prompted to select a resource, select [General --&gt; Project]. In our example we'll use 'demo' as name of the project.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin: 0px auto;" align="center"&gt;&lt;br /&gt;&lt;a style="padding-right: 20px;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NAHlhQTNQmw/Sjdj8s5jx8I/AAAAAAAAAAU/qo_O2ERdij4/s1600-h/general_project.png"&gt;&lt;img style="border: 2px solid rgb(99, 135, 171); cursor: pointer; width: 225px; height: 215px;" src="http://3.bp.blogspot.com/_NAHlhQTNQmw/Sjdj8s5jx8I/AAAAAAAAAAU/qo_O2ERdij4/s320/general_project.png" alt="" id="BLOGGER_PHOTO_ID_5347852977021634498" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/Sjdk4XzXspI/AAAAAAAAAAc/JNSw7faQ0lo/s1600-h/project_name.png"&gt;&lt;img style="border: 2px solid rgb(99, 135, 171); cursor: pointer; width: 225px; height: 215px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/Sjdk4XzXspI/AAAAAAAAAAc/JNSw7faQ0lo/s320/project_name.png" alt="" id="BLOGGER_PHOTO_ID_5347854002150683282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;If you don't see the screen below, you may want to enable the navigator view. To do so, go to the Window tab --&gt; ShowView and look for the 'Navigator' and 'Console' views.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/SjdxiI0DkNI/AAAAAAAAABE/9a1U_LtLxV4/s1600-h/navigator_view.png"&gt;&lt;img style="border: 2px solid rgb(99, 135, 171); margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 285px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/SjdxiI0DkNI/AAAAAAAAABE/9a1U_LtLxV4/s400/navigator_view.png" alt="" id="BLOGGER_PHOTO_ID_5347867913821065426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To demonstrate the integration, we'll build one of the demo installers that are bundled in InstallBuilder. Let's use the example for the parameter screens. Import the project file parameters_example.xml that you can find in &amp;lt;installbuilder-installation-directory&amp;gt;/projects/examples/parameters.&lt;br /&gt;&lt;br /&gt;To import a file in Eclipse,  right-click on the project name and select [Import]. Then select [General --&gt; File System] in the window that appears and navigate through your file system to select the XML project file, docs and img folders.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/SjdzesElSPI/AAAAAAAAABs/iJjCeiq8las/s1600-h/import_example.png"&gt;&lt;img style="border: 2px solid rgb(99, 135, 171); margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/SjdzesElSPI/AAAAAAAAABs/iJjCeiq8las/s400/import_example.png" alt="" id="BLOGGER_PHOTO_ID_5347870053589403890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As you can see, the source of InstallBuilder is an XML file.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NAHlhQTNQmw/Sjdze9mvHeI/AAAAAAAAAB0/YhyWl6LCIHU/s1600-h/xml_vew.png"&gt;&lt;img style="border: 2px solid rgb(99, 135, 171); margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 297px;" src="http://4.bp.blogspot.com/_NAHlhQTNQmw/Sjdze9mvHeI/AAAAAAAAAB0/YhyWl6LCIHU/s400/xml_vew.png" alt="" id="BLOGGER_PHOTO_ID_5347870058296057314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Configuring Eclipse to build an Installer with InstallBuilder&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Now we are going to configure InstallBuilder as an External Tool. Go to [Run tab --&gt; External Tools --&gt; External Tools Configuration].&lt;br /&gt;&lt;br /&gt;&lt;div style="margin: 0px auto;" align="center"&gt;&lt;br /&gt;&lt;a style="padding-right: 20px;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NAHlhQTNQmw/Sjd1jXcbd3I/AAAAAAAAACc/jLetkwAeN-Y/s1600-h/external_tool.png"&gt;&lt;img style="border: 2px solid rgb(99, 135, 171); margin: 0pt 10px 10px 0pt; cursor: pointer; width: 210px; height: 168px;" src="http://2.bp.blogspot.com/_NAHlhQTNQmw/Sjd1jXcbd3I/AAAAAAAAACc/jLetkwAeN-Y/s320/external_tool.png" alt="" id="BLOGGER_PHOTO_ID_5347872332974880626" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/Sjd1wy5ghbI/AAAAAAAAACk/mnxNWWm-90w/s1600-h/external_tool_new.png"&gt;&lt;img style="border: 2px solid rgb(99, 135, 171); margin: 0pt 0pt 10px 10px; cursor: pointer; width: 210px; height: 168px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/Sjd1wy5ghbI/AAAAAAAAACk/mnxNWWm-90w/s320/external_tool_new.png" alt="" id="BLOGGER_PHOTO_ID_5347872563682903474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Right-click on [Program] and select [New]. Configure Eclipse by pointing it to the InstallBuilder builder tool, selecting the current project as the working directory and adding the appropriate arguments (build projectfile.xml platform). In our example, we need to use:&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-size:13;color:grey;"  &gt;build parameters_example.xml linux&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NAHlhQTNQmw/Sjd3LLA9l6I/AAAAAAAAAC0/644sbFQgk44/s1600-h/external_tool_build.png"&gt;&lt;img style="border: 2px solid rgb(99, 135, 171); margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 320px;" src="http://3.bp.blogspot.com/_NAHlhQTNQmw/Sjd3LLA9l6I/AAAAAAAAAC0/644sbFQgk44/s400/external_tool_build.png" alt="" id="BLOGGER_PHOTO_ID_5347874116344846242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We can add it to 'Favorites' so this functionality can easily be accessed. Go to the Run tab --&gt; External Tools --&gt; Organize Favorites and select the configuration we have just created:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/Sjd3K58cWLI/AAAAAAAAACs/T9zulsDc1v4/s1600-h/favorites.png"&gt;&lt;img style="border: 2px solid rgb(99, 135, 171); margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 320px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/Sjd3K58cWLI/AAAAAAAAACs/T9zulsDc1v4/s400/favorites.png" alt="" id="BLOGGER_PHOTO_ID_5347874111762487474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now in  [Run tab --&gt; External Tools] you should have the [Build Installer] option.&lt;br /&gt;&lt;br /&gt;Now it's time to test if our configuration is correct. Go to [Run tab --&gt; External Tools --&gt; Build Installer] and it will start to generate the installer for our demo application. If you have the 'Console' view enabled, you will see the installer being generated:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NAHlhQTNQmw/Sjd4q99c_uI/AAAAAAAAAC8/GdJ5gkuS99c/s1600-h/output.png"&gt;&lt;img style="border: 2px solid rgb(99, 135, 171); margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 185px;" src="http://1.bp.blogspot.com/_NAHlhQTNQmw/Sjd4q99c_uI/AAAAAAAAAC8/GdJ5gkuS99c/s400/output.png" alt="" id="BLOGGER_PHOTO_ID_5347875762107907810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Configuring Eclipse to Test the Generated Installer&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You can now test your installer. In the same way you added InstallBuilder as an External Tool, you can add the generated installer and launch it.  Below, you can see the configuration for the new External Tool. Remember to add it to your Favorites to make it easier to access.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NAHlhQTNQmw/Sjd5PJ_thJI/AAAAAAAAADE/-Sb36lQfgmo/s1600-h/run_installer.png"&gt;&lt;img style="border: 2px solid rgb(99, 135, 171); margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 320px;" src="http://3.bp.blogspot.com/_NAHlhQTNQmw/Sjd5PJ_thJI/AAAAAAAAADE/-Sb36lQfgmo/s400/run_installer.png" alt="" id="BLOGGER_PHOTO_ID_5347876383813895314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Give it a try! You will see your installer being launched from Eclipse.&lt;br /&gt;&lt;br /&gt;Before we wrap up, you know that InstallBuilder is a cross-platform installer, right? And that you can build installers for different platforms without the need to switch your development environment? Yes, you can build installers for Linux, OS X and Windows all from a Linux machine. If you have your development environment on Linux and you have 'wine' installed, you will also able to test your Windows installer from your development environment.&lt;br /&gt;&lt;br /&gt;We have also made a video that shows how to integrate InstallBuilder with Eclipse:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin: 0px auto;" align="center"&gt;&lt;br /&gt;&lt;object classid="clasid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="480" height="360"&gt;&lt;param name="movie" value="http://www.youtube.com/v/oNrgX4ND3QI&amp;amp;hl=en&amp;amp;fs=1&amp;amp;ap=%2526fmt%3D18"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/oNrgX4ND3QI&amp;amp;hl=en&amp;amp;fs=1&amp;amp;ap=%2526fmt%3D18" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" allowfullscreen="true" width="480" height="360"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-8716022029928724647?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/8716022029928724647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/8716022029928724647'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2009/06/how-to-integrate-bitrock-installbuilder.html' title='How To Integrate Bitrock InstallBuilder with Eclipse'/><author><name>Santiago</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14609551556002628142'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_NAHlhQTNQmw/Sjdj8s5jx8I/AAAAAAAAAAU/qo_O2ERdij4/s72-c/general_project.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-1777502748112936359</id><published>2009-06-09T20:28:00.000-07:00</published><updated>2009-06-10T09:36:08.901-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javaone'/><category scheme='http://www.blogger.com/atom/ns#' term='bitrock'/><category scheme='http://www.blogger.com/atom/ns#' term='events'/><title type='text'>Great Week at JavaOne</title><content type='html'>&lt;font size="2"&gt;We had a great week last week at &lt;a href="http://java.sun.com/javaone/"&gt;JavaOne&lt;/a&gt; in San Francisco. It was great to meet a number of &lt;a href="http://installbuilder.bitrock.com/"&gt;InstallBuilder&lt;/a&gt; customers in person. We also had an opportunity to learn about several cool new startups, including  &lt;a href="http://www.jrapid.com/"&gt;JRapid&lt;/a&gt;, which has developed a tool that speeds up AJAX application development, &lt;a href="http://scrumninja.com/scrum_software"&gt;ScrumNinja, &lt;/a&gt;which offers a slick web app for managing Scrum, &lt;a href="http://www.micello.com/"&gt;Micello&lt;/a&gt;, which has a cool &lt;/font&gt;&lt;font color="#000000" size="2"&gt;indoor location-based-service on mobile devices and &lt;a href="http://www.agileitinc.com/"&gt;AgileIT&lt;/a&gt;, which makes it easy to add web services to your application.&lt;br /&gt;&lt;br /&gt;I also gave a lightning talk on how BitRock worked with Logical Awesome to develop an &lt;a href="http://bitrock.com/github-bitrock-installlbuilder-stack.html"&gt;on-site version of GitHub &lt;/a&gt;that is easy to install. The video should be posted soon and I'll be sure to provide a link once it is available.&lt;br /&gt;&lt;br /&gt;As promised, we raffled off an EeePC, which was won by Frank from New York. Congratulations, Frank!&lt;br /&gt;&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-1777502748112936359?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/1777502748112936359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=1777502748112936359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/1777502748112936359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/1777502748112936359'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2009/06/great-week-at-javaone.html' title='Great Week at JavaOne'/><author><name>Erica Brescia</name><uri>http://www.blogger.com/profile/02065317823546496697</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02357292580845573015'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-5283822999550766180</id><published>2009-06-09T16:40:00.000-07:00</published><updated>2009-09-25T01:46:10.151-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='customers'/><category scheme='http://www.blogger.com/atom/ns#' term='github'/><category scheme='http://www.blogger.com/atom/ns#' term='bitrock'/><title type='text'>GitHub On-Premise Version Now Available</title><content type='html'>&lt;font size="2"&gt;Last week, we &lt;a href="http://bitrock.com/about_news_github_bitrock.html"&gt;announced&lt;/a&gt; the release of a customer's new product, &lt;a href="http://fi.github.com/"&gt;GitHub:Firewall Install&lt;/a&gt;. Congratulations to our friends at Logical Awesome, the makers of &lt;a href="http://www.github.com/"&gt;Github&lt;/a&gt;, for the very successful launch of their on-premise edition!&lt;br /&gt;&lt;br /&gt;If you're not already familiar with it, GitHub is  a wildly popular web application for social coding, with over 80,000 developers already using the site. Built on top of the Git distributed version control system, it makes it easy for distributed teams to collaborate on software development projects. &lt;/font&gt;  &lt;p&gt;&lt;font size="2"&gt;Until now, GitHub was only available as a service, which made it inaccessible to companies that will not allow their code to be hosted outside of the corporate firewall for security reasons. After seeing increasing demand for an on-site version of their product, the Logical Awesome team approached BitRock to package the new version,&lt;font style="text-decoration: underline;"&gt;&lt;/font&gt; GitHub:FI, for easy installation at customer sites.&lt;br /&gt;&lt;font style="text-decoration: underline;"&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;BitRock developed a completely self-contained installer for GitHub:FI that enables new users to get up and running in just a few mouse clicks. The installer contains all of the software required to run GitHub: Ruby on Rails, JRuby, Solr, Java, Python, Perl, Git, Pygments, OpenSSL and over 30 additional components. It completely automates the installation and configuration process, so no manual setup steps are required. Logical Awesome is also taking advantage of the &lt;a href="http://bitrock.com/products_network_overview.html"&gt;BitRock Network Service&lt;/a&gt; to better inform product development and support. &lt;/font&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;&lt;font style="font-style: italic;"&gt;Want BitRock to make your software that easy to install?&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2"&gt;Whether your software is built on PHP, Rails, Java, Perl or Python, we can deliver a complete package that enables even non-technical end users to have it up and running in minutes on Windows, Linux, OS X or Solaris. To learn more, &lt;a href="mailto:sales@bitrock.com"&gt;contact&lt;/a&gt; our sales team.&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-5283822999550766180?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/5283822999550766180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=5283822999550766180' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/5283822999550766180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/5283822999550766180'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2009/06/github-on-premise-version-now-available.html' title='GitHub On-Premise Version Now Available'/><author><name>Erica Brescia</name><uri>http://www.blogger.com/profile/02065317823546496697</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02357292580845573015'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-6210059072268257606</id><published>2009-06-08T15:04:00.000-07:00</published><updated>2009-11-12T01:11:55.787-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cross platform installer'/><category scheme='http://www.blogger.com/atom/ns#' term='installbuilder'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='bitrock'/><title type='text'>How to Create Custom Pages with InstallBuilder</title><content type='html'>&lt;span&gt;This week, we are kicking off a weekly series of 'how-to' posts for InstallBuilder, our &lt;a href="http://installbuilder.bitrock.com/"&gt;crossplatform installation tool&lt;/a&gt;. Each how-to will include detailed instructions, as well as downloadable XML examples and (in most cases) a video demonstrating the process. In this first installment, we're going to cover how to create custom pages. InstallBuilder allows you to create multiple parameter pages: stringParameter, choiceParameter, booleanParameter... But what if you want a more customized page? Here is where parameterGroups come into play. parameterGroups allow you to define a list of parameters to be displayed in the same page and how to display them. This tutorial will be divided in 3 steps. First, we will design the page schema. In the second step, we will apply validations to fields. In the last step, we will perform actions based upon the user input.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;First step:&lt;br /&gt;&lt;br /&gt;For this example, we are going to collect information to configure a web application. The required fields will be:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span &gt;Username (stringParameter): The administration username.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;Password (passwordParameter): The administrator password&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;IP Address &amp;amp; port (stringParameter): The IP and port in which the server will be listening.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;DBMS server (choiceParameter): Either MySQL or PostgreSQL&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;Basic or advanced installation (booleanParameter): In advanced mode, we can collect additional information.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span &gt;Lets create a basic template of the page. In this code, we have listed the parameters inside an &amp;lt;actionGroup&amp;gt;:&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span &gt;&lt;br /&gt;&amp;lt;project&amp;gt;&lt;br /&gt;&amp;lt;shortName&amp;gt;sample&amp;lt;/shortName&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;parameterList&amp;gt;&lt;br /&gt;&amp;lt;parameterGroup&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;configuration&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Configuration&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;explanation&amp;gt;Configuration page&amp;lt;/explanation&amp;gt;&lt;br /&gt;&amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;default&amp;gt;&amp;lt;/default&amp;gt;&lt;br /&gt;&amp;lt;parameterList&amp;gt;&lt;br /&gt;   &amp;lt;stringParameter&amp;gt;&lt;br /&gt;       &amp;lt;name&amp;gt;username&amp;lt;/name&amp;gt;&lt;br /&gt;       &amp;lt;description&amp;gt;Username&amp;lt;/description&amp;gt;&lt;br /&gt;       &amp;lt;explanation&amp;gt;Administrator account username&amp;lt;/explanation&amp;gt;&lt;br /&gt;       &amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;br /&gt;       &amp;lt;default&amp;gt;&amp;lt;/default&amp;gt;&lt;br /&gt;       &amp;lt;allowEmptyValue&amp;gt;1&amp;lt;/allowEmptyValue&amp;gt;&lt;br /&gt;       &amp;lt;width&amp;gt;30&amp;lt;/width&amp;gt;&lt;br /&gt;   &amp;lt;/stringParameter&amp;gt;&lt;br /&gt;   &amp;lt;passwordParameter&amp;gt;&lt;br /&gt;       &amp;lt;name&amp;gt;password&amp;lt;/name&amp;gt;&lt;br /&gt;       &amp;lt;description&amp;gt;Password&amp;lt;/description&amp;gt;&lt;br /&gt;       &amp;lt;explanation&amp;gt;Addministrator account password&amp;lt;/explanation&amp;gt;&lt;br /&gt;       &amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;br /&gt;       &amp;lt;default&amp;gt;&amp;lt;/default&amp;gt;&lt;br /&gt;       &amp;lt;allowEmptyValue&amp;gt;1&amp;lt;/allowEmptyValue&amp;gt;&lt;br /&gt;       &amp;lt;descriptionRetype&amp;gt;&amp;lt;/descriptionRetype&amp;gt;&lt;br /&gt;       &amp;lt;width&amp;gt;20&amp;lt;/width&amp;gt;&lt;br /&gt;   &amp;lt;/passwordParameter&amp;gt;&lt;br /&gt;   &amp;lt;stringParameter&amp;gt;&lt;br /&gt;       &amp;lt;name&amp;gt;ipaddress&amp;lt;/name&amp;gt;&lt;br /&gt;       &amp;lt;description&amp;gt;Web Server IP&amp;lt;/description&amp;gt;&lt;br /&gt;       &amp;lt;explanation&amp;gt;&amp;lt;/explanation&amp;gt;&lt;br /&gt;       &amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;br /&gt;       &amp;lt;default&amp;gt;&amp;lt;/default&amp;gt;&lt;br /&gt;       &amp;lt;allowEmptyValue&amp;gt;1&amp;lt;/allowEmptyValue&amp;gt;&lt;br /&gt;       &amp;lt;width&amp;gt;30&amp;lt;/width&amp;gt;&lt;br /&gt;   &amp;lt;/stringParameter&amp;gt;&lt;br /&gt;   &amp;lt;stringParameter&amp;gt;&lt;br /&gt;       &amp;lt;name&amp;gt;port&amp;lt;/name&amp;gt;&lt;br /&gt;       &amp;lt;description&amp;gt;Web Server Port&amp;lt;/description&amp;gt;&lt;br /&gt;       &amp;lt;explanation&amp;gt;&amp;lt;/explanation&amp;gt;&lt;br /&gt;       &amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;br /&gt;       &amp;lt;default&amp;gt;&amp;lt;/default&amp;gt;&lt;br /&gt;       &amp;lt;allowEmptyValue&amp;gt;1&amp;lt;/allowEmptyValue&amp;gt;&lt;br /&gt;       &amp;lt;width&amp;gt;30&amp;lt;/width&amp;gt;&lt;br /&gt;   &amp;lt;/stringParameter&amp;gt;&lt;br /&gt;   &amp;lt;booleanParameter&amp;gt;&lt;br /&gt;       &amp;lt;name&amp;gt;advancedconfig&amp;lt;/name&amp;gt;&lt;br /&gt;       &amp;lt;description&amp;gt;Enable advance&amp;lt;/description&amp;gt;&lt;br /&gt;       &amp;lt;explanation&amp;gt;Would you like to perform an advance installation?&amp;lt;/explanation&amp;gt;&lt;br /&gt;       &amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;br /&gt;       &amp;lt;default&amp;gt;&amp;lt;/default&amp;gt;&lt;br /&gt;       &amp;lt;displayStyle&amp;gt;checkbox-left&amp;lt;/displayStyle&amp;gt;&lt;br /&gt;   &amp;lt;/booleanParameter&amp;gt;&lt;br /&gt;   &amp;lt;choiceParameter&amp;gt;&lt;br /&gt;       &amp;lt;name&amp;gt;dbmsserver&amp;lt;/name&amp;gt;&lt;br /&gt;       &amp;lt;description&amp;gt;DBMS&amp;lt;/description&amp;gt;&lt;br /&gt;       &amp;lt;explanation&amp;gt;Database server&amp;lt;/explanation&amp;gt;&lt;br /&gt;       &amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;br /&gt;       &amp;lt;default&amp;gt;&amp;lt;/default&amp;gt;&lt;br /&gt;       &amp;lt;allowEmptyValue&amp;gt;1&amp;lt;/allowEmptyValue&amp;gt;&lt;br /&gt;       &amp;lt;displayType&amp;gt;combobox&amp;lt;/displayType&amp;gt;&lt;br /&gt;       &amp;lt;width&amp;gt;30&amp;lt;/width&amp;gt;&lt;br /&gt;       &amp;lt;optionList&amp;gt;&lt;br /&gt;           &amp;lt;option&amp;gt;&lt;br /&gt;               &amp;lt;description&amp;gt;MySQL server&amp;lt;/description&amp;gt;&lt;br /&gt;               &amp;lt;image&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;               &amp;lt;text&amp;gt;MySQL&amp;lt;/text&amp;gt;&lt;br /&gt;               &amp;lt;value&amp;gt;mysql&amp;lt;/value&amp;gt;&lt;br /&gt;           &amp;lt;/option&amp;gt;&lt;br /&gt;           &amp;lt;option&amp;gt;&lt;br /&gt;               &amp;lt;description&amp;gt;PostgreSQL server&amp;lt;/description&amp;gt;&lt;br /&gt;               &amp;lt;image&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt;               &amp;lt;text&amp;gt;PostgreSQL&amp;lt;/text&amp;gt;&lt;br /&gt;               &amp;lt;value&amp;gt;postgres&amp;lt;/value&amp;gt;&lt;br /&gt;           &amp;lt;/option&amp;gt;&lt;br /&gt;       &amp;lt;/optionList&amp;gt;&lt;br /&gt;   &amp;lt;/choiceParameter&amp;gt;&lt;br /&gt;&amp;lt;/parameterList&amp;gt;&lt;br /&gt;&amp;lt;/parameterGroup&amp;gt;&lt;br /&gt;&amp;lt;/parameterList&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span &gt;Then, build and run.&lt;br /&gt;&lt;br /&gt;Image 1:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Db9iUBipxmo/Si2V1Px4m_I/AAAAAAAAABw/SNaXpIXrp50/s1600-h/article-01.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 297px;" src="http://4.bp.blogspot.com/_Db9iUBipxmo/Si2V1Px4m_I/AAAAAAAAABw/SNaXpIXrp50/s400/article-01.bmp" alt="" id="BLOGGER_PHOTO_ID_5345093074760014834" border="0" /&gt;&lt;/a&gt;&lt;span &gt;&lt;br /&gt;This is obviously not the expected result. We can modify the height of the page but the result is not ideal:&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span &gt;&lt;br /&gt;&amp;lt;project&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;height&amp;gt;400&amp;lt;/height&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span &gt;&lt;br /&gt;&lt;br /&gt;Image 2:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Db9iUBipxmo/Si2WsFce2qI/AAAAAAAAAB4/ZHNElCH_qVU/s1600-h/article-02.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 388px; height: 400px;" src="http://2.bp.blogspot.com/_Db9iUBipxmo/Si2WsFce2qI/AAAAAAAAAB4/ZHNElCH_qVU/s400/article-02.bmp" alt="" id="BLOGGER_PHOTO_ID_5345094016878697122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As we said, this is better but still not the best it could be.&lt;br /&gt;&lt;br /&gt;Using nested parameterGroups, we can use the &amp;lt;orientation&amp;gt; tag to modify the organization of the default parameters inside the parameter group from "vertical" to "horizontal". Also, nested parameter groups allow us to group related fields (for example, username and password):&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span &gt;&lt;br /&gt;&amp;lt;parameterGroup&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;configuration&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Configuration&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;explanation&amp;gt;&amp;lt;/explanation&amp;gt;&lt;br /&gt;&amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;default&amp;gt;&amp;lt;/default&amp;gt;&lt;br /&gt;&amp;lt;parameterList&amp;gt;&lt;br /&gt;&amp;lt;parameterGroup&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;adminaccount&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;explanation&amp;gt;Admin Account&amp;lt;/explanation&amp;gt;&lt;br /&gt;&amp;lt;orientation&amp;gt;horizontal&amp;lt;/orientation&amp;gt;&lt;br /&gt;&amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;default&amp;gt;&amp;lt;/default&amp;gt;&lt;br /&gt;&amp;lt;parameterList&amp;gt;&lt;br /&gt;  &amp;lt;stringParameter&amp;gt;&lt;br /&gt;    &amp;lt;name&amp;gt;username&amp;lt;/name&amp;gt;&lt;br /&gt;    &amp;lt;description&amp;gt;Username&amp;lt;/description&amp;gt;&lt;br /&gt;    &amp;lt;explanation&amp;gt;&amp;lt;/explanation&amp;gt;&lt;br /&gt;    &amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;br /&gt;    &amp;lt;default&amp;gt;&amp;lt;/default&amp;gt;&lt;br /&gt;    &amp;lt;allowEmptyValue&amp;gt;1&amp;lt;/allowEmptyValue&amp;gt;&lt;br /&gt;    &amp;lt;width&amp;gt;20&amp;lt;/width&amp;gt;&lt;br /&gt; &amp;lt;/stringParameter&amp;gt;&lt;br /&gt; &amp;lt;passwordParameter&amp;gt;&lt;br /&gt;    &amp;lt;name&amp;gt;password&amp;lt;/name&amp;gt;&lt;br /&gt;    &amp;lt;description&amp;gt;Password&amp;lt;/description&amp;gt;&lt;br /&gt;    &amp;lt;explanation&amp;gt;&amp;lt;/explanation&amp;gt;&lt;br /&gt;    &amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;br /&gt;    &amp;lt;default&amp;gt;&amp;lt;/default&amp;gt;&lt;br /&gt;    &amp;lt;allowEmptyValue&amp;gt;1&amp;lt;/allowEmptyValue&amp;gt;&lt;br /&gt;    &amp;lt;descriptionRetype&amp;gt;&amp;lt;/descriptionRetype&amp;gt;&lt;br /&gt;    &amp;lt;width&amp;gt;20&amp;lt;/width&amp;gt;&lt;br /&gt; &amp;lt;/passwordParameter&amp;gt;&lt;br /&gt;&amp;lt;/parameterList&amp;gt;&lt;br /&gt;&amp;lt;/parameterGroup&amp;gt;&lt;br /&gt;&amp;lt;parameterGroup&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;serveraddres&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;explanation&amp;gt;Server Address&amp;lt;/explanation&amp;gt;&lt;br /&gt;&amp;lt;orientation&amp;gt;horizontal&amp;lt;/orientation&amp;gt;&lt;br /&gt;&amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;default&amp;gt;&amp;lt;/default&amp;gt;&lt;br /&gt;&amp;lt;parameterList&amp;gt;&lt;br /&gt;&amp;lt;stringParameter&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;ipaddress&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;description&amp;gt;IP and Port&amp;lt;/description&amp;gt;&lt;br /&gt;  &amp;lt;explanation&amp;gt;&amp;lt;/explanation&amp;gt;&lt;br /&gt;  &amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;br /&gt;  &amp;lt;default&amp;gt;&amp;lt;/default&amp;gt;&lt;br /&gt;  &amp;lt;allowEmptyValue&amp;gt;1&amp;lt;/allowEmptyValue&amp;gt;&lt;br /&gt;  &amp;lt;width&amp;gt;30&amp;lt;/width&amp;gt;&lt;br /&gt;&amp;lt;/stringParameter&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;stringParameter&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;port&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;description&amp;gt;:&amp;lt;/description&amp;gt;&lt;br /&gt;  &amp;lt;explanation&amp;gt;&amp;lt;/explanation&amp;gt;&lt;br /&gt;  &amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;br /&gt;  &amp;lt;default&amp;gt;&amp;lt;/default&amp;gt;&lt;br /&gt;  &amp;lt;allowEmptyValue&amp;gt;1&amp;lt;/allowEmptyValue&amp;gt;&lt;br /&gt;  &amp;lt;width&amp;gt;5&amp;lt;/width&amp;gt;&lt;br /&gt;&amp;lt;/stringParameter&amp;gt;&lt;br /&gt;&amp;lt;/parameterList&amp;gt;&lt;br /&gt;&amp;lt;/parameterGroup&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;booleanParameter&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;advancedconfig&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;description&amp;gt;Enable advance&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;explanation&amp;gt;Would you like to perform an advance installation?&amp;lt;/explanation&amp;gt;&lt;br /&gt;&amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;default&amp;gt;&amp;lt;/default&amp;gt;&lt;br /&gt;&amp;lt;displayStyle&amp;gt;checkbox-left&amp;lt;/displayStyle&amp;gt;&lt;br /&gt;&amp;lt;/booleanParameter&amp;gt;&lt;br /&gt;&amp;lt;choiceParameter&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;dbmsserver&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;description&amp;gt;DBMS&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;explanation&amp;gt;Database server&amp;lt;/explanation&amp;gt;&lt;br /&gt;&amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;default&amp;gt;&amp;lt;/default&amp;gt;&lt;br /&gt;&amp;lt;allowEmptyValue&amp;gt;1&amp;lt;/allowEmptyValue&amp;gt;&lt;br /&gt;&amp;lt;displayType&amp;gt;combobox&amp;lt;/displayType&amp;gt;&lt;br /&gt;&amp;lt;width&amp;gt;30&amp;lt;/width&amp;gt;&lt;br /&gt;&amp;lt;optionList&amp;gt;&lt;br /&gt;&amp;lt;option&amp;gt;&lt;br /&gt; &amp;lt;description&amp;gt;MySQL server&amp;lt;/description&amp;gt;&lt;br /&gt; &amp;lt;image&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt; &amp;lt;text&amp;gt;MySQL&amp;lt;/text&amp;gt;&lt;br /&gt; &amp;lt;value&amp;gt;mysql&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;lt;option&amp;gt;&lt;br /&gt; &amp;lt;description&amp;gt;PostgreSQL server&amp;lt;/description&amp;gt;&lt;br /&gt; &amp;lt;image&amp;gt;&amp;lt;/image&amp;gt;&lt;br /&gt; &amp;lt;text&amp;gt;PostgreSQL&amp;lt;/text&amp;gt;&lt;br /&gt; &amp;lt;value&amp;gt;postgres&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;lt;/optionList&amp;gt;&lt;br /&gt;&amp;lt;/choiceParameter&amp;gt;&lt;br /&gt;&amp;lt;/parameterList&amp;gt;&lt;br /&gt;&amp;lt;/parameterGroup&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span &gt;Image 3:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Db9iUBipxmo/Si2XNzzI3WI/AAAAAAAAACA/N1Jo4wxkK9c/s1600-h/article-03.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 337px;" src="http://3.bp.blogspot.com/_Db9iUBipxmo/Si2XNzzI3WI/AAAAAAAAACA/N1Jo4wxkK9c/s400/article-03.bmp" alt="" id="BLOGGER_PHOTO_ID_5345094596257439074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We now have the desired result.&lt;br /&gt;&lt;br /&gt;Let's continue to step 2, validations.&lt;br /&gt;&lt;br /&gt;Step 2: At this point, a user could leave some required fields blank or provide a nonnumeric value for the port. We need to validate the information provided and, in the event that it is not valid, ask for the information again.&lt;br /&gt;&lt;br /&gt;Username and password: We need a username, but we want to allow the password field to be  blank . We will include a pop-up to warn the user. To require a non-empty value, we just need to set &amp;lt;allowEmptyValue&amp;gt;0&amp;lt;/allowEmptyValue&amp;gt; in the desired parameter.  For more complex validations, such as launching a pop-up to warn the user, we need a &amp;lt;validationActionList&amp;gt;:&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span &gt;&lt;br /&gt;&amp;lt;passwordParameter&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;password&amp;lt;/name&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;!-- In a validationActionList you can execute any desired action --&amp;gt;&lt;br /&gt;&amp;lt;validationActionList&amp;gt;&lt;br /&gt;&amp;lt;showQuestion text="Are you sure you want to provide an empty password?" variable="continue" &amp;gt;&lt;br /&gt;&amp;lt;ruleList&amp;gt;&lt;br /&gt; &amp;lt;compareText text="${password}" logic="equals" value=""/&amp;gt;&lt;br /&gt;&amp;lt;/ruleList&amp;gt;&lt;br /&gt;&amp;lt;/showQuestion&amp;gt;&lt;br /&gt;&amp;lt;!-- The next_page built-in variable controls the intallation flow at runtime --&amp;gt; &lt;br /&gt;&amp;lt;setInstallerVariable name="next_page" value="configuration"&amp;gt;&lt;br /&gt;&amp;lt;ruleList&amp;gt;&lt;br /&gt; &amp;lt;compareText text="${continue}" logic="equals" value="no"/&amp;gt;&lt;br /&gt;&amp;lt;/ruleList&amp;gt;&lt;br /&gt;&amp;lt;/setInstallerVariable&amp;gt;&lt;br /&gt;&amp;lt;/validationActionList&amp;gt;&lt;br /&gt;&amp;lt;/passwordParameter&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span &gt;IP and port: We could do a lot of validations here, but lets limit them to require a pseudo valid IP (four three digit numbers separated by periods) and a valid port that is not in use.&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;br /&gt;&amp;lt;parameterGroup&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;serveraddres&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;explanation&amp;gt;Server Address&amp;lt;/explanation&amp;gt;&lt;br /&gt;&amp;lt;orientation&amp;gt;horizontal&amp;lt;/orientation&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;parameterList&amp;gt;&lt;br /&gt;&amp;lt;stringParameter&amp;gt;&lt;br /&gt; &amp;lt;name&amp;gt;ipaddress&amp;lt;/name&amp;gt;&lt;br /&gt; &amp;lt;description&amp;gt;IP and Port&amp;lt;/description&amp;gt;&lt;br /&gt; ...&lt;br /&gt; &amp;lt;validationActionList&amp;gt;&lt;br /&gt;     &amp;lt;setInstallerVariableFromRegEx text="${ipaddress}" pattern="^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$" substitution="valid" name="result"/&amp;gt;&lt;br /&gt;     &amp;lt;actionGroup&amp;gt;&lt;br /&gt;         &amp;lt;actionList&amp;gt;&lt;br /&gt;             &amp;lt;throwError text="This not seems to be a valid IP addres"/&amp;gt;&lt;br /&gt;         &amp;lt;/actionList&amp;gt;                       &lt;br /&gt;         &amp;lt;ruleList&amp;gt;&lt;br /&gt;             &amp;lt;compareText text="${result}" logic="does_not_equal" value="valid"/&amp;gt;&lt;br /&gt;         &amp;lt;/ruleList&amp;gt;&lt;br /&gt;     &amp;lt;/actionGroup&amp;gt;&lt;br /&gt; &amp;lt;/validationActionList&amp;gt;&lt;br /&gt;&amp;lt;/stringParameter&amp;gt;&lt;br /&gt;&amp;lt;stringParameter&amp;gt;&lt;br /&gt; &amp;lt;name&amp;gt;port&amp;lt;/name&amp;gt;&lt;br /&gt; &amp;lt;description&amp;gt;:&amp;lt;/description&amp;gt;&lt;br /&gt; ...&lt;br /&gt; &amp;lt;width&amp;gt;5&amp;lt;/width&amp;gt;&lt;br /&gt; &amp;lt;validationActionList&amp;gt;&lt;br /&gt;     &amp;lt;throwError text="Cannot bind to the selected port. Please choose another one."&amp;gt;&lt;br /&gt;         &amp;lt;ruleList&amp;gt;&lt;br /&gt;             &amp;lt;portTest condition="cannot_bind" port="${port}"/&amp;gt;&lt;br /&gt;         &amp;lt;/ruleList&amp;gt;&lt;br /&gt;     &amp;lt;/throwError&amp;gt;&lt;br /&gt; &amp;lt;/validationActionList&amp;gt;&lt;br /&gt;&amp;lt;/stringParameter&amp;gt;&lt;br /&gt;&amp;lt;/parameterList&amp;gt;&lt;br /&gt;&amp;lt;/parameterGroup&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span &gt;As the rest of the parameters are constrained by the installer and cannot contain incorrect values, we do not need to perform any more validations.&lt;br /&gt;&lt;br /&gt;Step 3:&lt;br /&gt;&lt;br /&gt;Now, once we have all the needed information and we are sure it is correct, we can perform some actions with it before the next page appears. For example, based on the "Advanced Installation" booleanParameter, we could make visible a by default hidden page.&lt;br /&gt;&lt;br /&gt;Lets assume the advance configuration is the installation directory. If the parameter is checked, the installation directory will be visible. Otherwise, it will not be displayed.&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- the &amp;lt;ask&amp;gt; tag of a parameter controls if it will be shown or not. When a parameter&lt;br /&gt;is not shown its preShowPage and postShowPage won't be executed --&amp;gt;&lt;br /&gt;&amp;lt;directoryParameter&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;installdir&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;description&amp;gt;Installer.Parameter.installdir.description&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;explanation&amp;gt;Installer.Parameter.installdir.explanation&amp;lt;/explanation&amp;gt;&lt;br /&gt;&amp;lt;!-- The insertAfter and insertBefore tags define&lt;br /&gt;in which position a parameter will be shown --&amp;gt;&lt;br /&gt;&amp;lt;insertAfter&amp;gt;configuration&amp;lt;/insertAfter&amp;gt;&lt;br /&gt;&amp;lt;default&amp;gt;${platform_install_prefix}/${product_shortname}-${product_version}&amp;lt;/default&amp;gt;&lt;br /&gt;&amp;lt;ask&amp;gt;0&amp;lt;/ask&amp;gt;&lt;br /&gt;&amp;lt;/directoryParameter&amp;gt;&lt;br /&gt;&lt;br /&gt;As we have set by default &amp;lt;ask&amp;gt;0&amp;lt;/ask&amp;gt;, this parameter will be hidden and the user would be unable to change it.&lt;br /&gt;&lt;br /&gt;Getting back to our custom page, we could use the &amp;lt;postShowPageActionList&amp;gt; to show the installdir parameter:&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span&gt;&lt;br /&gt;&amp;lt;parameterGroup&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;configuration&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Configuration&amp;lt;/title&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;parameterList&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/parameterList&amp;gt;&lt;br /&gt;&amp;lt;!-- Using the notation below we can modify any parameter property --&amp;gt;&lt;br /&gt;&amp;lt;postShowPageActionList&amp;gt;&lt;br /&gt;&amp;lt;setInstallerVariable name="project.parameter(installdir).ask" value="1" &amp;gt;&lt;br /&gt;&amp;lt;ruleList&amp;gt;&lt;br /&gt;  &amp;lt;isTrue value="${advancedconfig}"/&amp;gt;&lt;br /&gt;&amp;lt;/ruleList&amp;gt;&lt;br /&gt;&amp;lt;/setInstallerVariable&amp;gt;&lt;br /&gt;&amp;lt;/postShowPageActionList&amp;gt;&lt;br /&gt;&amp;lt;/parameterGroup&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span&gt;We now have a complete custom page.&lt;br /&gt;&lt;br /&gt;You can download the XML project file from the &lt;a href="http://installbuilder.bitrock.com/blog-resources/custom-pages.xml"&gt;InstallBuilder website&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We have also made a video demonstrating the process via the GUI:&lt;br /&gt;&lt;object classid="clasid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="480" height="360"&gt;&lt;param name="movie" value="http://www.youtube.com/v/UxHXbj8vD3s&amp;amp;hl=en&amp;amp;fs=1&amp;amp;ap=%2526fmt%3D18"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/UxHXbj8vD3s&amp;amp;hl=en&amp;amp;fs=1&amp;amp;ap=%2526fmt%3D18" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" allowfullscreen="true" width="480" height="360"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For an extensive list of rules and actions to use for custom pages, please refer to the InstallBuilder reference documentation. Also, these articles in our &lt;a href="http://support.bitrock.com/"&gt;KnowledgeBase&lt;/a&gt; provide additional information on the topics mentioned in the article:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Parameters: &lt;a href="http://support.bitrock.com/article/how-do-i-ask-the-user-for-more-than-one-parameter-in-the-same-screen"&gt;How to ask the user for more than one parameter in the same screen&lt;/a&gt; &lt;a href="http://support.bitrock.com/article/how-can-i-arrange-parameters-horizontally"&gt;How to Arrange Parameters Horizontally&lt;/a&gt;, &lt;a href="http://support.bitrock.com/article/what-input-can-i-ask-the-user-for-during-installation"&gt;How to ask for different inputs during the installation process&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Validations: &lt;a href="http://support.bitrock.com/article/how-can-i-validate-user-input"&gt;How to Validate User Input&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;About the next_page built-in variable: &lt;a href="http://support.bitrock.com/article/how-can-i-control-the-flow-of-the-pages"&gt;How to Control the Flow of Pages&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-6210059072268257606?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/6210059072268257606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=6210059072268257606' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/6210059072268257606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/6210059072268257606'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2009/06/how-to-create-custom-pages-with.html' title='How to Create Custom Pages with InstallBuilder'/><author><name>Erica Brescia</name><uri>http://www.blogger.com/profile/02065317823546496697</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02357292580845573015'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Db9iUBipxmo/Si2V1Px4m_I/AAAAAAAAABw/SNaXpIXrp50/s72-c/article-01.bmp' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-1731953628977300184</id><published>2009-05-12T21:50:00.000-07:00</published><updated>2009-05-13T04:15:41.036-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bitrock'/><category scheme='http://www.blogger.com/atom/ns#' term='bitnami'/><category scheme='http://www.blogger.com/atom/ns#' term='events'/><title type='text'>BitRock Presenting at WhyFLOSS Madrid</title><content type='html'>In addition to &lt;a href="http://bitrock.blogspot.com/2009/05/get-100-off-your-javaone-pass.html"&gt;JavaOne&lt;/a&gt;, BitRock founder and CTO Daniel Lopez Ridruejo will be giving a talk on &lt;a href="http://www.bitnami.org/"&gt;BitNami&lt;/a&gt; at &lt;a href="http://www.whyfloss.com/es/conference/madrid09/"&gt;WhyFLOSS Madrid&lt;/a&gt;, a Spanish conference on open source software. If you're not familiar with it, the BitNami project provides popular web applications such as &lt;a href="http://bitnami.org/stack/dokuwiki"&gt;DokuWiki&lt;/a&gt;, &lt;a href="http://bitnami.org/stack/drupal"&gt;Drupal&lt;/a&gt;, &lt;a href="http://bitnami.org/stack/joomla"&gt;Joomla!&lt;/a&gt; and &lt;a href="http://bitnami.org/stack/wordpress"&gt;Wordpress&lt;/a&gt; in self-contained, easy to install packages. With BitNami, even non-technical users can get BitNami application stacks up and running on Windows, Linux, OS X or Solaris in just a few clicks. BitNami also includes several development stacks for &lt;a href="http://bitnami.org/stack/rubystack"&gt;Rails&lt;/a&gt;, &lt;a href="http://bitnami.org/stack/wampstack"&gt;WAMP&lt;/a&gt;, &lt;a href="http://bitnami.org/stack/jrubystack"&gt;JRuby&lt;/a&gt; and more.&lt;br /&gt;&lt;br /&gt;The WhyFLOSS event is being held in Madrid on May 21st and registration is free, although all of the talks will be in Spanish.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-1731953628977300184?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/1731953628977300184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=1731953628977300184' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/1731953628977300184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/1731953628977300184'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2009/05/bitrock-presenting-at-whyfloss-madrid.html' title='BitRock Presenting at WhyFLOSS Madrid'/><author><name>Erica Brescia</name><uri>http://www.blogger.com/profile/02065317823546496697</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02357292580845573015'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-8953491257679062687</id><published>2009-05-11T07:17:00.000-07:00</published><updated>2009-05-11T07:56:42.828-07:00</updated><title type='text'>BitRock Selected Finalist of Spanish 2009 Internet Award</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.diadeinternet.org/2009/ddi/graficos/logo_5a_estatic_p.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 150px; height: 160px;" src="http://www.diadeinternet.org/2009/ddi/graficos/logo_5a_estatic_p.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;BitRock has been elected as a finalist of the 2009 Internet Awards in the category of best company. This nomination recognizes our work on BitNami and how it enables users of different backgrounds to quickly have up and running blogs, wikis and other web based programs. You can find more information at &lt;a href="http://www.premiosdeinternet.org/index.php?body=ppal"&gt;Dia de Internet website&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-8953491257679062687?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/8953491257679062687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=8953491257679062687' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/8953491257679062687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/8953491257679062687'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2009/05/bitrock-selected-finalist-of-spanish.html' title='BitRock Selected Finalist of Spanish 2009 Internet Award'/><author><name>BitRock Team</name><uri>http://www.blogger.com/profile/14660332720215938837</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='16193056018172352147'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-315508520962829459.post-3080309619642234517</id><published>2009-05-06T22:07:00.000-07:00</published><updated>2009-05-07T07:58:58.612-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cross platform installer'/><category scheme='http://www.blogger.com/atom/ns#' term='javaone'/><category scheme='http://www.blogger.com/atom/ns#' term='bitrock'/><title type='text'>Get $100 Off Your JavaOne Pass</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Db9iUBipxmo/SgJu0QUTxBI/AAAAAAAAABg/IhmkKcjpLs4/s1600-h/javaone2009.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 170px; height: 170px;" src="http://1.bp.blogspot.com/_Db9iUBipxmo/SgJu0QUTxBI/AAAAAAAAABg/IhmkKcjpLs4/s320/javaone2009.png" alt="" id="BLOGGER_PHOTO_ID_5332946752772490258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;BitRock will be exhibiting and demoing InstallBuilder, our &lt;a href="http://installbuilder.bitrock.com/"&gt;cross platform installer&lt;/a&gt; development tool, at &lt;a href="http://java.sun.com/javaone"&gt;JavaOne&lt;/a&gt;, and you’re invited! If you’re not familiar with JavaOne, it is one of the leading events for Java developers.&lt;span style=""&gt;  &lt;/span&gt;Held June 2-5 at the &lt;st1:placename st="on"&gt;Moscone&lt;/st1:placename&gt; &lt;st1:placetype st="on"&gt;Center&lt;/st1:placetype&gt; in &lt;st1:city st="on"&gt;&lt;st1:place st="on"&gt;San   Francisco&lt;/st1:place&gt;&lt;/st1:city&gt;, it offers attendees an opportunity to hear from industry leaders and other technology experts – those programming directly in Java(TM) technology and those looking at it from new perspectives including scripting, RIA, open source and more. A wide range of sessions give developers a chance to get hands-on &lt;span style="font-family: trebuchet ms;font-size:100%;" &gt;&lt;span style="font-family: georgia;font-size:100%;" &gt;experience with Java and related technologies.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;  &lt;p style="font-family: trebuchet ms;" class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-family: georgia;" class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;To sign up and get $100 off of your full conference pass, visit: &lt;a href="http://www.cplan.com/javaone2009/externalregistration/reg.html" target="_blank"&gt;cplan.com/javaone2009/externalregistration/reg.html&lt;/a&gt; and enter the code EXHBCEK5.&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: georgia;" class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-family: georgia;" class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-family: georgia;" class="MsoNormal"&gt;&lt;span style="font-size:100%;"&gt;If you do attend the conference, be sure to drop by the BitRock kiosk to enter our drawing for a very cool prize!&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/315508520962829459-3080309619642234517?l=blog.bitrock.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.bitrock.com/feeds/3080309619642234517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=315508520962829459&amp;postID=3080309619642234517' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/3080309619642234517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/315508520962829459/posts/default/3080309619642234517'/><link rel='alternate' type='text/html' href='http://blog.bitrock.com/2009/05/get-100-off-your-javaone-pass.html' title='Get $100 Off Your JavaOne Pass'/><author><name>Erica Brescia</name><uri>http://www.blogger.com/profile/02065317823546496697</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02357292580845573015'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Db9iUBipxmo/SgJu0QUTxBI/AAAAAAAAABg/IhmkKcjpLs4/s72-c/javaone2009.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>