<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.ej-technologies.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CEYESXczfip7ImA9WhVUEE4.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495</id><updated>2012-05-14T23:48:28.986+02:00</updated><category term="install4j" /><category term="jprofiler" /><category term="memory leak" /><category term="tutorial" /><category term="screencast" /><title>ej-technologies new &amp; noteworthy</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.ej-technologies.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>ejt</name><uri>http://www.blogger.com/profile/08102511245226513902</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.ej-technologies.com/ejtblog" /><feedburner:info uri="ejtblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>ejtblog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;AkMCSH45eip7ImA9WhRaEkQ.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-1416470798502617928</id><published>2012-02-15T10:34:00.000+01:00</published><updated>2012-02-15T10:34:29.022+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-15T10:34:29.022+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><title>Attaching to Windows services for Java profiling</title><content type="html">Several profilers can attach to running JVMs, but only JProfiler can attach to Windows services. It is very easy to do:&lt;br /&gt;
&lt;br /&gt;
1.Start "Quick attach":&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://dl.dropbox.com/u/57688411/blog/pictures/quick_attach.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://dl.dropbox.com/u/57688411/blog/pictures/quick_attach.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
2. All JVMs are shown that run with your user account. Select the "Show services" button at the top:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://dl.dropbox.com/u/57688411/blog/pictures/attach_no_services.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://dl.dropbox.com/u/57688411/blog/pictures/attach_no_services.png" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&amp;nbsp;3. Select your service:&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://dl.dropbox.com/u/57688411/blog/pictures/attach_services.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://dl.dropbox.com/u/57688411/blog/pictures/attach_services.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
4. Profile!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-1416470798502617928?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/cyBkDiia4Bg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/1416470798502617928/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2012/02/attaching-to-windows-services-for-java.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/1416470798502617928?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/1416470798502617928?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/cyBkDiia4Bg/attaching-to-windows-services-for-java.html" title="Attaching to Windows services for Java profiling" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2012/02/attaching-to-windows-services-for-java.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEMQXw5eSp7ImA9WhRUFkg.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-1143807848226608032</id><published>2012-01-27T09:30:00.000+01:00</published><updated>2012-01-27T08:51:20.221+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-27T08:51:20.221+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><category scheme="http://www.blogger.com/atom/ns#" term="screencast" /><title>Using the probe tracker</title><content type="html">This screen cast shows how the probe tracker can be used to record fine-grained chronological information for selected hot spots and control objects, such as JDBC connections. The probe tracker is available for all probes in JProfiler.

&lt;br /&gt;
&lt;br /&gt;
&lt;div id="probe_tracker"&gt;
Please enable Javascript to view the screen cast&lt;/div&gt;
&lt;script src="http://dl.dropbox.com/u/57688411/blog/screencasts/swfobject.js" type="text/javascript"&gt;
&lt;/script&gt;&lt;script type="text/javascript"&gt;
var s1 = new SWFObject('http://dl.dropbox.com/u/57688411/blog/screencasts/player.swf','player','600','486','9');s1.addParam('allowfullscreen','true');s1.addParam('allowscriptaccess','always');s1.addVariable('file','http://dl.dropbox.com/u/57688411/blog/screencasts/probe_tracker.mp4');s1.addVariable('image','http://dl.dropbox.com/u/57688411/blog/screencasts/probe_tracker.png');s1.write('probe_tracker');
&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-1143807848226608032?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/ePfN0DemGY4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/1143807848226608032/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2012/01/using-probe-tracker.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/1143807848226608032?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/1143807848226608032?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/ePfN0DemGY4/using-probe-tracker.html" title="Using the probe tracker" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2012/01/using-probe-tracker.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYGRn8-cSp7ImA9WhRUFUQ.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-6116061805762973558</id><published>2012-01-26T14:43:00.000+01:00</published><updated>2012-01-26T17:08:47.159+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-26T17:08:47.159+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><category scheme="http://www.blogger.com/atom/ns#" term="screencast" /><title>Profiling JPA/Hibernate</title><content type="html">The screen cast below shows the capabilities of the JPA/Hibernate probe in JProfiler. It presents the events view of the probe that shows a chronological progression of persistence operations as well as the hot spots view that shows back traces and associated JDBC statements.

&lt;br /&gt;
&lt;br /&gt;
&lt;div id="hibernate"&gt;
Please enable Javascript to view the screen cast&lt;/div&gt;
&lt;script src="http://dl.dropbox.com/u/57688411/blog/screencasts/swfobject.js" type="text/javascript"&gt;
&lt;/script&gt;&lt;script type="text/javascript"&gt;
var s1 = new SWFObject('http://dl.dropbox.com/u/57688411/blog/screencasts/player.swf','player','600','486','9');s1.addParam('allowfullscreen','true');s1.addParam('allowscriptaccess','always');s1.addVariable('file','http://dl.dropbox.com/u/57688411/blog/screencasts/hibernate.mp4');s1.addVariable('image','http://dl.dropbox.com/u/57688411/blog/screencasts/hibernate.png');s1.write('hibernate');
&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-6116061805762973558?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/Fh82Yg0lBLg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/6116061805762973558/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2012/01/profiling-jpahibernate.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/6116061805762973558?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/6116061805762973558?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/Fh82Yg0lBLg/profiling-jpahibernate.html" title="Profiling JPA/Hibernate" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2012/01/profiling-jpahibernate.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYDSHs7fCp7ImA9WhRVF0Q.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-5420731051268756806</id><published>2012-01-16T11:45:00.000+01:00</published><updated>2012-01-17T10:22:59.504+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-17T10:22:59.504+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="install4j" /><title>Default locale changes in Java 7</title><content type="html">In the last Windows versions of &lt;a href="http://www.install4j.com/"&gt;install4j&lt;/a&gt;, we recently introduced some changes to improve how installers choose the default language and to mirror the new locale features in Java 7.&lt;br /&gt;
&lt;h4&gt;























New language settings in Java 7&lt;/h4&gt;
Until Java 7, a Java application retrieved the default locale from the &lt;i&gt;Formats&lt;/i&gt; tab in the &lt;i&gt;Region and Language&lt;/i&gt; Windows control panel, as shown below.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;img src="http://blogresources.ej-technologies.com/LanguageSettings/WindowsFormatsSettings.png" /&gt;
&lt;/div&gt;
&lt;br /&gt;
Even if this dialog box and other Windows dialogs are in English, a Java application running under Java 6 and previous versions will choose here &lt;i&gt;German&lt;/i&gt; and &lt;i&gt;Germany&lt;/i&gt; as default language and country, and this settings will end up in the &lt;i&gt;user.language&lt;/i&gt; and &lt;i&gt;user.country&lt;/i&gt; System properties, and thus in the default &lt;code&gt;Locale&lt;/code&gt; object. This might seem surprising at first, but language settings are often used to set the default Java formats for numbers and dates, so this actually makes sense.&lt;br /&gt;
&lt;br /&gt;
Java 7 introduced new &lt;a href="http://docs.oracle.com/javase/7/docs/api/java/util/Locale.html"&gt;Locale&lt;/a&gt; concepts that are initialized from the&amp;nbsp;&lt;i&gt;Display Language&lt;/i&gt; setting&amp;nbsp;shown below.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;img src="http://blogresources.ej-technologies.com/LanguageSettings/WindowsDisplayLanguageSettings.png" /&gt;&lt;/div&gt;
&lt;br /&gt;
In Java 7, the information coming from these two different settings ends up in the following new system properties:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;user.language.format
user.language.display
user.country.format
user.country.display&lt;/pre&gt;
&lt;br /&gt;
These properties are used to initialize the default locale&lt;b&gt;s&lt;/b&gt; - plural, because there are now 3 default locales! The old one returned by &lt;code&gt;Locale.getDefault()&lt;/code&gt;, and the two new ones returned by &lt;code&gt;Locale.getDefault(&lt;b&gt;Locale.Category.DISPLAY&lt;/b&gt;)&lt;/code&gt; and &lt;code&gt;Locale.getDefault(&lt;b&gt;Locale.Category.FORMAT&lt;/b&gt;)&lt;/code&gt;. The two latter ones reflect the two Windows languages settings above and are used in different contexts. As you can guess, &lt;code&gt;Locale.getDefault(&lt;b&gt;Locale.Category.FORMAT&lt;/b&gt;)&lt;/code&gt; will be used now in default Java formats.&lt;br /&gt;
But the first time you'll run your program under Java 7, you will see that its user interface will use the language chosen in the &lt;i&gt;Display Language&lt;/i&gt; Windows setting - a change from previous Java versions. Actually, the default language in Swing look and feel still depends on the locale returned by &lt;code&gt;Locale.getDefault()&lt;/code&gt;, but this locale is derived from &lt;code&gt;Locale.getDefault(&lt;b&gt;Locale.Category.DISPLAY&lt;/b&gt;)&lt;/code&gt;.&lt;br /&gt;
To help you understand these changes, let's run the following test application:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;import java.text.DateFormat;
import java.util.*;

public class ShowLanguageAndLocale {
  public static void main(String [] args) {
    String [] messages = {
        &lt;span style="color: #38761d;"&gt;// language and country System properties &lt;/span&gt;                         
        "user.language = "          + System.getProperty("user.language"),
        "user.country = "           + System.getProperty("user.country"),
        "user.language.display = "  + System.getProperty("user.language.display"),
        "user.country.display = "   + System.getProperty("user.country.display"),
        "user.language.format = "   + System.getProperty("user.language.format"),
        "user.country.format = "    + System.getProperty("user.country.format"),
        &lt;span style="color: #38761d;"&gt;// default locales&lt;/span&gt;
        "default locale = "         + Locale.getDefault(),
        "default display locale = " + Locale.getDefault(&lt;b&gt;Locale.Category.DISPLAY&lt;/b&gt;),
        "default format locale = "  + Locale.getDefault(&lt;b&gt;Locale.Category.FORMAT&lt;/b&gt;),
        &lt;span style="color: #38761d;"&gt;// date test&lt;/span&gt;
        "Date: " + DateFormat.getDateInstance(DateFormat.FULL).format(new Date())};
    javax.swing.JOptionPane.showMessageDialog(null, messages);
  }
}&lt;/pre&gt;
&lt;br /&gt;
Under a Windows system configured in German for the &lt;i&gt;Formats&lt;/i&gt; settings and English for the &lt;i&gt;Display language&lt;/i&gt; settings, this application will show this dialog:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;img src="http://blogresources.ej-technologies.com/LanguageSettings/ShowLanguageAndLocale.png" /&gt;&lt;/div&gt;
&lt;br /&gt;
As expected, the title of the dialog box and the display language are in English, whereas the date and the format language are in German.&lt;br /&gt;
&lt;br /&gt;
If you don't want this behavior in your application with Java 7 (for backward compatibility reasons for example), you can still force the old language settings based on the format language, by setting the new &lt;code&gt;sun.locale.formatasdefault&lt;/code&gt; property to &lt;code&gt;true&lt;/code&gt;.&lt;br /&gt;
When run with the following command:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;java &lt;b&gt;-Dsun.locale.formatasdefault=true&lt;/b&gt; ShowLanguageAndLocale&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
the previous application will display the following dialog box where the default locale is initialized from the &lt;code&gt;FORMAT&lt;/code&gt; locale (note that the value of the &lt;code&gt;DISPLAY&lt;/code&gt; locale is not lost):&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;img src="http://blogresources.ej-technologies.com/LanguageSettings/ShowLanguageAndLocaleFormatAsDefault.png" /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h4&gt;











Default language choice in install4j&lt;/h4&gt;
install4j has a native part that also performs a language auto-detection that must be in sync with the default locale of the JVM. Since install4j 5.0.11, we handle this in the following manner: As many of you are still running their installers with Java 6 or a previous version, and don't want an unintentional change of behavior the day you'll support Java 7, we set the&amp;nbsp;&lt;code&gt;&lt;b&gt;sun.locale.formatasdefault&lt;/b&gt;&lt;/code&gt;&amp;nbsp;System property to &lt;code&gt;true&lt;/code&gt; by default. If you run your application with Java 6, this won't change its behavior at all; if you run it under Java 7, this means that your application select the same locale as with Java 6.&lt;br /&gt;
&lt;br /&gt;
As some of you might prefer the new choice made by Java 7, we also added the ability to pass the new&amp;nbsp;&lt;code style="white-space: nowrap;"&gt;&lt;b&gt;-Dsun.locale.formatasdefault=false&lt;/b&gt;&lt;/code&gt; parameter to installers and launchers. This parameter will make them initialize their language and country from the&amp;nbsp;&lt;i&gt;Display Language&lt;/i&gt;&amp;nbsp;setting whatever Java version they run with.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;
For more information about the Locale changes in Java 7, please read the new &lt;a href="http://docs.oracle.com/javase/tutorial/i18n/locale/scope.html"&gt;section about Locale scope in the Java tutorial&lt;/a&gt;.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-5420731051268756806?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/7TJPEwrxsGk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/5420731051268756806/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2011/12/default-locale-changes-in-java-7.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/5420731051268756806?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/5420731051268756806?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/7TJPEwrxsGk/default-locale-changes-in-java-7.html" title="Default locale changes in Java 7" /><author><name>Emmanuel</name><uri>http://www.blogger.com/profile/06678502058221236696</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2011/12/default-locale-changes-in-java-7.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ECRn05eSp7ImA9WhRVF00.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-6191769049689977088</id><published>2011-12-09T10:05:00.001+01:00</published><updated>2012-01-16T10:21:07.321+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-16T10:21:07.321+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><title>Profiling with IntelliJ IDEA 11</title><content type="html">As always, we try to provide an &lt;a href="http://www.jetbrains.com/idea/"&gt;IntelliJ IDEA&lt;/a&gt; plugin immediately when a new major version of IDEA is released.&lt;br /&gt;
&lt;br /&gt;
Most of the time, a release of IDEA does not coincide with a JProfiler release, so we release the plugin separately in the plugin manager. To install the JProfiler plugin in IDEA (both community and ultimate editions), click on "Browse repositories" in the plugin manager and look for "JProfiler".&lt;br /&gt;
&lt;br /&gt;
The plugin will be bundled in the upcoming JProfiler 7.1 release.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Update (2012-01-16)&lt;/b&gt;: By mistake, the plugin version (different from the JProfiler version) decreased from 10.3 to 10.2, so many update problems were caused by this. Now the plugin version has been increased to 11.0 and the update should work if you had 10.2 or 10.3 installed previously.&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/5618118655031293495-6191769049689977088?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/714RRLftpW8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/6191769049689977088/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2011/12/profiling-with-intellij-idea-11.html#comment-form" title="13 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/6191769049689977088?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/6191769049689977088?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/714RRLftpW8/profiling-with-intellij-idea-11.html" title="Profiling with IntelliJ IDEA 11" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>13</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2011/12/profiling-with-intellij-idea-11.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIBRX0ycCp7ImA9WhdbFUU.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-4727754986821523554</id><published>2011-10-14T11:28:00.000+02:00</published><updated>2011-10-14T11:29:14.398+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-14T11:29:14.398+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><title>Java profiling comes to Linux ARM</title><content type="html">Up to now, there was no good solution for profiling Java code on embedded systems. With the 7.0.1 release of JProfiler, we have introduced support for the Linux ARM platform. The native agent libraries in the &lt;tt&gt;bin/linux-arm&lt;/tt&gt; directory work with the official &lt;a href="http://www.oracle.com/technetwork/java/embedded/overview/getstarted/index.html"&gt;Java SE for embedded&lt;/a&gt; from Oracle.&lt;br /&gt;
&lt;br /&gt;
On the embedded device, you just add the VM parameter &lt;tt&gt;-agentpath:[path to libjprofilerti.dll]&lt;/tt&gt; to the profiled JVM. In the JProfiler GUI on your development machine, you create a session of type "Attach to profiled JVM" to start profiling.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-A0Q4vTCGdKE/Tpf_D8lWOFI/AAAAAAAAAIg/5dhxyw0VohI/s1600/remoteSession.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/-A0Q4vTCGdKE/Tpf_D8lWOFI/AAAAAAAAAIg/5dhxyw0VohI/s640/remoteSession.png" width="591" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-4727754986821523554?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/SMPkyqcQdlQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/4727754986821523554/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2011/10/java-profiling-comes-to-linux-arm.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/4727754986821523554?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/4727754986821523554?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/SMPkyqcQdlQ/java-profiling-comes-to-linux-arm.html" title="Java profiling comes to Linux ARM" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-A0Q4vTCGdKE/Tpf_D8lWOFI/AAAAAAAAAIg/5dhxyw0VohI/s72-c/remoteSession.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2011/10/java-profiling-comes-to-linux-arm.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEBQHc_fip7ImA9WhdbEEs.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-1027084185148402090</id><published>2011-10-08T10:47:00.000+02:00</published><updated>2011-10-08T10:47:31.946+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-08T10:47:31.946+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><title>Sampling vs. Instrumentation</title><content type="html">Fabian Lange from codecentric has written an &lt;a href="http://blog.codecentric.de/en/2011/10/measure-java-performance-sampling-or-instrumentation/"&gt;excellent article&lt;/a&gt; on the differences between sampling and instrumentation.&lt;br /&gt;
&lt;br /&gt;
Sampling and instrumentation are the two modes how methods are measured for CPU profiling. Both have advantages and disadvantages and it depends on the use case which is better for you.&lt;br /&gt;
&lt;br /&gt;
This decision is already prominently featured in JProfiler when you start a new session for the first time, as shown in this &lt;a href="http://blog.ej-technologies.com/2011/08/cpu-profiling-sampling-and.html"&gt;screen cast&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-1027084185148402090?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/0phf4qumTWo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/1027084185148402090/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2011/10/sampling-vs-instrumentation.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/1027084185148402090?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/1027084185148402090?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/0phf4qumTWo/sampling-vs-instrumentation.html" title="Sampling vs. Instrumentation" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2011/10/sampling-vs-instrumentation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cFQ3s6fCp7ImA9WhdWE0Q.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-4920335923357754143</id><published>2011-09-07T13:30:00.000+02:00</published><updated>2011-09-07T13:30:12.514+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-07T13:30:12.514+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><category scheme="http://www.blogger.com/atom/ns#" term="screencast" /><title>Using the "Run interceptor script" trigger action</title><content type="html">In the screen cast below I show how to use the "Run interceptor script" trigger action in a method trigger to print out some internal state of the application for debugging purposes. This is done without recompiling or restarting the application.&lt;br /&gt;
&lt;br /&gt;
&lt;p id='interceptor_script'&gt;Please enable Javascript to view the screen cast&lt;/p&gt;&lt;script type='text/javascript' src='http://blogresources.ej-technologies.com/swfobject.js'&gt;&lt;/script&gt;&lt;script type='text/javascript'&gt;var s1 = new SWFObject('http://blogresources.ej-technologies.com/player.swf','player','600','486','9');s1.addParam('allowfullscreen','true');s1.addParam('allowscriptaccess','always');s1.addVariable('file','http://blogresources.ej-technologies.com/interceptor_script.mp4');s1.addVariable('image','http://blogresources.ej-technologies.com/interceptor_script.png');s1.write('interceptor_script');&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-4920335923357754143?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/r7Bi2pUUkaY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/4920335923357754143/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2011/09/using-run-interceptor-script-trigger.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/4920335923357754143?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/4920335923357754143?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/r7Bi2pUUkaY/using-run-interceptor-script-trigger.html" title="Using the &quot;Run interceptor script&quot; trigger action" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2011/09/using-run-interceptor-script-trigger.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIDQn49fyp7ImA9WhdWE00.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-1765365961234822683</id><published>2011-09-06T12:06:00.000+02:00</published><updated>2011-09-06T12:06:13.067+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-06T12:06:13.067+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><category scheme="http://www.blogger.com/atom/ns#" term="screencast" /><title>Creating a custom probe</title><content type="html">In this screen cast I show how to create a simple custom probe that measures how often the paint method of the "Animated Bezier Curve" demo is called together with clip bounds information. The example custom probe features events, telemetries and hot spots view.&lt;br /&gt;
&lt;br /&gt;
&lt;p id='custom_probe'&gt;Please enable Javascript to view the screen cast&lt;/p&gt;&lt;script type='text/javascript' src='http://blogresources.ej-technologies.com/swfobject.js'&gt;&lt;/script&gt;&lt;script type='text/javascript'&gt;var s1 = new SWFObject('http://blogresources.ej-technologies.com/player.swf','player','600','486','9');s1.addParam('allowfullscreen','true');s1.addParam('allowscriptaccess','always');s1.addVariable('file','http://blogresources.ej-technologies.com/custom_probe.mp4');s1.addVariable('image','http://blogresources.ej-technologies.com/custom_probe.png');s1.write('custom_probe');&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-1765365961234822683?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/mL1W6Or3od8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/1765365961234822683/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2011/09/creating-custom-probe.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/1765365961234822683?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/1765365961234822683?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/mL1W6Or3od8/creating-custom-probe.html" title="Creating a custom probe" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2011/09/creating-custom-probe.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UASXo6fCp7ImA9WhdWEU4.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-3607997581060159619</id><published>2011-09-04T12:14:00.000+02:00</published><updated>2011-09-04T12:14:08.414+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-04T12:14:08.414+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><category scheme="http://www.blogger.com/atom/ns#" term="screencast" /><title>Inspections in the heap walker</title><content type="html">In this screencast, I show what inspections are available in in JProfiler's heap walker and what they are capable of. Also featured is the powerful custom grouping inspection that lets you group object sets with a code snippet that is directly entered in the JProfiler GUI.&lt;br /&gt;
&lt;br /&gt;
&lt;p id='inspections'&gt;Please enable Javascript to view the screen cast&lt;/p&gt;&lt;script type='text/javascript' src='http://blogresources.ej-technologies.com/swfobject.js'&gt;&lt;/script&gt;&lt;script type='text/javascript'&gt;var s1 = new SWFObject('http://blogresources.ej-technologies.com/player.swf','player','600','486','9');s1.addParam('allowfullscreen','true');s1.addParam('allowscriptaccess','always');s1.addVariable('file','http://blogresources.ej-technologies.com/inspections.mp4');s1.addVariable('image','http://blogresources.ej-technologies.com/inspections.png');s1.write('inspections');&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-3607997581060159619?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/Y9U5JnYOmvI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/3607997581060159619/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2011/09/inspections-in-heap-walker.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/3607997581060159619?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/3607997581060159619?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/Y9U5JnYOmvI/inspections-in-heap-walker.html" title="Inspections in the heap walker" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2011/09/inspections-in-heap-walker.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkACQX8_fyp7ImA9WhdXGUo.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-8060616217181539132</id><published>2011-09-02T17:52:00.000+02:00</published><updated>2011-09-02T17:52:40.147+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-02T17:52:40.147+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><category scheme="http://www.blogger.com/atom/ns#" term="screencast" /><title>Heap walker graph: Finding paths between selected instances</title><content type="html">In this screencast, I discuss the graph view of the heap walker (new in JProfiler 7.0) and how to search for reference paths between two selected objects. Also, I show how to resolve transitive references in the biggest objects view with the help of the graph view.&lt;br /&gt;
&lt;br /&gt;
&lt;p id='heap walker graph'&gt;Please enable Javascript to view the screen cast&lt;/p&gt;&lt;script type='text/javascript' src='http://blogresources.ej-technologies.com/swfobject.js'&gt;&lt;/script&gt;&lt;script type='text/javascript'&gt;var s1 = new SWFObject('http://blogresources.ej-technologies.com/player.swf','player','600','486','9');s1.addParam('allowfullscreen','true');s1.addParam('allowscriptaccess','always');s1.addVariable('file','http://blogresources.ej-technologies.com/heap walker graph.mp4');s1.addVariable('image','http://blogresources.ej-technologies.com/heap walker graph.png');s1.write('heap walker graph');&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-8060616217181539132?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/JTmDTMsgHkw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/8060616217181539132/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2011/09/heap-walker-graph-finding-paths-between.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/8060616217181539132?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/8060616217181539132?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/JTmDTMsgHkw/heap-walker-graph-finding-paths-between.html" title="Heap walker graph: Finding paths between selected instances" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2011/09/heap-walker-graph-finding-paths-between.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUADRXs_cCp7ImA9WhdXGEU.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-2304526763384476066</id><published>2011-09-01T16:36:00.000+02:00</published><updated>2011-09-01T16:36:14.548+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-01T16:36:14.548+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><category scheme="http://www.blogger.com/atom/ns#" term="screencast" /><title>Filtering in the reference view of the heap walker</title><content type="html">In the screencast below, I show the powerful filtering capabilities in the outgoing reference view of the heap walker that allow you to find objects based on primitive field values, outgoing references or code snippets.&lt;br /&gt;
&lt;br /&gt;
&lt;p id='heap walker filters'&gt;Please enable Javascript to view the screen cast&lt;/p&gt;&lt;script type='text/javascript' src='http://blogresources.ej-technologies.com/swfobject.js'&gt;&lt;/script&gt;&lt;script type='text/javascript'&gt;var s1 = new SWFObject('http://blogresources.ej-technologies.com/player.swf','player','600','486','9');s1.addParam('allowfullscreen','true');s1.addParam('allowscriptaccess','always');s1.addVariable('file','http://blogresources.ej-technologies.com/heap walker filters.mp4');s1.addVariable('image','http://blogresources.ej-technologies.com/heap walker filters.png');s1.write('heap walker filters');&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-2304526763384476066?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/iR6jFjZ58gA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/2304526763384476066/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2011/09/filtering-in-reference-view-of-heap.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/2304526763384476066?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/2304526763384476066?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/iR6jFjZ58gA/filtering-in-reference-view-of-heap.html" title="Filtering in the reference view of the heap walker" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2011/09/filtering-in-reference-view-of-heap.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAARXc5fyp7ImA9WhdXGE0.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-3090703718899500420</id><published>2011-08-31T17:15:00.000+02:00</published><updated>2011-08-31T17:15:44.927+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T17:15:44.927+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><category scheme="http://www.blogger.com/atom/ns#" term="screencast" /><title>Analyzing long-running AWT events with JProfiler</title><content type="html">In the screencast below, I show how &lt;a href="http://blog.ej-technologies.com/2011/02/methods-statistics-and-exceptional.html"&gt;exceptional method recording&lt;/a&gt; and &lt;a href="http://blog.ej-technologies.com/2011/08/request-tracking.html"&gt;request tracking&lt;/a&gt; are combined for analyzing long-running AWT events in JProfiler.&lt;br /&gt;
&lt;br /&gt;
&lt;p id='awt long running'&gt;Please enable Javascript to view the screen cast&lt;/p&gt;&lt;script type='text/javascript' src='http://blogresources.ej-technologies.com/swfobject.js'&gt;&lt;/script&gt;&lt;script type='text/javascript'&gt;var s1 = new SWFObject('http://blogresources.ej-technologies.com/player.swf','player','600','486','9');s1.addParam('allowfullscreen','true');s1.addParam('allowscriptaccess','always');s1.addVariable('file','http://blogresources.ej-technologies.com/awt long running.mp4');s1.addVariable('image','http://blogresources.ej-technologies.com/awt long running.png');s1.write('awt long running');&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-3090703718899500420?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/Vn3rH15d8Ag" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/3090703718899500420/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2011/08/analyzing-long-running-awt-events-with.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/3090703718899500420?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/3090703718899500420?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/Vn3rH15d8Ag/analyzing-long-running-awt-events-with.html" title="Analyzing long-running AWT events with JProfiler" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2011/08/analyzing-long-running-awt-events-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUADQns9eip7ImA9WhdXGE0.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-6878059798752749417</id><published>2011-08-31T11:37:00.001+02:00</published><updated>2011-08-31T17:16:13.562+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T17:16:13.562+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><category scheme="http://www.blogger.com/atom/ns#" term="screencast" /><title>Request tracking</title><content type="html">In this screencast, I explain what request tracking is and how to use it taking the example of executors in the java.util.concurrent package.&lt;br /&gt;
&lt;br /&gt;
&lt;p id='request tracking'&gt;Please enable Javascript to view the screen cast&lt;/p&gt;&lt;script type='text/javascript' src='http://blogresources.ej-technologies.com/swfobject.js'&gt;&lt;/script&gt;&lt;script type='text/javascript'&gt;var s1 = new SWFObject('http://blogresources.ej-technologies.com/player.swf','player','600','486','9');s1.addParam('allowfullscreen','true');s1.addParam('allowscriptaccess','always');s1.addVariable('file','http://blogresources.ej-technologies.com/request tracking.mp4');s1.addVariable('image','http://blogresources.ej-technologies.com/request tracking.png');s1.write('request tracking');&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-6878059798752749417?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/VpWLnEmX0l4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/6878059798752749417/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2011/08/request-tracking.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/6878059798752749417?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/6878059798752749417?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/VpWLnEmX0l4/request-tracking.html" title="Request tracking" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2011/08/request-tracking.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUANSXs5fCp7ImA9WhdXGE0.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-6854583849961549519</id><published>2011-08-30T15:47:00.001+02:00</published><updated>2011-08-31T17:16:38.524+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T17:16:38.524+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><category scheme="http://www.blogger.com/atom/ns#" term="screencast" /><title>Probes overview</title><content type="html">In the screen cast below, I give a short overview of the capabilities of probes and the built-in probes that are included in JProfiler 7.0.&lt;br /&gt;
&lt;br /&gt;
&lt;p id='probes overview'&gt;Please enable Javascript to view the screen cast&lt;/p&gt;&lt;script type='text/javascript' src='http://blogresources.ej-technologies.com/swfobject.js'&gt;&lt;/script&gt;&lt;script type='text/javascript'&gt;var s1 = new SWFObject('http://blogresources.ej-technologies.com/player.swf','player','600','486','9');s1.addParam('allowfullscreen','true');s1.addParam('allowscriptaccess','always');s1.addVariable('file','http://blogresources.ej-technologies.com/probes overview.mp4');s1.addVariable('image','http://blogresources.ej-technologies.com/probes overview.png');s1.write('probes overview');&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-6854583849961549519?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/xSDwspxc_5U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/6854583849961549519/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2011/08/probes-overview.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/6854583849961549519?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/6854583849961549519?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/xSDwspxc_5U/probes-overview.html" title="Probes overview" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2011/08/probes-overview.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8FSX84eCp7ImA9WhdXGE0.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-8932004557091085541</id><published>2011-08-29T20:34:00.001+02:00</published><updated>2011-08-31T17:16:58.130+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-31T17:16:58.130+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><category scheme="http://www.blogger.com/atom/ns#" term="screencast" /><title>CPU profiling: Sampling and instrumentation</title><content type="html">In this screencast, I explain the two modes of CPU profiling, sampling and instrumentation and how they are activated in the JProfiler GUI. Choosing and understanding these modes is important for getting good results.&lt;br /&gt;
&lt;br /&gt;
&lt;p id='instrumentation and sampling'&gt;Please enable Javascript to view the screen cast&lt;/p&gt;&lt;script type='text/javascript' src='http://blogresources.ej-technologies.com/swfobject.js'&gt;&lt;/script&gt;&lt;script type='text/javascript'&gt;var s1 = new SWFObject('http://blogresources.ej-technologies.com/player.swf','player','600','486','9');s1.addParam('allowfullscreen','true');s1.addParam('allowscriptaccess','always');s1.addVariable('file','http://blogresources.ej-technologies.com/instrumentation and sampling.mp4');s1.addVariable('image','http://blogresources.ej-technologies.com/instrumentation and sampling.png');s1.write('instrumentation and sampling');&lt;/script&gt;&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-8932004557091085541?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/I0zHA3r7xLQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/8932004557091085541/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2011/08/cpu-profiling-sampling-and.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/8932004557091085541?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/8932004557091085541?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/I0zHA3r7xLQ/cpu-profiling-sampling-and.html" title="CPU profiling: Sampling and instrumentation" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2011/08/cpu-profiling-sampling-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYASHY7eip7ImA9Wx9UFU4.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-6661564880108897477</id><published>2011-02-12T18:35:00.000+01:00</published><updated>2011-02-12T18:35:49.802+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-12T18:35:49.802+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><category scheme="http://www.blogger.com/atom/ns#" term="screencast" /><title>Methods statistics and exceptional method runs</title><content type="html">In the screencast below, I explain how to analyze exceptionally slow invocations of frequently invoked methods. By using the method statistics and exceptional method run features in JProfiler, the slowest invocations are shown separately in the call tree.&lt;br /&gt;
&lt;br /&gt;
&lt;p id='jprofiler-method_statistics'&gt;Please enable Javascript to view the screen cast&lt;/p&gt;&lt;script type='text/javascript' src='http://blogresources.ej-technologies.com/swfobject.js'&gt;&lt;/script&gt;&lt;script type='text/javascript'&gt;var s1 = new SWFObject('http://blogresources.ej-technologies.com/player.swf','player','600','486','9');s1.addParam('allowfullscreen','true');s1.addParam('allowscriptaccess','always');s1.addVariable('file','http://blogresources.ej-technologies.com/jprofiler-method_statistics.mp4');s1.addVariable('image','http://blogresources.ej-technologies.com/jprofiler-method_statistics.png');s1.write('jprofiler-method_statistics');&lt;/script&gt;&lt;br /&gt;
The test class that is profiled in this screen cast is given below:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:java"&gt;import java.util.Random;

public class MethodStatisticsTest {

    private static Random random = new Random(0);

    public static void main(String[] args) {
        while (true) {
            doCriticalTask();
        }
    }

    private static void doCriticalTask() {
        if (random.nextInt(1000) % 999 == 0) {
            implOne();
        } else {
            implTwo();
        }
    }

    private static void implOne() {
        for (int i = 0; i &lt; 100000; i++) {
            Math.sqrt(i);
        }
    }

    private static void implTwo() {
        for (int i = 0; i &lt; 1000; i++) {
            Math.sqrt(i);
        }
    }
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-6661564880108897477?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/ttazhDaGwMc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/6661564880108897477/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2011/02/methods-statistics-and-exceptional.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/6661564880108897477?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/6661564880108897477?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/ttazhDaGwMc/methods-statistics-and-exceptional.html" title="Methods statistics and exceptional method runs" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2011/02/methods-statistics-and-exceptional.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QASHg5fCp7ImA9WhdVFk0.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-6221508389466746588</id><published>2010-12-31T18:00:00.004+01:00</published><updated>2011-09-21T13:42:29.624+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-21T13:42:29.624+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="install4j" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorial" /><title>Beyond installing</title><content type="html">In the two last articles, I showed &lt;a href="http://blog.ej-technologies.com/2010/12/my-first-try-with-install4j-tutorial.html"&gt;how to build an installer with install4j&lt;/a&gt; for &lt;a href="http://www.sweethome3d.com/"&gt;Sweet Home 3D&lt;/a&gt;, then &lt;a href="http://blog.ej-technologies.com/2010/12/more-installation-options-with.html"&gt;improve it with various options&lt;/a&gt;. But a program lives, and more and more users are used to getting program updates automatically. As install4j includes an auto-update feature, I'm going to use it to update Sweet Home 3D when a new version is released. Finally, I'll provide all the nice options that install4j offers for Mac OS X and Linux users by creating a cross platform installer.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Auto-updating&lt;/h4&gt;&lt;br /&gt;install4j offers various ways to check whether updates are available and to manage the launching of the updater. As I want to provide auto-updating without modifying the Sweet Home 3D source code at this moment, I'm going to set options in install4j that will check if a new version of the program is available when the program is launched. The auto-update feature is informed about the availability of a new version thanks to an &lt;i&gt;updates.xml&lt;/i&gt; file I'll have to host at a specified URL. Each time an installer is built, install4j creates a default &lt;i&gt;updates.xml&lt;/i&gt; file in the output directory, and when a new version will be available, I'll just have to upload that file along with the new version of the installer. For the version 3.0 of the installer, this file looks like this:&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br/&gt;&amp;lt;updateDescriptor baseUrl=""&amp;gt;&lt;br/&gt;&amp;lt;entry targetMediaFileId="80" updatableVersionMin="" updatableVersionMax=""&lt;br/&gt;&amp;nbsp;&amp;nbsp;fileName="SweetHome3D-3.0-windows.exe" newVersion="3.0" newMediaFileId="80"&lt;br/&gt;&amp;nbsp;&amp;nbsp;fileSize="27361280" bundledJre="windows-x86-1.6.0_23" archive="false"&amp;gt;&lt;br/&gt;&amp;lt;comment language="en" /&amp;gt;&lt;br/&gt;&amp;lt;comment language="zh_CN" /&amp;gt;&lt;br/&gt;&amp;lt;comment language="cs" /&amp;gt;&lt;br/&gt;&amp;lt;comment language="fr" /&amp;gt;&lt;br/&gt;&amp;lt;comment language="de" /&amp;gt;&lt;br/&gt;&amp;lt;comment language="el" /&amp;gt;&lt;br/&gt;&amp;lt;comment language="hu" /&amp;gt;&lt;br/&gt;&amp;lt;comment language="it" /&amp;gt;&lt;br/&gt;&amp;lt;comment language="ja" /&amp;gt;&lt;br/&gt;&amp;lt;comment language="pl" /&amp;gt;&lt;br/&gt;&amp;lt;comment language="pt_BR" /&amp;gt;&lt;br/&gt;&amp;lt;comment language="ru" /&amp;gt;&lt;br/&gt;&amp;lt;comment language="es" /&amp;gt;&lt;br/&gt;&amp;lt;comment language="sv" /&amp;gt;&lt;br/&gt;&amp;lt;/entry&amp;gt;&lt;br/&gt;&amp;lt;/updateDescriptor&amp;gt;&lt;/pre&gt;&lt;br /&gt;To prepare future updates, I have to decide in this version where I'll host the &lt;i&gt;updates.xml&lt;/i&gt; file. Thus, I enter the URL "&lt;code&gt;http://www.sweethome3d.com/download/updates.xml&lt;/code&gt;" in &lt;i&gt;Auto-Update Options&lt;/i&gt; tab of the &lt;i&gt;Installer&lt;/i&gt; screen.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/AutoUpdateOptions.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;Then, in the &lt;i&gt;Screens &amp;amp; Actions&lt;/i&gt; tab, I click on the &lt;i&gt;Insert&lt;/i&gt; button and select the &lt;i&gt;Add Application&lt;/i&gt; menu item.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/AddApplication.png" /&gt;&lt;/div&gt;&lt;br /&gt;In the &lt;i&gt;Select an Application Template&lt;/i&gt; dialog box, I select the &lt;i&gt;Updater with silent version check&lt;/i&gt; template.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/UpdaterWithSilentVersionCheck.png" /&gt;&lt;/div&gt;&lt;br /&gt;Once I click on OK, a new node is added to &lt;i&gt;Installer&lt;/i&gt; screen for the updater application and I name its &lt;i&gt;Executable&lt;/i&gt; as "&lt;code&gt;SweetHome3DUpdater&lt;/code&gt;" in its &lt;i&gt;Properties&lt;/i&gt; tab.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/UpdaterWithSilentVersionCheckProperties.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;To run this updater automatically when &lt;i&gt;Sweet Home 3D&lt;/i&gt; or &lt;i&gt;Furniture Library Editor&lt;/i&gt; are launched, I click on the &lt;i&gt;Launcher Integration&lt;/i&gt; tab, select the &lt;i&gt;Start automatically when launcher is executed&lt;/i&gt; option and choose to &lt;i&gt;Always&lt;/i&gt; run the updater.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/UpdaterWithSilentVersionCheckLauncherIntegration.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;Minimum auto-updating is now integrated and I just have to build a new installer to make it available for a future version of the program.&lt;br /&gt;&lt;br /&gt;To test it, I immediately install version 3.0 of the program, generate an installer with a fake 3.0.1 higher version number,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/GeneralSettingsFakeVersion.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;and upload &lt;i&gt;SweetHome3D-3.0.1-windows.exe&lt;/i&gt; and &lt;i&gt;updates.xml&lt;/i&gt; to &lt;i&gt;http://www.sweethome3d.com/download&lt;/i&gt; after adding a small comment in default language to &lt;i&gt;updates.xml&lt;/i&gt; file.&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br/&gt;&amp;lt;updateDescriptor baseUrl=""&amp;gt;&lt;br/&gt;&amp;lt;entry targetMediaFileId="80" updatableVersionMin="" updatableVersionMax=""&lt;br/&gt;&amp;nbsp;&amp;nbsp;fileName="SweetHome3D-3.0.1-windows.exe" newVersion="3.0.1" newMediaFileId="80"&lt;br/&gt;&amp;nbsp;&amp;nbsp;fileSize="27427328" bundledJre="windows-x86-1.6.0_23" archive="false"&amp;gt;&lt;br/&gt;&amp;lt;comment&amp;gt;Fixed minor bugs&amp;lt;/comment/&amp;gt;&lt;br/&gt;&amp;lt;/entry&amp;gt;&lt;br/&gt;&amp;lt;/updateDescriptor&amp;gt;&lt;/pre&gt;&lt;br /&gt;Then, a few seconds after I launch Sweet Home 3D version 3.0, the updater is launched and offers to download Sweet Home 3D version 3.0.1.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/UpdaterStep1.png" /&gt;&lt;/div&gt;&lt;br /&gt;If I click on the &lt;i&gt;Show comments&lt;/i&gt; link, I get the comments entered in the &lt;i&gt;updates.xml&lt;/i&gt; file.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/UpdaterComment.png" /&gt;&lt;/div&gt;&lt;br /&gt;Otherwise the download of the new version is started.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/UpdaterStep2.png" /&gt;&lt;/div&gt;&lt;br /&gt;Once downloaded, I choose to execute the downloaded installer.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/UpdaterStep3.png" /&gt;&lt;/div&gt;&lt;br /&gt;Because the installer detects that a previous version is installed on my computer, it asks me whether to update or to install it in another location before performing the installation.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/UpdaterStep4.png" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Managing cross platform installers&lt;/h4&gt;&lt;br /&gt;Since install4j is a Java program itself, it's easy to prepare installers for each operating system where JVMs are available. If an application shares the same list of files (which is generally the case), I would just have to create a different media for each targeted operating system with its dedicated JRE. It's a little more complicated for Sweet Home 3D since it requires different Java 3D DLLs for different platforms. Therefore, I download Java 3D zip binaries for &lt;a href="http://download.java.net/media/java3d/builds/release/1.5.2/j3d-1_5_2-macosx.zip"&gt;Mac OS X&lt;/a&gt;, &lt;a href="http://download.java.net/media/java3d/builds/release/1.5.2/j3d-1_5_2-linux-i586.zip"&gt;Linux 32 bits&lt;/a&gt; and &lt;a href="http://download.java.net/media/java3d/builds/release/1.5.2/j3d-1_5_2-linux-amd64.zip"&gt;Linux 64 bits&lt;/a&gt; at &lt;a href="https://java3d.dev.java.net/binary-builds.html"&gt;Java 3D release builds page&lt;/a&gt;. Each of these zipped files contains a &lt;i&gt;j3d-jre.zip&lt;/i&gt; file, and each &lt;i&gt;j3d-jre.zip&lt;/i&gt; file contains the three &lt;i&gt;j3dcore.jar&lt;/i&gt;, &lt;i&gt;vectmath.jar&lt;/i&gt; and &lt;i&gt;j3dutils.jar&lt;/i&gt; files which are the same as the Windows ones I have already, plus some DLLs like &lt;i&gt;libj3dcore-ogl.so&lt;/i&gt; under Linux that I have to keep. Under Mac OS X, Java 3D works thanks to &lt;a href="http://kenai.com/projects/jogl/"&gt;JOGL&lt;/a&gt; library, that I &lt;a href="http://download.java.net/media/jogl/builds/archive/jsr-231-1.1.1/jogl-1.1.1-macosx-universal.zip"&gt;download&lt;/a&gt; too.&lt;br /&gt;Once I retrieve all these files, I copy the ones required by Java 3D in a &lt;i&gt;lib&lt;/i&gt; subdirectory of &lt;i&gt;Install&lt;/i&gt; directory and reorganize them to avoid any name conflict.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/Java3DDLLs.png" /&gt;&lt;/div&gt;&lt;br /&gt;These files will have to be copied in the &lt;i&gt;lib&lt;/i&gt; subdirectory of the destination directory where program will be installed. To copy only the Java 3D files required for a given operating system, I'm going to create one file set for each system in install4j. In the &lt;i&gt;Files&lt;/i&gt; screen, I click first on the &lt;i&gt;Insert&lt;/i&gt; button and choose the &lt;i&gt;New File Set&lt;/i&gt; option.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/NewFileSet.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;I enter the general name "&lt;code&gt;Windows&lt;/code&gt;",&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/WindowsFileSet.png" /&gt;&lt;/div&gt;&lt;br /&gt;and renew the &lt;i&gt;New File Set&lt;/i&gt; operation for Mac OS X, Linux 32 bits and Linux 64 bits.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/NewFileSets.png" /&gt;&lt;/div&gt;&lt;br /&gt;Then, for each of these file sets, I create a new &lt;i&gt;lib&lt;/i&gt; folder by clicking on the &lt;i&gt;Insert&lt;/i&gt; button and choosing the &lt;i&gt;New Folder&lt;/i&gt; option.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/LibSubDirectories.png" /&gt;&lt;/div&gt;&lt;br /&gt;Once the &lt;i&gt;lib&lt;/i&gt; subdirectories are ready, I select the one in &lt;i&gt;Windows&lt;/i&gt; file set, click on the &lt;i&gt;Insert&lt;/i&gt; button and choose &lt;i&gt;Add Files and Directories&lt;/i&gt; option.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/AddFilesAndDirectories.png" /&gt;&lt;/div&gt;&lt;br /&gt;In the &lt;i&gt;Add Files and Directories&lt;/i&gt; dialog box, I choose the &lt;i&gt;Single files&lt;/i&gt; option,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/SelectSingleFiles.png" /&gt;&lt;/div&gt;&lt;br /&gt;click on the &lt;i&gt;Next&lt;/i&gt; button, and select the four Java 3D DLLs for Windows in &lt;i&gt;C:\Program Files (x86)\Sweet Home 3D 3.0\lib&lt;/i&gt; directory.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/SelectWindowsFiles.png" /&gt;&lt;/div&gt;&lt;br /&gt;I confirm my choice, and repeat the same operation to add the Java 3D files that depends on Mac OS X, Linux 32 bits and Linux 64 bits.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/Java3DFileSets.png" /&gt;&lt;/div&gt;&lt;br /&gt;To get consistent file sets, I also have to remove the Java 3D DLLs from &lt;i&gt;Default file set&lt;/i&gt;: I select the &lt;i&gt;Content of C:\Program Files (x86)\Sweet Home 3D 3.0\lib into subdirectory lib&lt;/i&gt; node, click on the &lt;i&gt;Edit Entry&lt;/i&gt; button,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/EditEntry.png" /&gt;&lt;/div&gt;&lt;br /&gt;and in the &lt;i&gt;Modify Entry in the Distribution Tree&lt;/i&gt; dialog box, I change the entry type to &lt;i&gt;Single files&lt;/i&gt; and select all the files in &lt;i&gt;C:\Program Files (x86)\Sweet Home 3D 3.0\lib&lt;/i&gt; directory except the four DLLs.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/SelectSweetHome3DFiles.png" /&gt;&lt;/div&gt;&lt;br /&gt;Once I chose these JAR files, I move them to the &lt;i&gt;lib&lt;/i&gt; subdirectory of the installation directory.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/MoveFilesToLibSubdirectory.png" /&gt;&lt;/div&gt;&lt;br /&gt;Finally, I click on the &lt;i&gt;Installation Components&lt;/i&gt; tab, select the &lt;i&gt;Sweet Home 3D component&lt;/i&gt; and include &lt;i&gt;Windows&lt;/i&gt;, &lt;i&gt;Mac OS X&lt;/i&gt;, &lt;i&gt;Linux 32 bits&lt;/i&gt; and &lt;i&gt;Linux 64 bits&lt;/i&gt; file sets.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/InstallationComponentsFileSets.png" /&gt;&lt;/div&gt;&lt;br /&gt;Now that file sets are ready, I'm going to use them in the &lt;i&gt;Windows&lt;/i&gt; existing media file and in the new media files for Mac OS X and Linux. I go to the &lt;i&gt;Media&lt;/i&gt; screen,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/MediaScreen.png" /&gt;&lt;/div&gt;&lt;br /&gt;and double-click on the &lt;i&gt;Windows&lt;/i&gt; media file to exclude the file sets that are not needed for Windows.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/ExcludedFilesInWindowsMedia.png" /&gt;&lt;/div&gt;&lt;br /&gt;Then, I click on &lt;i&gt;New media file&lt;/i&gt; icon to create Linux 32 bits media file. In the &lt;i&gt;Installer type&lt;/i&gt; combo box, I choose &lt;i&gt;Unix/Linux GUI installer&lt;/i&gt;,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/LinuxMediaFileType.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;and click on the &lt;i&gt;Next&lt;/i&gt; button until the &lt;i&gt;Data files&lt;/i&gt; step where I enter the same download URL &lt;i&gt;http://ovh.dl.sourceforge.net/project/sweethome3d/FurnitureLibraryEditor/&lt;/i&gt; for the &lt;i&gt;Furniture Library Editor&lt;/i&gt; as I did for &lt;i&gt;Windows&lt;/i&gt; media.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/LinuxMediaFileDataFiles.png" /&gt;&lt;/div&gt;&lt;br /&gt;In the &lt;i&gt;Bundled JRE&lt;/i&gt; step, I click on the &lt;i&gt;Download JREs&lt;/i&gt; button,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/LinuxMediaFileBundledJRE2.png" /&gt;&lt;/div&gt;&lt;br /&gt;to download &lt;i&gt;Linux (x86) 1.6.0_23 JRE&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/SelectJREForDownload.png" /&gt;&lt;/div&gt;&lt;br /&gt;Once downloaded, I choose this JRE,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/LinuxMediaFileBundledJRE2.png" /&gt;&lt;/div&gt;&lt;br /&gt;customize the installer by setting the media file name to "&lt;code&gt;${compiler:sys.shortName}-${compiler:sys.version}-linux-32bits&lt;/code&gt;"&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/LinuxMediaFileName.png" /&gt;&lt;/div&gt;&lt;br /&gt;and by excluding the file sets of the other operating systems.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/LinuxMediaFileExcludedFiles.png" /&gt;&lt;/div&gt;&lt;br /&gt;Once the &lt;i&gt;Media&lt;/i&gt; wizard is finished for Linux 32 bits, I create similarly the media file for Linux 64 bits, and rename them as &lt;i&gt;Linux 32 bits&lt;/i&gt; and &lt;i&gt;Linux 64 bits&lt;/i&gt; with the &lt;i&gt;Rename Media File&lt;/i&gt; menu item available in their contextual menu, to be able to distinguish more easily. &lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/RenameMediaFile.png" /&gt;&lt;/div&gt;&lt;br /&gt;Mac OS X installer is very similar to the other installers except it doesn't need to download a JRE and it requires an additional VM option to run: as Mac OS X provides its own JRE with the Java 3D 1.3.1 library in extension directory, I have to change the &lt;i&gt;java.ext.dirs&lt;/i&gt; system property to ensure the Java 3D 1.5.2 library installed with Sweet Home 3D will have a higher priority. To set this VM option that should replace the &lt;i&gt;-Djava.library.path=lib&lt;/i&gt; existing one, I create the &lt;i&gt;java3dDllsVMOption&lt;/i&gt; compiler variable by clicking on the &lt;i&gt;Insert&lt;/i&gt; button in the &lt;i&gt;Compiler Variables&lt;/i&gt; tab of the &lt;i&gt;General Settings&lt;/i&gt; screen and enter "&lt;code&gt;-Djava.library.path=lib&lt;/code&gt;" as its default value.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/NewCompilerVariable.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;Then in the Java invocation step of &lt;i&gt;SweetHome3D&lt;/i&gt; launcher, I update the text of the VM Parameters field with &lt;i&gt;${compiler:java3dDllsVMOption}&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/SweetHome3DLauncherJavaInvocation.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;Finally, I click on &lt;i&gt;New media file&lt;/i&gt; icon, choose &lt;i&gt;Mac OS X folder Installer&lt;/i&gt; type,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/MacOSXMediaFileType.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;update the download URL, exclude the file sets of the other operating systems and in &lt;i&gt;Compiler variables&lt;/i&gt; step, override &lt;i&gt;java3dDllsVMOption&lt;/i&gt; variable with the value&lt;br /&gt;&lt;code&gt;-Djava.ext.dirs=lib:/Library/Java/Extensions:/System/Library/Java/Extensions:&lt;br /&gt;/System/Library/Frameworks/JavaVM.framework/Versions/1.5/Home/lib/ext&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/MacOSXMediaFileCompilerVariables.png" /&gt;&lt;/div&gt;&lt;br /&gt;I can now build the 4 installers and test them on each operating system.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/WindowsInstaller.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/MacOSXInstaller.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/Linux32bitsInstaller.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/BeyondInstalling/Linux64bitsInstaller.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Conclusion&lt;/h4&gt;&lt;br /&gt;install4j offers many options to help with auto-updating installed software and to deliver Java cross platform installers and uninstallers. install4j can create installers for all supported platforms on any supported platform, so on a Linux build server you can create installers for Windows and Mac OS X as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-6221508389466746588?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/YvWBBPPZ2J4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/6221508389466746588/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2010/12/beyond-installing.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/6221508389466746588?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/6221508389466746588?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/YvWBBPPZ2J4/beyond-installing.html" title="Beyond installing" /><author><name>Emmanuel</name><uri>http://www.blogger.com/profile/06678502058221236696</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2010/12/beyond-installing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUGQXYzfyp7ImA9Wx9QEEw.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-6571047901551968788</id><published>2010-12-21T18:15:00.002+01:00</published><updated>2010-12-22T12:10:20.887+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-22T12:10:20.887+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="install4j" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorial" /><title>More installation options with install4j</title><content type="html">&lt;div style="margin-bottom: 0px;"&gt;Last week, I explained &lt;a href="http://blog.ej-technologies.com/2010/12/my-first-try-with-install4j-tutorial.html"&gt;how to build an installer with install4j&lt;/a&gt; for Sweet Home 3D, that would behave as the one distributed on the web site of the program.&lt;br /&gt;&lt;br /&gt;But &lt;a href="http://www.sweethome3d.com/"&gt;Sweet Home 3D&lt;/a&gt; and &lt;a href="http://www.ej-technologies.com/products/install4j/overview.html"&gt;install4j&lt;/a&gt; provide some options that could be nice to offer to end users at installation time like:&lt;/div&gt;&lt;br /&gt;&lt;ul style="margin-top: 0px;"&gt;&lt;li&gt;keeping the language chosen at installation as the default language of the program,&lt;/li&gt;&lt;li&gt;configuring the max memory amount used by the program from the RAM available in the computer,&lt;/li&gt;&lt;li&gt;offering to download and install an optional program like the Furniture Library Editor, &lt;/li&gt;&lt;li&gt;downloading some optional files like archives containing 3D models, &lt;/li&gt;&lt;li&gt;offering special options when the program is installed on a USB key,&lt;/li&gt;&lt;li&gt;offering to delete program and configuration files during uninstallation,&lt;/li&gt;&lt;li&gt;translating the text of the special options added to the installer,&lt;/li&gt;&lt;li&gt;installing the program in unattended mode to speed up its deployment in &lt;br /&gt;schools.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;Storing the chosen language&lt;/h4&gt;&lt;br /&gt;In Sweet Home 3D, the user may change the language used in the graphic interface with the preferences panel displayed when he selects the &lt;i&gt;File &amp;gt; Preferences&lt;/i&gt; menu item. The persistence of his choice is managed with Java &lt;a href="http://download.oracle.com/javase/6/docs/api/java/util/prefs/Preferences.html"&gt;Preferences&lt;/a&gt; class which stores its values in the registry under Windows. install4j offers an action able to set the value of a Java preference and I'm going to use it to store the language used in the installer.&lt;br /&gt;&lt;br /&gt;As I want this action to occur after files were installed, I select &lt;i&gt;Installation&lt;/i&gt; node in install4j and choose &lt;i&gt;Add Action&lt;/i&gt; in its contextual menu.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SelectInstallationScreen.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;I type the the first letters of "&lt;code&gt;preferences&lt;/code&gt;" in the &lt;i&gt;Filter&lt;/i&gt; text field and select the &lt;i&gt;Set a key in the Java preference store&lt;/i&gt; action among the 5 actions dealing with preferences. &lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/JavaPreferenceStoreAction.png" /&gt;&lt;/div&gt;&lt;br /&gt;Once I click on OK, I fill the Java preference properties of the action from the &lt;a href="http://sweethome3d.cvs.sourceforge.net/viewvc/sweethome3d/SweetHome3D/src/com/eteks/sweethome3d/io/FileUserPreferences.java?revision=1.52&amp;amp;view=markup#l177"&gt;matching  value&lt;/a&gt; read in Sweet Home 3D. I set &lt;i&gt;Package name&lt;/i&gt; value to "&lt;code&gt;com.eteks.sweethome3d.io&lt;/code&gt;" and &lt;i&gt;Key&lt;/i&gt; value to "&lt;code&gt;language&lt;/code&gt;". &lt;br /&gt;The value of the &lt;i&gt;Value&lt;/i&gt; text field must be set according to the language currently used in the installer, something stored in one of the install4j variables. To find it out, I click on the button arrow at the right of the text field and select the &lt;i&gt;Insert Installer Runtime Variable&lt;/i&gt; option.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InsertInstallerRuntimeVariable.png" /&gt;&lt;/div&gt;&lt;br /&gt;In the &lt;i&gt;Select Installer Runtime Variable&lt;/i&gt; dialog box, I filter variables with the first letters of "&lt;code&gt;language&lt;/code&gt;" and choose &lt;i&gt;sys.languageId &lt;/i&gt;variable.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SelectInstallerRuntimeVariable.png" /&gt;&lt;/div&gt;&lt;br /&gt;Finally, I choose &lt;i&gt;User specific&lt;/i&gt; for &lt;i&gt;Preference root&lt;/i&gt; field.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SelectPreferenceRoot.png" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Configuring the max memory of the program&lt;/h4&gt;&lt;br /&gt;Sweet Home 3D may require a lot of memory in some circumstances, and the default amount of maximum memory used by a Java Virtual Machine is generally not enough to let the program work correctly for big layouts. At the opposite, if too much memory is required, the program may slow down too much because the operating system will have to manage the missing RAM with disk swapping. A nice option could be to fix the maximum memory used by the JVM by program according to the available physical memory. This amount of memory is passed to the JVM with the option &lt;code&gt;-Xm&lt;i&gt;aaaa&lt;/i&gt;m&lt;/code&gt; where &lt;i&gt;&lt;code&gt;aaaa&lt;/code&gt;&lt;/i&gt; matches the maximum memory in MB.&lt;br /&gt;&lt;br /&gt;I already set &lt;code&gt;-Xmx&lt;/code&gt; to &lt;code&gt;512m&lt;/code&gt; during the configuration of a launcher by setting the &lt;i&gt;VM parameters&lt;/i&gt; value at the fourth step of the launcher creation wizard. &lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/LauncherConfigureJavaInvocation.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;To set this value according to the memory available on the end user computer, the easiest way is to remove the &lt;code&gt;-Xmx512m&lt;/code&gt; option from &lt;i&gt;VM parameters &lt;/i&gt;and add an action to update VM parameters when the installer is run. As this action should happen at the end of the installation, I select the &lt;i&gt;Installation &lt;/i&gt;node, click on the &lt;i&gt;Insert&lt;/i&gt; button (the button with a green plus) and select the &lt;i&gt;Add Action&lt;/i&gt; menu item.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InstallerAddActionToInstallation.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;In the &lt;i&gt;Select an Installation Action&lt;/i&gt; dialog box, I choose the &lt;i&gt;Add VM Options&lt;/i&gt; action,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/AddVMOptionsAction.png" /&gt;&lt;/div&gt;&lt;br /&gt;and once I click on OK, I edit the properties of the action to set &lt;i&gt;SweetHome3D&lt;/i&gt; as &lt;i&gt;Launcher&lt;/i&gt; value and enter the text "&lt;code&gt;${installer:xmx}&lt;/code&gt;" in &lt;i&gt;VM options&lt;/i&gt; text field.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SetVMOptions.png" /&gt;&lt;/div&gt;&lt;br /&gt;This value references the &lt;i&gt;installer:xmx&lt;/i&gt; variable that will be evaluated at installation time, when the installer will be run. As I need to create this variable and give it a value, I click again on the &lt;i&gt;Insert&lt;/i&gt; button and select &lt;i&gt;Add Action&lt;/i&gt; menu item. This time, I choose the &lt;i&gt;Set&amp;nbsp;a variable&lt;/i&gt; action in the &lt;i&gt;Select an Installation Action&lt;/i&gt; dialog box.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SetVariableAction.png" /&gt;&lt;/div&gt;&lt;br /&gt;Once I click on OK, I move the new action one row up before the &lt;i&gt;Add VM options&lt;/i&gt; action by clicking on the blue up arrow, edit the properties of the action to set the "&lt;code&gt;xmx&lt;/code&gt;" name of the new variable without its installer prefix, and click on the button with an ellipsis at the right of the &lt;i&gt;Script&lt;/i&gt; text field to edit its value.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SetVariableScript.png" /&gt;&lt;/div&gt;&lt;br /&gt;This opens a text editor where I have to enter a Java expression whose value will be saved to the &lt;i&gt;xmx&lt;/i&gt; variable. &lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/EditVariableScript.png" /&gt;&lt;/div&gt;&lt;br /&gt;The comment displayed by the editor suggests I can use the two  &lt;i&gt;context&lt;/i&gt; and &lt;i&gt;action&lt;/i&gt; parameters if required, and the classes of these two parameters are &lt;a href="http://resources.ej-technologies.com/install4j/help/api/com/install4j/api/context/InstallerContext.html"&gt;com.install4j.api.context.InstallerContext&lt;/a&gt; and &lt;a href="http://resources.ej-technologies.com/install4j/help/api/com/install4j/api/context/InstallerContext.html"&gt;com.install4j.api.actions.InstallAction&lt;/a&gt; shown as hyperlinks to their respective &lt;a href="http://resources.ej-technologies.com/install4j/help/api/index.html"&gt;javadoc&lt;/a&gt; pages.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/Javadoc.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;The great thing is that editor offers auto completion when I press &lt;i&gt;Ctrl + space&lt;/i&gt; keys! For example, if I try to complete "&lt;code&gt;co&lt;/code&gt;" I'll get "&lt;code&gt;context&lt;/code&gt;" at the top of the suggested items and other items starting by "&lt;code&gt;co&lt;/code&gt;".&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/EditVariableScriptCompletion.png" /&gt;&lt;/div&gt;&lt;br /&gt;I choose &lt;code&gt;context&lt;/code&gt;, type a dot to invoke a method of the &lt;code&gt;InstallerContext&lt;/code&gt; class, but there are so many choices that it's quite difficult to find out the method that returns the memory available in the computer where the installer runs (this value isn't available in Java SE 6 too).&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/EditVariableScriptContextCompletion.png" /&gt;&lt;/div&gt;&lt;br /&gt;Therefore I explore the help file, which seems pretty complete, since I find the information I need with a search of the "&lt;code&gt;memory&lt;/code&gt;" keyword which brings me to the method &lt;code&gt;getPhysicalMemory &lt;/code&gt;in the &lt;a href="http://resources.ej-technologies.com/install4j/help/api/com/install4j/api/SystemInfo.html"&gt;com.install4j.api.SystemInfo&lt;/a&gt; class.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/Help.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;As this method is static, I finally enter the expression&lt;br/&gt;&lt;code&gt;"-Xmx" + (SystemInfo.getPhysicalMemory() / 2 / 1024 / 1024) + "m"&lt;/code&gt;&lt;br/&gt; and as the green square drawn at the end of line confirms, the syntax of my expression is correct,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/EditVariableScriptHalfPhysicalMemory.png" /&gt;&lt;/div&gt;&lt;br /&gt;I click on OK, save my install4j project, build it and run the installer to check how it works.&lt;br /&gt;&lt;br /&gt;As setting this option won't change anything at the screen, I run &lt;i&gt;SweetHome3D.exe&lt;/i&gt; executable file in a command window with the option &lt;i&gt;/create-i4j-log&lt;/i&gt; that will create a temporary log file. To help me to find this log file, install4j displays an information dialog box recalling where it can be found.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/LogPath.png" /&gt;&lt;/div&gt;&lt;br /&gt;Reading this file I can see a &lt;code&gt;vmoption&lt;/code&gt; line with &lt;code&gt;-Xmx755m&lt;/code&gt; option stating the half of the 1.5 GB memory of my computer might be occupied by the Java program.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Downloading an optional program&lt;/h4&gt;&lt;br /&gt;A program called the &lt;a href="http://www.sweethome3d.com/support/forum/viewthread_thread,1550"&gt;Furniture Library Editor&lt;/a&gt; was recently added as a separate application. It allows the user to import and edit faster the attributes of a group of 3D models instead of importing them one by one in the program.&lt;br /&gt;&lt;br /&gt;This program is a Jar executable application and I want to suggest it as an option in the installer. As it is around 5 MB large, it won't be bundled with the installer but downloaded if the user wants to install it.&lt;br /&gt;&lt;br /&gt;To make it a downloadable file, I have to add it to the installer &lt;i&gt;Files&lt;/i&gt; and then select it as a downloadable component in the &lt;i&gt;Media&lt;/i&gt; wizard. Therefore, I download &lt;a href="http://prdownloads.sourceforge.net/sweethome3d/FurnitureLibraryEditor-1.2.jar"&gt;FurnitureLibraryEditor-1.2.jar&lt;/a&gt; in the &lt;i&gt;Installer&lt;/i&gt; directory on my desktop, and add it to the &lt;i&gt;Installation&lt;/i&gt; directory node in the &lt;i&gt;Files&lt;/i&gt; screen as a single file with the &lt;i&gt;Insert&lt;/i&gt; button (the button with a green plus).&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/FilesAddFurnitureLibraryEditorJar.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;Then I create a new launcher for the Furniture Library Editor as I did for Sweet Home 3D, by clicking on the &lt;i&gt;New launcher&lt;/i&gt; icon in &lt;i&gt;Launchers&lt;/i&gt; screen.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/NewLauncherIcon.png" /&gt;&lt;/div&gt;&lt;br /&gt;This time, I name the executable file as &lt;i&gt;FurnitureLibraryEditor&lt;/i&gt;, select the &lt;i&gt;Allow only a single running instance of the application&lt;/i&gt; option,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/LauncherConfigureExecutable.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;fill the windows version info resource,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/LauncherConfigureWindowsVersionInfo.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;configure its &lt;a href="http://sweethome3d.cvs.sourceforge.net/viewvc/sweethome3d/FurnitureLibraryEditor/src/com/eteks/furniturelibraryeditor/swing/resources/aboutIcon.png?revision=1.1"&gt;icon&lt;/a&gt; in &lt;i&gt;&lt;/i&gt;the &lt;i&gt;Icon&lt;/i&gt; step,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/LauncherIcon.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;configure program launch by adding &lt;i&gt;FurnitureLibraryEditor-1.2.jar&lt;/i&gt; archive in class path and using &lt;code&gt;com.eteks.furniturelibraryeditor.FurnitureLibraryEditorBootstrap&lt;/code&gt; as main class,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/LauncherConfigureJavaInvocation.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;and no splash screen. I finally see the new laucher item in install4j.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/FurnitureLibraryEditorLauncher.png" /&gt;&lt;/div&gt;&lt;br /&gt;To make &lt;i&gt;FurnitureLibraryEditor-1.2.jar&lt;/i&gt; and its launcher optional files, I then click on the &lt;i&gt;Installation Components&lt;/i&gt; tab to create components that group files by application. I click on the &lt;i&gt;Insert&lt;/i&gt; button, enter first the name of the basic component that will contain the Sweet Home 3D application files and click on OK.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/NewInstallationComponent.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;In the &lt;i&gt;Files&lt;/i&gt; tab, I select all the files except &lt;i&gt;FurnitureLibraryEditor-1.2.jar&lt;/i&gt; and its launcher,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InstallationComponentsSelectSweetHome3DFiles.png" /&gt;&lt;/div&gt;&lt;br /&gt;Then I create a second component for the &lt;i&gt;FurnitureLibraryEditor-1.2.jar&lt;/i&gt; file that will be downloaded.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InstallationComponentsSelectFiles.png" /&gt;&lt;/div&gt;&lt;br /&gt;In the &lt;i&gt;Options&lt;/i&gt; tab of that component, I unselect &lt;i&gt;Initially selected for installation&lt;/i&gt; option and select &lt;i&gt;Downloadable&lt;/i&gt; component&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InstallationComponentsSelectOptions.png" /&gt;&lt;/div&gt;&lt;br /&gt;As the launcher of the Furniture Library Editor won't be downloaded but will be bundled with the installer (launchers are small files of 250 KB), I create a third installation component named &lt;i&gt;Furniture Library Editor launcher&lt;/i&gt; for it, select &lt;i&gt;[Launcher] FurnitureLibraryEditor&lt;/i&gt; file and change the options to hide it to the end users, because it would be useless to ask them to check two options if they want to install the Furniture Library Editor.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InstallationComponentsSelectLauncherOptions.png" /&gt;&lt;/div&gt;&lt;br /&gt;Now that installation components are created, I go to the &lt;i&gt;Installer&lt;/i&gt; screen and select the &lt;i&gt;Installation components&lt;/i&gt; node, that will be displayed from now on since I created installation components.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InstallationComponentsScreen.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;As I need to select the Furniture Library Editor launcher component if the Furniture Library Editor component is selected by the user, I click on the ellipsis button beside &lt;i&gt;Selection change script&lt;/i&gt; field and enter the matching Java statement&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InstallationComponentsScreenScript.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;Each component, screen or action in install4j has a unique ID and I need to find the ID of the Furniture Library Editor launcher component to pass a correct value to &lt;code&gt;getInstallationComponentById&lt;/code&gt; method call. The IDs of install4j items can be displayed by clicking on the &lt;i&gt;Show IDs&lt;/i&gt; button &lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/ShowIDs.png" /&gt; found on many screens, but to avoid closing the editor window, I prefer here to click on the &lt;i&gt;Insert ID&lt;/i&gt; button to find the desired ID. This will open a dialog box where I enter the first letters of "&lt;code&gt;Furniture&lt;/code&gt;" and find the ID of the component is &lt;i&gt;376&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SelectID.png" /&gt;&lt;/div&gt;&lt;br /&gt;I click on OK to close the script window, and finally go to the &lt;i&gt;Media&lt;/i&gt; screen to update the &lt;i&gt;Windows&lt;/i&gt; media file&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/MediaScreen.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;that requires to be completed with the URL &lt;i&gt;http://ovh.dl.sourceforge.net/project/sweethome3d/FurnitureLibraryEditor/&lt;/i&gt; where &lt;i&gt;FurnitureLibraryEditor-1.2.jar&lt;/i&gt; can be downloaded from.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/MediaInstallerDownloadURL.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;I build a new installer and test it. A new step is now displayed that will let me choose what I want to install.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SweetHome3DInstallerComponentsStep.png" /&gt;&lt;/div&gt;&lt;br /&gt;I select the Furniture Library Editor option and check that the new application is available in &lt;i&gt;Sweet Home 3D&lt;/i&gt; group.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SweetHome3DShortcuts.png" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Downloading other optional files&lt;/h4&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px;"&gt;Sweet Home 3D lets the user import pieces of furniture one by one, but also by group of pieces from &lt;i&gt;.sh3f&lt;/i&gt; files (that the Furniture Library Editor can edit). At this time, four &lt;i&gt;.sh3f&lt;/i&gt; files are available to &lt;a files="" href="http://www.blogger.com/post-edit.g?blogID=5618118655031293495&amp;amp;postID=6571047901551968788" http:="" projects="" sourceforge.net="" sweethome3d-models="" sweethome3d=""&gt;download&lt;/a&gt; 400 models separately, but I'm going to offer them as optional files during installation time.&lt;br /&gt;&lt;br /&gt;The 4 files to download are these ones:&lt;/div&gt;&lt;br /&gt;&lt;ul style="margin-top: 0px;"&gt;&lt;li&gt;&lt;a href="http://ovh.dl.sourceforge.net/project/sweethome3d/SweetHome3D-models/3DModels-1.1.1/3DModels-Contributions-1.1.1.zip"&gt;Contributed models&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ovh.dl.sourceforge.net/project/sweethome3d/SweetHome3D-models/3DModels-1.1.1/3DModels-Trees-1.1.1.zip"&gt;Trees&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ovh.dl.sourceforge.net/project/sweethome3d/SweetHome3D-models/3DModels-1.1.1/3DModels-Scopia-1.1.1.zip"&gt;Scopia models&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ovh.dl.sourceforge.net/project/sweethome3d/SweetHome3D-models/3DModels-1.1.1/3DModels-KatorLegaz-1.1.1.zip"&gt;Kator and Legaz models&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Once downloaded, these files should be unzipped in a private directory of Sweet Home 3D that depends on the target system. Under Windows 7 and Vista, it should be under the directory &lt;i&gt;C:\Users\user\AppData\Roaming\eTeks\Sweet Home 3D\furniture&lt;/i&gt; and under previous versions of Windows &lt;i&gt;C:\Documents and Settings\user\Application Data\eTeks\Sweet Home 3D\furniture&lt;/i&gt;, where &lt;i&gt;user&lt;/i&gt; is the user's login name.&lt;br /&gt;&lt;br /&gt;This time, unlike during the previous part where I installed an optional program, I'll create &lt;i&gt;an Installation Components&lt;/i&gt; associated with no files, then use the &lt;i&gt;Download file&lt;/i&gt; and &lt;i&gt;Extract a ZIP file&lt;/i&gt; actions.&lt;br /&gt;&lt;br /&gt;Thus, I create four additional &lt;i&gt;Installation components&lt;/i&gt; in the proper tab of the &lt;i&gt;Files&lt;/i&gt; screen. To simplify the way to find them later, I create a custom ID for each of them with a value equal to its name.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InstallationComponentsInsertSH3FFiles.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;Then I unselect the &lt;i&gt;Initially selected for installation&lt;/i&gt; option and select the &lt;i&gt;Downloadable component&lt;/i&gt; option for the 4 new components.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InstallationComponentsSelectSH3FOptions.png" /&gt;&lt;/div&gt;&lt;br /&gt;To manage the download of the optional files, I go to the &lt;i&gt;Installer&lt;/i&gt; screen, select the &lt;i&gt;Installation&lt;/i&gt; node and insert a &lt;i&gt;Download file&lt;/i&gt; action.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InstallerAddDownloadFileAction.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;In the properties of the &lt;i&gt;Download file&lt;/i&gt; action, I set the &lt;i&gt;URL&lt;/i&gt; to "&lt;code&gt;http://ovh.dl.sourceforge.net/project/sweethome3d/SweetHome3D-models/3DModels-1.1.1/3DModels-Contributions-1.1.1.zip&lt;/code&gt;", the &lt;i&gt;Target file&lt;/i&gt; to "&lt;code&gt;${installer:sys.workingDir}/3DModels-Contributions-1.1.1.zip&lt;/code&gt;" and select the &lt;i&gt;Delete downloaded file on exit&lt;/i&gt; since it won't be needed once unzipped.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InstallerConfigureDownloadFileAction.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;Then I click on the ellipsis button  beside the &lt;i&gt;Control Flow / Condition expression&lt;/i&gt; field to enter the condition when this action should be executed &lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/EditDownloadFileCondition.png" /&gt;&lt;/div&gt;&lt;br /&gt;To unzip the downloaded file to the right directory, I insert a &lt;i&gt;Extract a ZIP file&lt;/i&gt; action after the &lt;i&gt;Download&lt;/i&gt; action.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/ExtractZIPFileAction.png" /&gt;&lt;/div&gt;&lt;br /&gt;In the properties of the &lt;i&gt;Extract a ZIP file&lt;/i&gt; action, I set the Zip file to "&lt;code&gt;${installer:sys.workingDir}/3DModels-Contributions-1.1.1.zip&lt;/code&gt;" and enter a &lt;i&gt;File filter script&lt;/i&gt; condition that will extract only files ending with &lt;i&gt;.sh3f&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/EditFileFilter.png" /&gt;&lt;/div&gt;&lt;br /&gt;I enter "&lt;code&gt;${installer:privateDir}\furniture&lt;/code&gt;" in &lt;i&gt;Destination directory&lt;/i&gt; field because the place where the application configuration data is stored varies from one operating system to the other, and set the value of the &lt;i&gt;privateDir&lt;/i&gt; variable with a new &lt;i&gt;Set a variable&lt;/i&gt; action, setting its script to the corresponding &lt;br /&gt;&lt;a href="http://sweethome3d.cvs.sourceforge.net/viewvc/sweethome3d/SweetHome3D/src/com/eteks/sweethome3d/tools/OperatingSystem.java?revision=1.17&amp;amp;view=markup#l211"&gt;method&lt;/a&gt; in Sweet Home 3D.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/EditPrivateDirScript.png" /&gt;&lt;/div&gt;&lt;br /&gt;Finally, I move the &lt;i&gt;Set a variable&lt;/i&gt; action two rows up and I create the same &lt;i&gt;Download file&lt;/i&gt; / &lt;i&gt;Extract a ZIP file&lt;/i&gt; actions for the 3 other optional downloads. Installation screen runs 20 actions now!&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InstallationActions.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;Once built, the new version of the installer displays the options to download the optional files,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SweetHome3DInstallerComponentsWithSh3fStep.png" /&gt;&lt;/div&gt;&lt;br /&gt;and if I check some of them, it will download them.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SweetHome3DInstallerDownloadStep.png" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Setting special options&lt;/h4&gt;&lt;br /&gt;From the previous parts, you understood that like many other applications, Sweet Home 3D stores its configuration data in private directories. But some users want to be able to move an application and its configuration around without bothering how to copy this data, and requested to make Sweet Home 3D portable (not across operating systems, but across different computers). This ended up by the new &lt;i&gt;com.eteks.sweethome3d.preferencesFolder&lt;/i&gt; and &lt;i&gt;com.eteks.sweethome3d.applicationFolders&lt;/i&gt; system properties that give the directories where Sweet Home 3D will store its configuration data.&lt;br /&gt;&lt;br /&gt;To spare end users the difficulty to set these properties, I'm going to add a new screen shown after the &lt;i&gt;Installation location&lt;/i&gt; screen where the user will be able to choose whether he wants to install Sweet Home 3D as a portable application or not, when he chose a removable drive as installation destination.&lt;br /&gt;&lt;br /&gt;To create this customized screen in install4j, I select the &lt;i&gt;Installation location&lt;/i&gt; node in &lt;i&gt;Installer&lt;/i&gt; screen, click on the &lt;i&gt;Insert&lt;/i&gt; button and choose &lt;i&gt;Add screen&lt;/i&gt; option.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InstallerAddScreen.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;In the &lt;i&gt;Select an Installation Screen&lt;/i&gt; dialog box, I choose the &lt;i&gt;Configurable form&lt;/i&gt; item in the list of screens&amp;nbsp; and check &lt;i&gt;Insert after selection&lt;/i&gt; at the bottom of the dialog box.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/ConfigurableFormScreen.png" /&gt;&lt;/div&gt;&lt;br /&gt;Once I click on OK, the new screen is added in the &lt;i&gt;Installer&lt;/i&gt; screen sequence.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/NewConfigurableFormScreen.png" /&gt;&lt;/div&gt;&lt;br /&gt;I click first on the &lt;i&gt;Configure Form Components&lt;/i&gt; button to add a check box to the empty form. In the dialog box that appears, I click on the &lt;i&gt;Insert&lt;/i&gt; button and choose the &lt;i&gt;Add Form Component&lt;/i&gt; option.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/AddFormComponent.png" /&gt;&lt;/div&gt;&lt;br /&gt;This will open another dialog box in which I can choose among more than 30 different components. I choose a &lt;i&gt;Check box&lt;/i&gt; component,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SelectCheckBoxComponent.png" /&gt;&lt;/div&gt;&lt;br /&gt;and click on OK. In the properties list of the inserted check box, I enter "&lt;code&gt;Install as a portable application&lt;/code&gt;" as the text check box, enter "&lt;code&gt;portable&lt;/code&gt;" as the variable name associated to this check box and select the &lt;i&gt;Initially selected&lt;/i&gt; and &lt;i&gt;Request focus&lt;/i&gt; check boxes.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/CheckBoxProperties.png" /&gt;&lt;/div&gt;&lt;br /&gt;As this new option isn't so easy to understand, I click on the ellipsis button of the &lt;i&gt;Help text&lt;/i&gt; field and enter a text that explains this option,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/EditHelpText.png" /&gt;&lt;/div&gt;&lt;br /&gt;and click on OK. Then, I click on the &lt;i&gt;Preview Form&lt;/i&gt; button at the top right of the dialog to check how the check box and its help text will be shown.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/PreviewHelpText.png" /&gt;&lt;/div&gt;&lt;br /&gt;This looks nice but the screen title and subtitle are still missing! I close the &lt;i&gt;Configure Form Components&lt;/i&gt; and click on the &lt;i&gt;Properties&lt;/i&gt; tab of the &lt;i&gt;Configurable form&lt;/i&gt; node, &lt;br /&gt;where I enter "&lt;code&gt;Removable drive option&lt;/code&gt;" in &lt;i&gt;Screen title&lt;/i&gt; text field and "&lt;code&gt;Should application installation be portable?&lt;/code&gt;" in &lt;i&gt;Screen subtitle&lt;/i&gt; text field.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/ConfigurableFormProperties.png" /&gt;&lt;/div&gt;&lt;br /&gt;As this screen should be displayed only if the user chose a removable drive, I finally click on the ellipsis button of the &lt;i&gt;Condition expression&lt;/i&gt; property to enter the condition.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/EditScreenCondition.png" /&gt;&lt;/div&gt;&lt;br /&gt;As this condition can be checked only under Windows I check first if the installer is running under Windows with a call to &lt;code&gt;Util.isWindows()&lt;/code&gt;, then I use the &lt;code&gt;getDriveType&lt;/code&gt; method of the &lt;a href="http://resources.ej-technologies.com/install4j/help/api/com/install4j/api/windows/WinFileSystem.html"&gt;WinFileSytem&lt;/a&gt; class to check if the installation directory chosen by the user is removable or not.&lt;br /&gt;&lt;br /&gt;The new screen is now configured, and I have to use the value of the &lt;i&gt;portable&lt;/i&gt; variable bound to the check box to configure Sweet Home 3D accordingly on the installation screen. As this variable won't exist if the new screen isn't displayed, I predefine it by clicking on the &lt;i&gt;Installer&lt;/i&gt; node, then on the &lt;i&gt;Configure Predefined Installer Variables&lt;/i&gt; button in the &lt;i&gt;Installer Variables&lt;/i&gt; tab.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InstallerVariables.png" /&gt;&lt;/div&gt;&lt;br /&gt;In the &lt;i&gt;Edit Installer Runtime Variables For "Installer"&lt;/i&gt; dialog box, I click on the &lt;i&gt;Insert&lt;/i&gt; button and choose the &lt;i&gt;Add New Predefined Installer Variable&lt;/i&gt; option.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/AddNewPredefinedInstallerVariable.png" /&gt;&lt;/div&gt;&lt;br /&gt;I set the name of the new variable as "&lt;code&gt;portable&lt;/code&gt;", set its type to &lt;i&gt;Boolean&lt;/i&gt; and its default value to &lt;i&gt;false&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/AddPredefinedInstallerPortableVariable.png" /&gt;&lt;/div&gt;&lt;br /&gt;I click on OK and use the &lt;i&gt;portable&lt;/i&gt; value in the &lt;i&gt;Installation&lt;/i&gt; node to add new VM options that will set the desired system preferences: I select the &lt;i&gt;Set a variable&lt;/i&gt; action that defines the &lt;i&gt;privateDir&lt;/i&gt; variable to add this new action after it, click on the &lt;i&gt;Insert&lt;/i&gt; button, select &lt;i&gt;Add Action&lt;/i&gt; option and choose the &lt;i&gt;Add VM options&lt;/i&gt; action.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/AddVMOptionsActionAfterSelection.png" /&gt;&lt;/div&gt;&lt;br /&gt;I confirm my choice, select &lt;i&gt;SweetHome3D&lt;/i&gt; launcher, enter the two lines &lt;br/&gt;"&lt;code&gt;-Dcom.eteks.sweethome3d.preferencesFolder=${installer:privateDir}&lt;/code&gt;" and &lt;br/&gt;"&lt;code&gt;-Dcom.eteks.sweethome3d.applicationFolders=${installer:privateDir}&lt;/code&gt;" in its &lt;i&gt;VM options&lt;/i&gt; text field, and set its condition expression as "&lt;code&gt;context.getBooleanVariable("portable")&lt;/code&gt;" &lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/EditVMOptions.png" /&gt;&lt;/div&gt;&lt;br /&gt;These options reference the variable &lt;i&gt;privateDir&lt;/i&gt; whose value must take into account the value of the&amp;nbsp; &lt;i&gt;portable&lt;/i&gt; variable, too. Therefore, I select the &lt;i&gt;Set a variable&lt;/i&gt; action that defines the &lt;i&gt;privateDir&lt;/i&gt; variable and click on the ellipsis beside its &lt;i&gt;Script&lt;/i&gt; field to update it.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/EditPrivateDirScript2.png" /&gt;&lt;/div&gt;&lt;br /&gt;While editing this script, I got the &lt;code&gt;context.getVariable("sys.installationDir")&lt;/code&gt; Java expression that returns the value of the &lt;i&gt;sys.installationDir&lt;/i&gt; install4j variable by clicking on the &lt;i&gt;Insert Variable&lt;/i&gt; button, chosing &lt;i&gt;Insert Installer Runtime Variable&lt;/i&gt; item and selecting the &lt;i&gt;sys.installationDir&lt;/i&gt; variable.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SelectInstallerRuntimeVariableAsJavaExpression.png" /&gt;&lt;/div&gt;&lt;br /&gt;I build this updated configuration and try the new version of the installer that displays the new screen if I choose to install it on a USB key.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SweetHome3DInstallerPortableStep.png" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Uninstalling a program and its configuration data&lt;/h4&gt;&lt;br /&gt;Sweet Home 3D stores user preferences and configuration data in private directories to help users to upgrade the installed version of the software without losing data. But sometimes some users want to really remove all information bound to the installed software. Installers built with install4j are highly configurable, and their uninstaller counterpart is as much configurable as the installer, so I'm going to add a screen that will ask the user whether he wants to delete Sweet Home 3D private files or not, and add some actions that will handle his answer.&lt;br /&gt;&lt;br /&gt;I select the &lt;i&gt;Uninstaller&lt;/i&gt; node in &lt;i&gt;Installer&lt;/i&gt; screen, click on the &lt;i&gt;Insert&lt;/i&gt; button, select the &lt;i&gt;Add Screen&lt;/i&gt; option and choose the &lt;i&gt;Additional confirmations&lt;/i&gt; screen.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/AdditionalConfirmationsScreen.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;Once I click on OK, I move the&amp;nbsp; &lt;i&gt;Additional confirmations&lt;/i&gt; screen after &lt;i&gt;Uninstall Welcome&lt;/i&gt; screen with the blue arrow button, and click on the &lt;i&gt;Configure Form Components&lt;/i&gt; buttons.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/ConfigureFormComponents.png" /&gt;&lt;/div&gt;&lt;br /&gt;In this form, I'm going to add a check box to confirm the deletion of Sweet Home 3D private data:&lt;br /&gt;&lt;br /&gt;I click on the &lt;i&gt;Insert&lt;/i&gt; button, select the &lt;i&gt;Add Form Component&lt;/i&gt; option and choose &lt;i&gt;Check box&lt;/i&gt; among the list of components.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/AddFormComponentUninstaller.png" /&gt;&lt;/div&gt;&lt;br /&gt;I enter "&lt;code&gt;Sweet Home 3D private data&lt;/code&gt;" as the displayed Text, &lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SetCheckBoxProperties.png" /&gt;&lt;/div&gt;&lt;br /&gt;and click on the ellipsis beside &lt;i&gt;Help text&lt;/i&gt; field to detail what will be deleted.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/EditPrivateDataHelpText.png" /&gt;&lt;/div&gt;&lt;br /&gt;Finally, I enter "&lt;code&gt;privateData&lt;/code&gt;" in the &lt;i&gt;Variable name&lt;/i&gt; text field associated with this check box.&lt;br /&gt;&lt;br /&gt;I close the &lt;i&gt;Configure Form Components&lt;/i&gt; dialog box and click on &lt;i&gt;Unistallation&lt;/i&gt; node to add a new action to it.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/AddUninstallerAction.png" /&gt;&lt;/div&gt;&lt;br /&gt;I filter the actions list with "&lt;code&gt;delete&lt;/code&gt;" and choose the &lt;i&gt;Delete a node or key in the Java preference store&lt;/i&gt; action.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/DeleteActions.png" /&gt;&lt;/div&gt;&lt;br /&gt;I enter the "&lt;code&gt;com.eteks.sweethome3d&lt;/code&gt;" package in the properties list, unselect the &lt;i&gt;Only if empty&lt;/i&gt; check box and let the &lt;i&gt;Key&lt;/i&gt; field empty to delete all the preferences associated to this package node.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SetDeleteJavaPreferencesNodeProperties.png" /&gt;&lt;/div&gt;&lt;br /&gt;I click on the ellipsis beside the &lt;i&gt;Condition expression&lt;/i&gt; field, insert the value of the &lt;i&gt;privateData&lt;/i&gt; variable to check the condition, and confirm my choice.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/EditActionCondition.png" /&gt;&lt;/div&gt;&lt;br /&gt;To delete private files, I add a &lt;i&gt;Delete files and directories&lt;/i&gt; action to &lt;i&gt;Unistallation&lt;/i&gt; node with the same &lt;i&gt;Condition expression&lt;/i&gt; and select the &lt;i&gt;Recursive&lt;/i&gt; option.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SetDeleteFilesProperties.png" /&gt;&lt;/div&gt;&lt;br /&gt;The files to delete are in the directory referenced by the &lt;i&gt;privateDir&lt;/i&gt; variable created at installation time, but I need it also at uninstallation time. Like &lt;i&gt;privateData&lt;/i&gt; variable, the value of an installer variable is available in the uninstaller if it's predefined in the installer and marked as a response file variable. A &lt;a href="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/response.varfile"&gt;response file&lt;/a&gt; is a properties file that contains key-value pairs for installer variables. This file is created during installation process and is reused during uninstallation.&lt;br /&gt;&lt;br /&gt;All the variables bound to a form component like the &lt;i&gt;portable&lt;/i&gt; variable bound to the &lt;i&gt;Install as a portable application&lt;/i&gt; check box, are automatically saved in a response file. But the &lt;i&gt;privateDir&lt;/i&gt; variable isn't bound to any component, and I have to define it as a predefined variable and register it as a response file variable.&lt;br /&gt;&lt;br /&gt;Thus, I click on the &lt;i&gt;Installer&lt;/i&gt; node, select &lt;i&gt;Installer Variables&lt;/i&gt; and click on the &lt;i&gt;Configure Predefined Installer Variables&lt;/i&gt; button.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InstallerConfigurePredefinedVarialbes.png" /&gt;&lt;/div&gt;&lt;br /&gt;I click on the &lt;i&gt;Insert&lt;/i&gt; button, select the &lt;i&gt;Add Predefined Installer Variable&lt;/i&gt; option and enter the name "&lt;code&gt;privateDir&lt;/code&gt;". &lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/AddPredefinedInstallerPortableDirVariable.png" /&gt;&lt;/div&gt;&lt;br /&gt;I confirm my choice and add a new &lt;i&gt;Run script&lt;/i&gt; action to the &lt;i&gt;Startup&lt;/i&gt; node &lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/RunScriptAction.png" /&gt;&lt;/div&gt;&lt;br /&gt;that will register the &lt;i&gt;privateDir&lt;/i&gt; variable as a response file variable.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/EditRegisterResponseFileVariableScript.png" /&gt;&lt;/div&gt;&lt;br /&gt;Finally, I select again the &lt;i&gt;Delete files and directories&lt;/i&gt; action, and complete its &lt;i&gt;Files and directories&lt;/i&gt; field by clicking on the ellipsis button beside it. In the &lt;i&gt;Edit Files&lt;/i&gt; dialog box, I click on the &lt;i&gt;Insert&lt;/i&gt; and edit the file name by clicking on the arrow button to select the installer &lt;i&gt;privateDir&lt;/i&gt; variable.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SelectFilesToDelete.png" /&gt;&lt;/div&gt;&lt;br /&gt;Once done, I can build the media files to test the installer and uninstallers.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/UninstallationNode.png" /&gt;&lt;/div&gt;&lt;br /&gt;When I uninstall Sweet Home 3D, I'll get a new screen showing the additional option.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SweetHome3DUninstallerAdditionalStep.png" /&gt;&lt;/div&gt;&lt;br /&gt;If I check the option, all the configuration data is deleted as expected.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Translating new options&lt;/h4&gt;&lt;br /&gt;Some texts in the screens and the options added during the two previous steps aren't predefined in install4j, and I'll have to translate them. Handling translation in install4j works similarly to &lt;a href="http://download.oracle.com/javase/6/docs/api/java/util/PropertyResourceBundle.html"&gt;Java&lt;/a&gt; with properties text files where each translated text is associated to a key. The differences in install4j are that it's not mandatory to add a language suffix to each translated properties file and these files can be saved in UTF-8 encoding if they use &lt;i&gt;utf8&lt;/i&gt; file extension (until Java 6, Java properties file supported only ISO-8859-1 encoding which forces you to write characters that don't exist in this encoding with &lt;code&gt;\u&lt;i&gt;xxxx&lt;/i&gt;&lt;/code&gt; sequence).&lt;br /&gt;&lt;br /&gt;The properties files used by the installer are defined in the &lt;i&gt;Languages&lt;/i&gt; tab of the &lt;i&gt;General Settings&lt;/i&gt; screen of the installer project, and after clicking on the &lt;i&gt;New&lt;/i&gt; button beside &lt;i&gt;Custom localization file&lt;/i&gt; field, I choose to name it "&lt;code&gt;InstallerTranslation.utf8&lt;/code&gt;".&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/GeneralSettingsLanguages.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;Once I click on the &lt;i&gt;Create&lt;/i&gt; button, a text editor is opened to let me define some properties or override existing ones in the installer. I close the editor and prefer to add the properties one by one, by editing the texts to translate where they are defined in the project. In the &lt;i&gt;Installer&lt;/i&gt; screen, I select the &lt;i&gt;Configurable form&lt;/i&gt; node and in its &lt;i&gt;Properties&lt;/i&gt; tab, copy to the clipboard the text of the &lt;i&gt;Screen title&lt;/i&gt; field, click on the arrow button beside it and select the &lt;i&gt;Insert I18N Message&lt;/i&gt; option (I18N means Internationalization, the 18 number matching the the number of letters between the first and the last letter of this long word).&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InsertI18NMessage.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;In the &lt;i&gt;Select I18N Message&lt;/i&gt; dialog box, I click on the &lt;i&gt;Edit&lt;/i&gt; link to enter a new key/value pair in the &lt;i&gt;InstallerTranslation.utf8&lt;/i&gt; file.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SelectI18NMessage.png" /&gt;&lt;/div&gt;&lt;br /&gt;I enter the text "&lt;code&gt;portableScreenTitle=Removable drive option&lt;/code&gt;" in the editor,&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/EditI18NFile.png" /&gt;&lt;/div&gt;&lt;br /&gt;click on OK, and select the new key that appears in the &lt;i&gt;Custom messages&lt;/i&gt; list.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/SelectI18NMessage2.png" /&gt;&lt;/div&gt;&lt;br /&gt;Once done, the text of the &lt;i&gt;Screen title&lt;/i&gt; field is replaced by &lt;i&gt;${i18n:portableScreenTitle}&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;I perform the same operation for the other 5 new texts that need to be translated.&lt;br /&gt;&lt;br /&gt;The two &lt;i&gt;Help&lt;/i&gt; texts are replaced by clicking in the &lt;i&gt;Insert Variable&lt;/i&gt; button shown in their editor and choosing the &lt;i&gt;Insert I18N Message&lt;/i&gt; option.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InsertI18NMessageForHelpText.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;Once done with the &lt;a href="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InstallerTranslation.utf8"&gt;InstallerTranslation.utf8&lt;/a&gt; file, i just have to translate this file in each supported language and add them on the &lt;i&gt;Languages&lt;/i&gt; tab of the &lt;i&gt;General Settings&lt;/i&gt; screen. For example, I can translate the texts to French in a file &lt;a href="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/InstallerTranslationFrench.utf8"&gt;InstallerTranslationFrench.utf8&lt;/a&gt; and add it to project. &lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/FrenchTranslation.png" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Installing a program in console or unattended mode&lt;/h4&gt;&lt;br /&gt;Installing a program with a graphic user interface is nice for most users, but many environments offer only a command line interface. install4j offers such a mode without any additional change to the installer: &lt;br /&gt;instead of answering questions with buttons, text fields and check boxes, the end user just uses the keyboard to answer. The console mode is used when the argument &lt;code&gt;-c&lt;/code&gt; is passed to the installer program. Under Windows XP / Vista / 7, Sweet Home 3D installer can be run with the following command:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;start /wait SweetHome3D-3.0-windows.exe -c&lt;/pre&gt;&lt;br /&gt;which will give the following results.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/ConsoleMode.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;install4j offers also an unattended mode, something that may be very handy when you have to install a program the same way on different computers. In that mode launched with a &lt;code&gt;-q&lt;/code&gt; argument passed to the installer program, the installation runs by itself until the end without asking any questions. The directory where the program should be installed can be specified with the &lt;code&gt;-dir&lt;/code&gt; argument and the answers to the installer questions that should be different from their default values can be specified in a response file by passing the &lt;code&gt;-varfile&lt;/code&gt; argument.&lt;br /&gt;&lt;br /&gt;The easiest way to generate such a response file is to run the program in another mode and retrieve the &lt;a href="http://blogresources.ej-technologies.com/MoreInstallOptionsWithInstall4j/response.varfile"&gt;response.varfile&lt;/a&gt; file created by the installer in the &lt;i&gt;.install4j&lt;/i&gt; subdirectory of the directory where program was installed. This file is a text file that contains installer variables and their values that may be edited with any text editor if needed. Under Windows XP / Vista / 7, Sweet Home 3D can be installed in unattended mode with the following command:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;start /wait SweetHome3D-3.0-windows.exe -q -varfile response.varfile&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Conclusion&lt;/h4&gt;&lt;br /&gt;install4j lets you customize your installer in many ways. You can configure it to install some optional items and perform some special operations. You can also use your Java skills to program customized conditions or any required piece of code, in an editor that supplies the great features of modern IDEs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-6571047901551968788?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/XoS-NRe24mo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/6571047901551968788/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2010/12/more-installation-options-with.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/6571047901551968788?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/6571047901551968788?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/XoS-NRe24mo/more-installation-options-with.html" title="More installation options with install4j" /><author><name>Emmanuel</name><uri>http://www.blogger.com/profile/06678502058221236696</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2010/12/more-installation-options-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8DRXg8fip7ImA9Wx9RGUk.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-5718163345076062156</id><published>2010-12-14T12:00:00.002+01:00</published><updated>2010-12-21T16:21:14.676+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-21T16:21:14.676+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="install4j" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorial" /><title>My first try with install4j</title><content type="html">A tutorial for beginners&lt;br /&gt;
&lt;br /&gt;
This tutorial shows the various features offered by &lt;a href="http://www.ej-technologies.com/products/install4j/overview.html"&gt;install4j&lt;/a&gt; 5.0 through the step by step configuration of an installer for &lt;a href="http://www.sweethome3d.com/"&gt;Sweet Home 3D&lt;/a&gt;, a free open source Java program (so you can reproduce these steps if you want to).&lt;br /&gt;
&lt;br /&gt;
In its current version 3.0, Sweet Home 3D may be &lt;a href="http://www.sweethome3d.com/download.jsp"&gt;installed&lt;/a&gt; with Java Web Start or its own installer (built with &lt;a href="http://www.jrsoftware.org/isinfo.php"&gt;Inno Setup&lt;/a&gt; and &lt;a href="http://launch4j.sourceforge.net/"&gt;launch4j&lt;/a&gt; tools under Windows). But install4j is able to build much more powerful installers and Java launchers than these free products.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Downloading and installing install4j&lt;/h4&gt;&lt;br /&gt;
install4j can be downloaded from this &lt;a href="http://www.ej-technologies.com/download/install4j/files.html"&gt;page&lt;/a&gt;. If you want to test it before buying a license you'll have to fill &lt;a href="http://www.ej-technologies.com/download/install4j/trial"&gt;this form&lt;/a&gt; to receive an evaluation key.&lt;br /&gt;
&lt;br /&gt;
install4j is available for various operating systems and is available in two versions for each operating system, depending on whether you have already installed a JRE 6 on your computer.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/Downloads.png" /&gt;&lt;/div&gt;&lt;br /&gt;
From the previous matrix, I download the &lt;i&gt;Setup Executable (21 MB)&lt;/i&gt; for &lt;i&gt;64-bit Windows&lt;/i&gt; and double-click on the installer icon once the file was downloaded.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/InstallerIcon.png" /&gt;&lt;/div&gt;&lt;br /&gt;
Installing install4j already gives an idea of its abilities because the installer was of course built with install4j itself. Once the installer launched, I'm surprised to get a screen telling that no JRE is installed on my computer:&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/NoJRE.png" /&gt;&lt;/div&gt;&lt;br /&gt;
But in fact the installer was right, I didn't have a 64-bit JRE but only a 32-bit JRE! Therefore I click on Download to get a 64-bit JRE.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/DownloadingJRE.png" /&gt;&lt;/div&gt;&lt;br /&gt;
From the license agreement, installation directory selection to license key entry and auto-update configuration, the 10 steps that following look familiar compared to other installers.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/InstallerSteps.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Launching install4j&lt;/h4&gt;&lt;br /&gt;
At first launch, Windows Firewall asks me to let install4j use the network to check its license key. I accept to ensure all features of install4j will work.&lt;br /&gt;
&lt;br /&gt;
Then the main screen of install4j appears and shows the various features offered to create an installer.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/MainScreen.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;
Now I'll try to create a first version of an installer and launcher for Sweet Home 3D.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;&amp;nbsp;&lt;/h4&gt;&lt;h4&gt;General settings&lt;/h4&gt;&lt;br /&gt;
First, I fill the &lt;i&gt;Application Info&lt;/i&gt; tab with the software's name and version.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/GeneralSettingsApplicationInfo.png" /&gt;&lt;/div&gt;&lt;br /&gt;
Then, in the &lt;i&gt;Java Version&lt;/i&gt; tab, I require a minimum Java version 1.5.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/GeneralSettingsJavaVersion.png" /&gt;&lt;/div&gt;&lt;br /&gt;
In the &lt;i&gt;Languages&lt;/i&gt; tab, I keep &lt;i&gt;English&lt;/i&gt; as the principal language and add all the languages supported by Sweet Home 3D found in the list (just missing Bulgarian and Vietnamese).&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/GeneralSettingsLanguages.png" /&gt;&lt;/div&gt;&lt;br /&gt;
In the &lt;i&gt;Media Files Options&lt;/i&gt;, I choose an &lt;i&gt;Installer&lt;/i&gt; directory on my desktop as output directory, change the name pattern to "&lt;code&gt;${compiler:sys.shortName}-${compiler:sys.version}-${compiler:sys.platform}&lt;/code&gt;" in respect to the format previously used for older versions of Sweet Home 3D, and uncheck &lt;i&gt;Convert dots to underscores&lt;/i&gt; option.&lt;br /&gt;
&lt;br /&gt;
Note that this name pattern uses some variables between &lt;code&gt;${&lt;/code&gt; and &lt;code&gt;}&lt;/code&gt; symbols. There are all kind of variables available in install4j (you can even create your own if needed) and you can select them in many text fields by clicking on the Insert variable button &lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/InsertVariableButton.png" /&gt; (the arrow button) that appears behind them.&lt;br /&gt;
The "&lt;code&gt;${compiler:sys.shortName}-${compiler:sys.version}-${compiler:sys.platform}&lt;/code&gt;" pattern will resolve to &lt;code&gt;SweetHome3D-3.0-windows&lt;/code&gt; for a Windows installer.&lt;br /&gt;
&lt;br /&gt;
As Sweet Home 3D's current distribution is around 30 MB, I prefer the smallest distribution possible and I also increase &lt;i&gt;Compression level&lt;/i&gt; to 9 and check all the compression options&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/GeneralSettingsMediaFileOptions.png" /&gt;&lt;/div&gt;&lt;br /&gt;
Once &lt;i&gt;General Settings&lt;/i&gt; are done I save my Installer project in the &lt;i&gt;Installer&lt;/i&gt; directory of my desktop.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Files&lt;/h4&gt;&lt;br /&gt;
Now I choose files that should be included in the distribution by clicking on the &lt;i&gt;Files&lt;/i&gt; icon below the &lt;i&gt;General Setting&lt;/i&gt; one. These files could be assembled by invoking the appropriate Ant target in the build.xml file of Sweet Home 3D project, but as this tutorial isn't about Ant, I prefer to use the files installed by the existing setup program available &lt;a href="http://prdownloads.sourceforge.net/sweethome3d/SweetHome3D-3.0-windows.exe"&gt;here&lt;/a&gt;. I launch this program and install the files in &lt;i&gt;C:\Program Files (x86)\Sweet Home 3D 3.0&lt;/i&gt; directory.&lt;br /&gt;
&lt;br /&gt;
Once the existing installer finished, I have to include the jar and license files in the distribution tree of install4j. These files are indicated in blue in the following list:&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/SweetHome3DFiles.png" /&gt;&lt;/div&gt;&lt;br /&gt;
Clicking on the &lt;i&gt;Insert&lt;/i&gt; button (the green plus button), I choose the &lt;i&gt;Add Files and Directories&lt;/i&gt; option,&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/FilesDefineDistributionTree.png" /&gt;&lt;/div&gt;&lt;br /&gt;
and choose the &lt;i&gt;Directory&lt;/i&gt;&amp;nbsp; entry type for the &lt;i&gt;C:\Program file (x86)\Sweet Home 3D 3.0\lib&lt;/i&gt; directory with the option &lt;i&gt;Add to subdirectory&lt;/i&gt; selected, then &lt;i&gt;Single files&lt;/i&gt; type for the licenses files.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/AddFilesAndDirectoriesSelectType.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/AddFilesAndDirectoriesSelectDirectory.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/AddFilesAndDirectoriesSelectFiles.png" /&gt;&lt;/div&gt;&lt;br /&gt;
I also have to include the &lt;i&gt;javaws.jar&lt;/i&gt; file found in the &lt;i&gt;jre6\lib&lt;/i&gt; subdirectory and required by Sweet Home 3D to run. I insert this file as as a &lt;i&gt;Single file&lt;/i&gt; type and to make it appear in the lib subdirectory among other jar files, I insert a new folder named &lt;i&gt;lib&lt;/i&gt; where I drag and drop the &lt;i&gt;javaws.jar&lt;/i&gt; line.&lt;br /&gt;
&lt;br /&gt;
All these files and directory finally appear in the list of the &lt;i&gt;Define Distribution Tree&lt;/i&gt; tab.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/FilesDefineDistributionTreeCompleted.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Launcher&lt;/h4&gt;&lt;br /&gt;
As I don't need to set any &lt;i&gt;File&lt;/i&gt; options or don't want to propose optional files at this moment, I now click on the &lt;i&gt;Launchers&lt;/i&gt; icon below the &lt;i&gt;Files&lt;/i&gt; one, and double click on the &lt;i&gt;New launcher&lt;/i&gt; icon.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/NewLauncherIcon.png" /&gt;&lt;/div&gt;&lt;br /&gt;
This will launch a wizard used to create a launcher. As I want to generate a new launcher to test install4j features, I keep the &lt;i&gt;Generate launcher&lt;/i&gt; option selected.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/LauncherSelectType.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;
Then I give application name and the directory where it should appear. The &lt;i&gt;Executable info&lt;/i&gt; second step offers also an interesting option that allows only a single running instance, that I would check if I didn't program already such a feature in Sweet Home 3D.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/LauncherConfigureExecutable.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;
In the &lt;i&gt;Advanced Options&lt;/i&gt; list, I choose &lt;i&gt;Windows version info&lt;/i&gt; and check the &lt;i&gt;Generate version info resource&lt;/i&gt; to get correct values in the file properties dialog box of the future launcher. I let install4j replace &lt;i&gt;Product name&lt;/i&gt; and &lt;i&gt;File version&lt;/i&gt; fields and enter values in &lt;i&gt;Internal name&lt;/i&gt;, &lt;i&gt;File description&lt;/i&gt; and &lt;i&gt;Legal copyright&lt;/i&gt; text fields, using some existing variables.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/LauncherConfigureExecutableVersionInfo.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;
The &lt;i&gt;Icon&lt;/i&gt; third step proposes to choose an icon for the program. I select &lt;i&gt;Add icon to launcher&lt;/i&gt; option, and configure the program &lt;a href="http://www.sweethome3d.com/support/forum/viewthread_thread,1060"&gt;icons&lt;/a&gt; at 3 different sizes and add them to the &lt;i&gt;Cross-Platform Image File&lt;/i&gt; list.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/LauncherIcon.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;
The &lt;i&gt;Java invocation&lt;/i&gt; steps shows information required to run a Java application. In VM Parameters, I increase the maximum memory to 512 MB and specify where Java 3D DLLs are available with the parameters &lt;i&gt;-Xmx512m -Djava.library.path=lib&lt;/i&gt; (DLLs directory can be set with &lt;i&gt;Advanced Options &amp;gt; Native libraries&lt;/i&gt; too). I enter program main class &lt;i&gt;com.eteks.sweethome3d.SweetHome3D&lt;/i&gt; and enter &lt;i&gt;-open&lt;/i&gt; in &lt;i&gt;Arguments&lt;/i&gt; text field because Sweet Home 3D expects this selector before any file passed as an argument.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/LauncherConfigureJavaInvocation.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;
Now I need to complete the &lt;i&gt;Class path&lt;/i&gt; list, which accepts individual jar files, directories containing jar files, directories containing &lt;i&gt;.class&lt;/i&gt; files or resources, and information from environment variables. As I keep all the jar files in the &lt;i&gt;lib&lt;/i&gt; subdirectory, I click on the &lt;i&gt;Insert&lt;/i&gt; button, select the &lt;i&gt;Scan directory&lt;/i&gt; option and enter &lt;i&gt;lib&lt;/i&gt; directory.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/LauncherClasspathEntry.png" /&gt;&lt;/div&gt;&lt;br /&gt;
The &lt;i&gt;VM options file&lt;/i&gt; step offers an interesting option to the end users who can change default VM parameters in case they need it. As Sweet Home 3D uses a few System properties and may require more memory to run, I keep the default &lt;i&gt;Copy template file with explanations for user&lt;/i&gt; selected.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/LauncherVMOptionsFile.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;
Finally, in the &lt;i&gt;Splash screen&lt;/i&gt; step, I can choose the splash screen image that should be displayed during program launch. As Sweet Home 3D handles this feature itself, I don't change default settings but note that you can use install4j splash screen or Java 6 one if needed.&lt;br /&gt;
&lt;br /&gt;
The &lt;i&gt;Advanced options&lt;/i&gt; let you even write some texts over the image. Nice!&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/LauncherSplashScreen.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;
Once the &lt;i&gt;Launcher&lt;/i&gt; wizard is finished, a new launcher icon is added to &lt;i&gt;Launchers&lt;/i&gt; screen to let you change launcher settings later.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/ApplicationLauncherIcon.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Installer&lt;/h4&gt;&lt;br /&gt;
The &lt;i&gt;Installer&lt;/i&gt; screen describes the various screens that will be displayed to the end user during program installation and uninstallation. It's a highly configurable tool with many options that you can even extend if needed. The screens in the default template will show six screens from &lt;i&gt;Welcome&lt;/i&gt; screen to &lt;i&gt;Finish&lt;/i&gt; screen.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/InstallerConfigure.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px;"&gt;In the &lt;i&gt;Screens &amp;amp; Actions&lt;/i&gt; tab, these screens are represented with an icon showing a gear in a window &lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/ScreenIcon.png" /&gt; and sometimes by custom icons like the one used for the &lt;i&gt;Installation&lt;/i&gt; screen &lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/InstallationScreenIcon.png" /&gt;. The tree shown on the left contains also some actions represented with a gear icon window &lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/ActionIcon.png" /&gt; and by custom icons like the one for the &lt;i&gt;Startup&lt;/i&gt; action &lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/StartupActionIcon.png" /&gt;. An action is simply one or more statements (either preprogrammed ones or custom ones programmed in Java) that the installer should run during the installation.&lt;/div&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px;"&gt;To ensure the installer created with install4j behaves as the existing one, I'll add two screens:&lt;/div&gt;&lt;br /&gt;
&lt;ul style="margin-top: 0px;"&gt;&lt;li&gt;one displaying the GNU GPL license of the software,&lt;/li&gt;
&lt;li&gt;one that will let the user accept file associations,&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px;"&gt;and I'll add also two types of actions:&lt;/div&gt;&lt;br /&gt;
&lt;ul style="margin-top: 0px;"&gt;&lt;li&gt;some registering file extension associations,&lt;/li&gt;
&lt;li&gt;one that will let the user launch Sweet Home 3D once the installation is finished.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
To add the new screens, I click on the &lt;i&gt;Insert&lt;/i&gt; button and choose &lt;i&gt;Add Screen&lt;/i&gt; in the popup menu.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/AddScreenMenuItem.png" /&gt;&lt;/div&gt;&lt;br /&gt;
In the displayed &lt;i&gt;Select an Installation Screen&lt;/i&gt; dialog box, I filter the shown list by entering the first letters of "&lt;code&gt;license&lt;/code&gt;". Once I select &lt;i&gt;Display license agreement&lt;/i&gt; item, I definitively know that screen has some good chances to be the one I look for from its &lt;i&gt;Description&lt;/i&gt; displayed below.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/SelectDisplayLicenseAgreementInstallationScreen.png" /&gt;&lt;/div&gt;&lt;br /&gt;
I click on OK and the new screen is automatically inserted after the &lt;i&gt;Welcome&lt;/i&gt; screen, just at the right place I wanted it to appear!&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/DisplayLicenseAgreementScreenProperties.png" /&gt;&lt;/div&gt;&lt;br /&gt;
I now enter missing values in the screen properties list displayed at the right. I edit the &lt;i&gt;License file&lt;/i&gt; property and install4j lets me choose it either as a file packaged with the installer or coming from installed files.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/ChooseFileMode.png" /&gt;&lt;/div&gt;&lt;br /&gt;
I choose the first option and select the &lt;i&gt;COPYING.TXT&lt;/i&gt; file that contains the GNU GPL license text. As the license wasn't translated to other languages, I leave the file empty for the other languages, so the default text in English will be displayed.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/ChooseLicenseFile.png" /&gt;&lt;/div&gt;&lt;br /&gt;
Then I select the &lt;i&gt;User must scroll to bottom&lt;/i&gt; option in the hope it will get more users to read the GNU GPL license.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/DisplayLicenseAgreementScreenPropertiesCompleted.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
I click again on the &lt;i&gt;Insert&lt;/i&gt; button to add a &lt;i&gt;File associations&lt;/i&gt; screen and select &lt;i&gt;File associations&lt;/i&gt; item in the &lt;i&gt;Select an Installation Screen&lt;/i&gt; dialog box.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/SelectFileAssociationsInstallationScreen.png" /&gt;&lt;/div&gt;&lt;br /&gt;
Once I click on OK, install4j warns me that the &lt;i&gt;File associations&lt;/i&gt; screen requires one or more &lt;i&gt;File association&lt;/i&gt; actions to work.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/AddFileAssociationAction.png" /&gt;&lt;/div&gt;&lt;br /&gt;
I close the warning message. The &lt;i&gt;File associations&lt;/i&gt; screen is added between &lt;i&gt;Create program group&lt;/i&gt; and &lt;i&gt;Installation&lt;/i&gt; screens, and I check &lt;i&gt;Show selection&lt;/i&gt; buttons property to speed up user choice. As Sweet Home 3D has 5 file associations, these buttons will let him or her to select or deselect them with one click.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/FileAssociationsScreenProperties.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
As file associations should be made only after the executable that handles them is installed, I select the &lt;i&gt;Installation&lt;/i&gt; screen in the tree, then I click on the &lt;i&gt;Insert&lt;/i&gt; button to add the desired action. In the displayed &lt;i&gt;Select an Installation Action&lt;/i&gt; dialog box, I filter the shown list by entering the first letters of "&lt;code&gt;association&lt;/code&gt;" to quickly find the &lt;i&gt;Create a file association&lt;/i&gt; action among the 60+ preprogrammed actions.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/CreateFileAssociationAction.png" /&gt;&lt;/div&gt;&lt;br /&gt;
Once I click on OK, install4j appends the new action to the &lt;i&gt;Installation&lt;/i&gt; screen, and in the properties list associated to the action, I enter "&lt;code&gt;sh3d&lt;/code&gt;" &lt;i&gt;File  extension&lt;/i&gt;, describe it as "&lt;code&gt;Sweet Home 3D document&lt;/code&gt;" and select the &lt;i&gt;SweetHome3D&lt;/i&gt; launcher.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/FileAssociationActionProperties.png" /&gt;&lt;/div&gt;&lt;br /&gt;
Then I add the file associations for sh3f, sh3t, sh3p and sh3l extensions in the same way.&lt;br /&gt;
&lt;br /&gt;
For the action that should launch Sweet Home 3D at the end of the installation process, I select the &lt;i&gt;Finish&lt;/i&gt; screen, click on the &lt;i&gt;Insert&lt;/i&gt; button and select &lt;i&gt;Add action&lt;/i&gt;. In the displayed &lt;i&gt;Select an Installation Action&lt;/i&gt; dialog box, I filter the actions list with the first letters of "&lt;code&gt;launcher&lt;/code&gt;" and select &lt;i&gt;Execute launcher&lt;/i&gt; action.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/ExecuteLauncherAction.png" /&gt;&lt;/div&gt;&lt;br /&gt;
Once I click on OK, install4j asks me whether I want to add a check box to the &lt;i&gt;Finish&lt;/i&gt; screen that will will let the user choose to launch the program or not.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/ConfirmCheckBox.png" /&gt;&lt;/div&gt;&lt;br /&gt;
I accept and in the properties list of the &lt;i&gt;Execute launcher&lt;/i&gt; action, I finally choose SweetHome3D as the launcher to run.&lt;br /&gt;
&lt;br /&gt;
At the end, I get the following list of screens and actions for Sweet Home 3D installer.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/ScreensAndActions.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Media&lt;/h4&gt;&lt;br /&gt;
As I don't need &lt;i&gt;Custom&lt;/i&gt; code or &lt;i&gt;Update features&lt;/i&gt; at this time, I jump to the last part of the installer preparation by clicking on &lt;i&gt;Media&lt;/i&gt; icon, then double-clicking on &lt;i&gt;New media file&lt;/i&gt; icon.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/NewMediaFileIcon.png" /&gt;&lt;/div&gt;&lt;br /&gt;
This will launch a wizard to configure a &lt;i&gt;Media&lt;/i&gt; file. As I prefer an executable installer, I choose &lt;i&gt;Windows&lt;/i&gt; in the Installer type combo box.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/MediaChooseType.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;
In the &lt;i&gt;Configure installer options&lt;/i&gt; step, I change installation directory to "&lt;code&gt;Sweet Home 3D&lt;/code&gt;".&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/MediaOptions.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;
The &lt;i&gt;Installer data files&lt;/i&gt; step doesn't need any change since I want to create one installer file that will contain everything required.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/MediaDataFiles.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;
I don't check the &lt;i&gt;64-bit executable&lt;/i&gt; option in the &lt;i&gt;Select the architecture of the generated executables&lt;/i&gt; step since the Java 3D DLLs delivered with Sweet Home 3D are 32-bit only.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/MediaArchitecture.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;
As I don't have any code certificate I must pass the &lt;i&gt;Configure code signing for launchers and installer&lt;/i&gt; step too.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/MediaCodeSigning.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;
The &lt;i&gt;Bundle a JRE with your application&lt;/i&gt; step is more interesting for my use case.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/MediaBundleJRE.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;
As I want to bundle a JRE with Sweet Home 3D to spare users the installation of a JRE, I select the &lt;i&gt;Bundle the following JRE&lt;/i&gt; option and chose the most recent one after clicking on &lt;i&gt;Download JREs.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/DownloadJREs.png" /&gt;&lt;/div&gt;&lt;br /&gt;
Once the JRE is downloaded, I select it in the &lt;i&gt;Bundle the following JRE&lt;/i&gt; combo box.&lt;br /&gt;
&lt;br /&gt;
I'm not interested by any of the &lt;i&gt;Customize project default settings&lt;/i&gt; last step, and I can finish the &lt;i&gt;Media Wizard&lt;/i&gt; execution that will add an icon for the newly created media.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/ApplicationMediaFile.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Build&lt;/h4&gt;&lt;br /&gt;
The installer is now ready to be built. I click on &lt;i&gt;Build&lt;/i&gt; icon and then on &lt;i&gt;Start Build&lt;/i&gt; button.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/Build.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;
After 60 seconds, the installer is generated, and my first surprise is than the generated &lt;i&gt;SweetHome3D-3.0-windows.exe&lt;/i&gt; file is more than 4 MB smaller than the one generated by Inno Setup (26 MB instead of 30.6 MB)! This is probably due to Pack200 compression algorithm.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/SweetHome3DInstallerIcon.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Test&lt;/h4&gt;&lt;br /&gt;
I double-click on the new installer icon to launch it and get the expected installation screens sequence.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/SweetHome3DInstallerLaunch.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/SweetHome3DInstallerSelectLanguage.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/SweetHome3DInstallerStep1.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/SweetHome3DInstallerStep2.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/SweetHome3DInstallerStep3.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/SweetHome3DInstallerStep4.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/SweetHome3DInstallerStep5.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/SweetHome3DInstallerStep6.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/SweetHome3DInstallerStep7.png" /&gt;&lt;/div&gt;&lt;br /&gt;
Once Sweet Home 3D is installed and launched, I check how it's listed in the &lt;i&gt;Processes&lt;/i&gt; tab of the &lt;i&gt;Windows Task Manager&lt;/i&gt;: it appears as &lt;i&gt;SweetHome3D.exe&lt;/i&gt; which is much nicer than &lt;i&gt;javaw.exe&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="http://blogresources.ej-technologies.com/MyFirstTryWithInstall4j/WindowsTaskManager.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;&lt;br /&gt;
With install4j you can easily create an installer and launcher for your Java application. Even if there are many steps in this installer wizard, you really feel install4j takes you by the hand to the right target. But in fact, install4j offers much more features that I'll test in a second article.&lt;br /&gt;
&lt;br /&gt;
I'll use install4j to download some optional files for Sweet Home 3D and configure some program parameters, like memory settings, system properties and default preferences files.&lt;br /&gt;
&lt;br /&gt;
I'll also show how to use the different installation modes and how to update the program automatically.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-5718163345076062156?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/vG2fg7v6Av0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/5718163345076062156/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2010/12/my-first-try-with-install4j-tutorial.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/5718163345076062156?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/5718163345076062156?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/vG2fg7v6Av0/my-first-try-with-install4j-tutorial.html" title="My first try with install4j" /><author><name>Emmanuel</name><uri>http://www.blogger.com/profile/06678502058221236696</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2010/12/my-first-try-with-install4j-tutorial.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcGQ38zfyp7ImA9Wx5bFkw.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-3754799424670915478</id><published>2010-10-27T11:31:00.005+02:00</published><updated>2010-11-01T13:03:42.187+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-01T13:03:42.187+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><title>Market study  for multicore software development tools featuring JProfiler</title><content type="html">The &lt;a href="http://fraunhofer.com/"&gt;Fraunhofer&lt;/a&gt; &lt;a href="http://www.iao.fraunhofer.de/index.php"&gt;IAO&lt;/a&gt; has &lt;a href="http://www.mware.fraunhofer.de/EN/solutions/study.jsp"&gt;published a study&lt;/a&gt; on multi-core software development tools that features JProfiler.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_syUMrjwTSXs/TMfycDDAgXI/AAAAAAAAAB0/dDlb7wVbPEY/s1600/fraunhofer_study.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 150px; height: 212px;" src="http://2.bp.blogspot.com/_syUMrjwTSXs/TMfycDDAgXI/AAAAAAAAAB0/dDlb7wVbPEY/s400/fraunhofer_study.jpg" alt="" id="BLOGGER_PHOTO_ID_5532657230916125042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The study can be viewed free of charge, but requires a registration for download. The abstract of the study is as follows:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;To unlock the performance potentials of current processors, software has to be adapted for execution on multiple cores; it has to be parallelized. This requires the identification of parts that can run concurrently, adaptation of these parts, testing of the changes for correctness and the coordination of the concurrently running parts with regard to performance and scalability.&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;In this study Fraunhofer IAO characterizes the challenges of software development for multicore processors and presents tools that assist in the process. Profilers reveal parallelizable parts, programming languages and libraries help with the correct introduction of parallelism, debuggers show errors during parallel execution and tuners help achieving maximum parallel performance.&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;JProfiler's extensive support for locking analysis &lt;a href="http://www.ej-technologies.com/products/jprofiler/whatsnew6.html"&gt;introduced in 6.0&lt;/a&gt; is an important tool for this kinds of analysis.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-3754799424670915478?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/ZCr_gbPFh78" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/3754799424670915478/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2010/10/market-study-for-multicore-software.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/3754799424670915478?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/3754799424670915478?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/ZCr_gbPFh78/market-study-for-multicore-software.html" title="Market study  for multicore software development tools featuring JProfiler" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_syUMrjwTSXs/TMfycDDAgXI/AAAAAAAAAB0/dDlb7wVbPEY/s72-c/fraunhofer_study.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2010/10/market-study-for-multicore-software.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QBQ3s9cCp7ImA9WxFaEk0.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-4875086791666948211</id><published>2010-06-17T15:49:00.010+02:00</published><updated>2010-07-15T17:55:52.568+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-15T17:55:52.568+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="install4j" /><title>Migrating to install4j 5</title><content type="html">Those who made the move from install4j 3 to install4j 4 will remember that it was a lot of work to migrate custom code, because most core concepts had been changed. &lt;p&gt;&lt;span style="font-weight: bold;"&gt;Not so with install4j 5&lt;/span&gt;: Your old project file will be transformed to the new format and most projects will work right away, without the need for any manual work. If you are interested in the changes in the project file structure, please see the file &lt;span style="font-family:courier new;"&gt;config/transforms/transform_3.xsl &lt;/span&gt;in your install4j installation directory.&lt;br /&gt;&lt;br /&gt;However, there are a number of cases where old functionality has been replaced, behavior has been changed or the API has been fixed. In those cases backwards incompatibilities can arise. This post intends to present an exhaustive list of them:&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;We have removed support for Java 1.3. This allows us to use the standard XML beans decoder and XML parser in the JRE. Java 1.4 is still supported.&lt;/li&gt;&lt;li&gt;The "Require admin user" action and the "Request admin privileges on Windows Vista" option on the "Installer options" step of the Windows media wizard have been removed. They have been replaced with a much more capable "Request privileges" action. &lt;p&gt;The "Request privileges" action is now added to all projects by default and will be inserted into the "Startup" sequence of old projects as well. If you had a "Require admin user" action in your project, the "failure" properties will all be selected (they are otherwise not selected by default). If you had a condition expression on the "Require admin user" action, it will be lost. Especially platform-dependent configuration is now possible directly in the "Request privileges" action.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;On the Installer-&gt;Custom Code tab, the old "Use installed JAR files if possible" option has been removed. Previously, the installer performed a two-phase initialization of screens and actions, before and after the "Install Files" action, so you could use custom code from installed JAR files. &lt;p&gt;The main reason for that option was to prevent double packaging of JAR files, once for the installer and once for the launcher. In install4j 5, if entries in the custom code are also present in the distribution tree, they will be moved to the final destination by the "Install Files" action, and the custom code will automatically include the installed files in custom installer applications and the uninstaller. This change significantly improves custom code handling, because double packaging is always prevented and you can use such custom code before the "Install Files" action is executed. &lt;/p&gt;&lt;p&gt;However, if your code depends on the location of the JAR file, this can be a breaking change and you have to change your custom code. In that case, the new &lt;span style="font-family:courier new;"&gt;Screen#isCreatedLazily()&lt;/span&gt; method and the optional &lt;span style="font-family:courier new;"&gt;Context#initializeLazilyCreatedScreens()&lt;/span&gt; method will help you to move the initialization of the custom screen after the "Install Files" action while the &lt;span style="font-family:courier new;"&gt;Context#addToClassPath(File)&lt;/span&gt; method allows you to add installed JAR files to the custom code for dependencies that only work in the installed location.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;The compiler variable "sys.platform" now resolves to "windows-x64" for 64 bit media files. Previously, it always resolved to "windows". This variable is used in the standard media file name pattern on the General Settings-&gt;Media File Options tab, so your 64-bit Windows media files will now be named differently if you have not changed or overridden the media file name.&lt;/li&gt;&lt;li&gt;There was a typo in the system message key name "LocateBrowerExecutable". In the unlikely event that you used that key explicitly in your project before, it will lead to a runtime exception.&lt;/li&gt;&lt;li&gt;A few installer variable names have changed to make naming more consistent. The old names will be replaced automatically with the new names when you open your old project file for the first time. However, if you use them outside of the install4j IDE, for example in custom code, you will have to change them. The replacements are:&lt;/li&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;sys.mediaDirectory -&gt; sys.mediaDir&lt;/li&gt;&lt;br /&gt;&lt;li&gt;sys.installerDirectory -&gt; sys.installerDir&lt;/li&gt;&lt;br /&gt;&lt;li&gt;sys.programGroup.name -&gt; sys.programGroupName&lt;/li&gt;&lt;br /&gt;&lt;li&gt;sys.programGroup.linkDir -&gt; sys.symlinkDir&lt;/li&gt;&lt;br /&gt;&lt;li&gt;sys.programGroup.allUsers -&gt; sys.programGroupAllUsers&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;(Updated on 2010-07-15) The "Services" screen has been removed.  The reason is that since the service actions now support arbitrary  service executables (not only those generated by install4j), it would be  difficult for us to present a list like in 4.x.  Also, we feel  that this is really a technical question that users should not have to  answer. If needed, you can create a question with a configurable form.  The "Hello world" project has such a screen.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Other breaking changes only concern the API:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The method ApplicationRegistry.ApplicationInfo#getProgramGroup() has been removed from the API. It has been obsolete since 4.2, when the "Load reponse file" action was added. In the GUI, the "Suggest previous program group" option on the Installer-&gt;Update Options tab has been removed as well.&lt;/li&gt;&lt;li&gt;Several typos in method names have been fixed. Fortunately, typos were only discovered for the rarely used methods &lt;span style="font-family:courier new;"&gt;Context#isErrorOccurred()&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;Context#setErrorOccurred(boolean)&lt;/span&gt; and&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FormComponent#initialize()&lt;/span&gt;. If you are affected by the first two changes, the build will fail. If you derive a form component from &lt;span style="font-family:courier new;"&gt;AbstractFormComponent&lt;/span&gt;, the third change concerns a method that is overridden and would not cause a compilation error, so we have added a method for backwards compatibility in that case.&lt;/li&gt;&lt;li&gt;Several methods in the &lt;span style="font-family:courier new;"&gt;Install4jBeanInfo &lt;/span&gt;and &lt;span style="font-family:courier new;"&gt;Install4JPropertyDescriptor &lt;/span&gt;classes had their return values changed from void to the class itself in order to facilitate usages in builder patterns. You just have to recompile your code against the new runtime library, no source code changes are required.&lt;/li&gt;&lt;li&gt;The &lt;span style="font-family:courier new;"&gt;Context#getWizardContext()&lt;/span&gt; does not return &lt;span style="font-family:courier new;"&gt;null &lt;/span&gt;in unattended or console mode anymore. Instead, a dummy wizard context is returned that does nothing when its methods are invoked. If you use&lt;span style="font-family:courier new;"&gt; Context#getWizardContext() &lt;/span&gt;to check for those installer modes, you have to change your code and use &lt;span style="font-family:courier new;"&gt;Context#isUnattended()&lt;/span&gt;and &lt;span style="font-family:courier new;"&gt;Context#isConsole()&lt;/span&gt;instead.&lt;/li&gt;&lt;li&gt;The "installerAndUninstaller" argument from &lt;span style="font-family:courier new;"&gt;ActionBeanInfo#setAssociatedStartupAction(String)&lt;/span&gt; was removed because the new &lt;span style="font-family:courier new;"&gt;ActionBeanInfo#setComplementaryStartupLink(boolean)&lt;/span&gt; makes more sense.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;That's it! Most of these changes are only breaking changes for corner cases and even then it should be easy to fix them. If you notice any other breaking changes, please let us know, so we can add them to this list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-4875086791666948211?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/rg3zbovFQvQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/4875086791666948211/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2010/06/migrating-to-install4j-5.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/4875086791666948211?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/4875086791666948211?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/rg3zbovFQvQ/migrating-to-install4j-5.html" title="Migrating to install4j 5" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2010/06/migrating-to-install4j-5.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UGSX84cCp7ImA9WxBaGEo.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-5214776285943559095</id><published>2010-03-29T17:00:00.002+02:00</published><updated>2010-03-29T17:07:08.138+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-29T17:07:08.138+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><category scheme="http://www.blogger.com/atom/ns#" term="screencast" /><title>Offline profiling and triggers</title><content type="html">In the screencast below, I explain how to automate profiling with offline profiling and triggers, so that you do not have to use the JProfiler GUI for profiling and can analyze profiling results later on.&lt;br /&gt;&lt;br /&gt;&lt;p id='jprofiler-offline'&gt;Please enable Javascript to view the screen cast&lt;/p&gt;&lt;script type='text/javascript' src='http://blogresources.ej-technologies.com/swfobject.js'&gt;&lt;/script&gt;&lt;script type='text/javascript'&gt;var s1 = new SWFObject('http://blogresources.ej-technologies.com/player.swf','player','600','488','9');s1.addParam('allowfullscreen','true');s1.addParam('allowscriptaccess','always');s1.addVariable('file','http://blogresources.ej-technologies.com/jprofiler-offline.mp4');s1.addVariable('image','http://blogresources.ej-technologies.com/jprofiler-offline.png');s1.write('jprofiler-offline');&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-5214776285943559095?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/9ANHIV0n6eg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/5214776285943559095/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2010/03/offline-profiling-and-triggers.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/5214776285943559095?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/5214776285943559095?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/9ANHIV0n6eg/offline-profiling-and-triggers.html" title="Offline profiling and triggers" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2010/03/offline-profiling-and-triggers.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYHSXs5fyp7ImA9WxBWE0U.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-4499916351318881466</id><published>2010-02-05T16:29:00.002+01:00</published><updated>2010-02-05T16:35:38.527+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-05T16:35:38.527+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><category scheme="http://www.blogger.com/atom/ns#" term="screencast" /><title>Cumulating and filtering monitor events</title><content type="html">In the screencast below, I explain how monitor events in the locking history graph can be cumulated and how you can select monitors and threads of interest.&lt;br /&gt;&lt;br /&gt;&lt;p id='jprofiler-monitor_filters'&gt;Please enable Javascript to view the screen cast&lt;/p&gt;&lt;script type='text/javascript' src='http://blogresources.ej-technologies.com/swfobject.js'&gt;&lt;/script&gt;&lt;script type='text/javascript'&gt;var s1 = new SWFObject('http://blogresources.ej-technologies.com/player.swf','player','600','488','9');s1.addParam('allowfullscreen','true');s1.addParam('allowscriptaccess','always');s1.addVariable('file','http://blogresources.ej-technologies.com/jprofiler-monitor_filters.mp4');s1.addVariable('image','http://blogresources.ej-technologies.com/jprofiler-monitor_filters.png');s1.write('jprofiler-monitor_filters');&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-4499916351318881466?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/hLoipWT4jyI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/4499916351318881466/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2010/02/cumulating-and-filtering-monitor-events.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/4499916351318881466?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/4499916351318881466?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/hLoipWT4jyI/cumulating-and-filtering-monitor-events.html" title="Cumulating and filtering monitor events" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2010/02/cumulating-and-filtering-monitor-events.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UCRn04fip7ImA9WxBXEEU.&quot;"><id>tag:blogger.com,1999:blog-5618118655031293495.post-8242553011411076560</id><published>2010-01-21T16:46:00.002+01:00</published><updated>2010-01-21T16:54:27.336+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-21T16:54:27.336+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jprofiler" /><category scheme="http://www.blogger.com/atom/ns#" term="screencast" /><title>Monitor events versus locking situations</title><content type="html">In the screencast below, I discuss cross-links between the various monitor views. The profiled test program is the same as in the screencast on &lt;a href="http://blog.ej-technologies.com/2009/11/locking-graphs-in-jprofiler.html"&gt;Locking graphs in JProfiler&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;p id='jprofiler-monitor_crosslinks'&gt;Please enable Javascript to view the screen cast&lt;/p&gt;&lt;script type='text/javascript' src='http://blogresources.ej-technologies.com/swfobject.js'&gt;&lt;/script&gt;&lt;script type='text/javascript'&gt;var s1 = new SWFObject('http://blogresources.ej-technologies.com/player.swf','player','600','488','9');s1.addParam('allowfullscreen','true');s1.addParam('allowscriptaccess','always');s1.addVariable('file','http://blogresources.ej-technologies.com/jprofiler-monitor_crosslinks.mp4');s1.addVariable('image','http://blogresources.ej-technologies.com/jprofiler-monitor_crosslinks.png');s1.write('jprofiler-monitor_crosslinks');&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5618118655031293495-8242553011411076560?l=blog.ej-technologies.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ejtblog/~4/Zmduu4M1QkQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.ej-technologies.com/feeds/8242553011411076560/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.ej-technologies.com/2010/01/monitor-events-versus-locking.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/8242553011411076560?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5618118655031293495/posts/default/8242553011411076560?v=2" /><link rel="alternate" type="text/html" href="http://feeds.ej-technologies.com/~r/ejtblog/~3/Zmduu4M1QkQ/monitor-events-versus-locking.html" title="Monitor events versus locking situations" /><author><name>ingo</name><uri>http://www.blogger.com/profile/03544635331387041435</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.ej-technologies.com/2010/01/monitor-events-versus-locking.html</feedburner:origLink></entry></feed>

