You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@daffodil.apache.org by sl...@apache.org on 2019/02/13 14:51:04 UTC

[incubator-daffodil] branch master updated: Create Windows MSI installer package.

This is an automated email from the ASF dual-hosted git repository.

slawrence pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-daffodil.git


The following commit(s) were added to refs/heads/master by this push:
     new 4a1fbbb  Create Windows MSI installer package.
4a1fbbb is described below

commit 4a1fbbb44f73c14886eed6d5694158effeafaf68
Author: Otto <mo...@tresys.com>
AuthorDate: Wed Feb 6 16:00:55 2019 -0500

    Create Windows MSI installer package.
    
    DAFFODIL-2047
---
 daffodil-cli/build.sbt                             | 194 ++++++++++++++++++++-
 .../src/windows/DisclaimerDlg_Daffodil.wxs         |  38 ++++
 daffodil-cli/src/windows/Product_en-us.wxl         |  52 ++++++
 daffodil-cli/src/windows/WixUI_Daffodil.wxs        |  79 +++++++++
 daffodil-cli/src/windows/apache-daffodil.ico       | Bin 0 -> 90022 bytes
 daffodil-cli/src/windows/banner.bmp                | Bin 0 -> 114514 bytes
 daffodil-cli/src/windows/dialog.bmp                | Bin 0 -> 615402 bytes
 project/plugins.sbt                                |   2 +-
 8 files changed, 362 insertions(+), 3 deletions(-)

diff --git a/daffodil-cli/build.sbt b/daffodil-cli/build.sbt
index b03b60e..8ac8733 100644
--- a/daffodil-cli/build.sbt
+++ b/daffodil-cli/build.sbt
@@ -15,8 +15,13 @@
  * limitations under the License.
  */
 
+import scala.xml.Attribute
+import scala.xml.transform.RewriteRule
+import scala.xml.transform.RuleTransformer
+ 
 enablePlugins(JavaAppPackaging)
 enablePlugins(RpmPlugin)
+enablePlugins(WindowsPlugin)
 
 // need 'sbt stage' to build the CLI for cli integration tests
 (test in IntegrationTest) := (test in IntegrationTest).dependsOn(stage in Compile).value
@@ -26,10 +31,9 @@ enablePlugins(RpmPlugin)
 executableScriptName := "daffodil"
 
 packageName in Universal := "apache-daffodil-" + version.value + "-incubating-bin" //tarball name
-
 packageName in Linux := executableScriptName.value
-
 packageName in Rpm := "apache-" + executableScriptName.value
+packageName in Windows := executableScriptName.value
 
 mappings in Universal ++= Seq(
   baseDirectory.value / "bin.LICENSE" -> "LICENSE",
@@ -38,6 +42,9 @@ mappings in Universal ++= Seq(
   baseDirectory.value / "README.md" -> "README.md",
 )
 
+//
+// RPM configuration
+//
 rpmVendor := "Apache Daffodil"
 
 maintainer in Rpm := "Apache Daffodil <de...@daffodil.apache.org>"
@@ -71,3 +78,186 @@ rpmRelease := {
 rpmLicense := Some(licenses.value.map { case (n: String, _) => n }.mkString(" and "))
 
 rpmPrefix := Some(defaultLinuxInstallLocation.value)
+
+//
+// Windows configuration
+//
+
+//
+// Here we set the variables that are supported by the SBT Native Packager plug-in.
+// We also get fairly aggressive in editing/modifying the XML in order
+// to control and use some specific features that are supported by WiX
+// but which are not properly suported by the SBT plug-in.
+//
+
+// Force the correct installation directory name. This overwrites
+// 'daffodil-cli', which is the directory that we invoke sbt in.
+// The SBT WiX plug-in incorrectly assumes that the directory of
+// invocation is the same name as the direcotry you eventually
+// want to install into.
+name in Windows := "Daffodil" 
+
+// The Windows packager SBT plug-in maps the maintainer variable into
+// the WiX ManufacturerFullName field which is displayed in the properties
+// dialog box for the executable.
+maintainer in Windows := "Apache Daffodil Developers <de...@daffodil.apache.org>"
+
+// The Windows packager SBT plug-in maps the packageSummary variable
+// into the WiX productName field. Another strange choice. 
+packageSummary in Windows := "Daffodil"
+
+// The Windows packager SBT plug-in limits the length of the
+// packageDescription field to a single line. Originally this was a
+// full paragraph, as seen in the RPM section, above.
+packageDescription in Windows := """Apache Daffodil (incubating) is the open source implementation of the Data Format Description Language (DFDL)""".trim
+
+// Calculate the version number dynamically and pass it in.
+// Windows permits up to four numeric values (e.g. 2.1.5.1820)
+// where the numbers represent major, minor, patch and build
+// respectively. In RPM packaging we add 'incubating', but
+// Windows will barf on this. Here we suffix a zero (0) build
+// number for snapshot/development/debug builds. A one (1)
+// in the build number could be used to differentiate official
+// production builds that are destined for release. 
+version in Windows := {
+  val parts = version.value.split("-", 2)
+  val ver = parts(0) // removes snapshot if it exists
+  ver + ".0"
+}
+
+// Required and critical GUIDs. Ironically the ProductId is unique
+// to a given release, but UpgradeId must NEVER change! This may
+// seem conter-intuitive, but the UpgradeId is actually what ties
+// the product to it's upgrades and the product is actually unique
+// each time it is released, so there is some semblance of logic
+// to this scheme.
+wixProductUpgradeId := "4C966AFF-585E-4E17-8CC2-059FD70FEC77"
+
+// Light options. Bring in standard dialog boxes and localization.
+// The suppression of ICE61 is required as we *DO* permit
+// re-installation of the same version. Despite the presence of
+// specific XML to enable this, the WiX compiler and linker
+// complain about it unless you specifically suppress the warning.
+lightOptions := Seq(
+	"-sice:ICE61",
+	"-ext", "WixUIExtension",
+	"-cultures:en-us",
+	"-loc", ((sourceDirectory in Windows).value / "Product_en-us.wxl").toString
+	)
+
+// Build an RTF version of the license file for display in the license
+// acceptance dialog box. This file will also be sent to the
+// printer when and if the user asks for hard copy via the 'print' button.
+wixProductLicense := {
+  // Make sure the target direcotry exists.
+  (target in Windows).value.mkdirs()
+  
+  // This target file doesn't exist until placed there by the build.
+  val targetLicense = (target in Windows).value / "LICENSE.rtf" 
+  val sourceLicense = baseDirectory.value / "bin.LICENSE"
+  // somehow convert sourceLicense into RTF and store at targetLicense
+  val rtfHeader = """{\rtf {\fonttbl {\f0 Arial;}} \f0\fs18"""
+  val rtfFooter = """}"""
+
+  val licenseLines = scala.io.Source.fromFile(sourceLicense, "UTF-8").getLines
+  val writer = new java.io.PrintWriter(targetLicense, "UTF-8")
+  writer.println(rtfHeader)
+  licenseLines.foreach { line =>
+    writer.println(line + """\line""")
+  }
+  writer.println(rtfFooter)
+  writer.close
+  Option(targetLicense)
+}
+// Use the wixFiles variable to add in the Daffodil-specific dialog
+// boxes and sequence.
+wixFiles ++= Seq(
+  (sourceDirectory in Windows).value / "WixUI_Daffodil.wxs",
+  (sourceDirectory in Windows).value / "DisclaimerDlg_Daffodil.wxs"
+)  
+
+// The SBT Native Packager plug-in assumes that we want to give the user
+// a Feature Tree to select from. One of the 'features' that the plug-in
+// offers up is a set of all shortcuts and menu links. Daffodil is
+// actually a command-line executable, so we do not include
+// configuration links as they are unnecessary. From a practical
+// standpoint the user must invoke a command shell in a window
+// before they can invoke Daffodil anyway.
+wixFeatures := {
+  val features = wixFeatures.value
+  features.filter { _.id != "AddConfigLinks"}
+}
+
+// Make sure that we don't use an MSI installer that is older than
+// version 2.0. It also fixes the comment attribute that hangs
+// out on the Package keyword. 
+wixPackageInfo := wixPackageInfo.value.copy(installerVersion = "200", comments = "!(loc.Comments)")
+
+// Fix the XML that is associated with the installable files and directories.
+wixProductConfig := {
+  // Pick up the generated code.
+  val pc = wixProductConfig.value
+  
+  // Replace the default headline banner and Welcome/Exit screen
+  // bitmaps with the custom ones we developed for Daffodil. 
+  val banner = <WixVariable Id="WixUIBannerBmp" Value={ ((sourceDirectory in Windows).value / "banner.bmp").toString } />
+  val dialog = <WixVariable Id="WixUIDialogBmp" Value={ ((sourceDirectory in Windows).value / "dialog.bmp").toString } />
+  
+  // Reference the Daffodil-specific User Interface (dialog box) sequence.
+  val ui = <UI><UIRef Id="WixUI_Daffodil" /></UI>
+  
+  // Make sure we abort if we are not installing on Windows 95 or later.
+  val osCondition = <Condition Message="!(loc.OS2Old)"><![CDATA[Installed OR (VersionNT >= 400)]]></Condition>
+
+  // Define icons (ID should not be longer than 18 chars and must end with ".exe")
+  val icon = Seq(
+    <Icon Id="Icon.exe" SourceFile={ ((sourceDirectory in Windows).value / "apache-daffodil.ico").toString } />,
+    <Property Id="ARPPRODUCTICON" Value="Icon.exe" />
+  )
+  
+  // String together the additional XML around the generated directory and file lists. 
+  val pcGroup = pc.asInstanceOf[scala.xml.Group]
+  val newNodes = osCondition ++ icon ++ pcGroup.nodes ++ dialog ++ banner ++ ui
+  val pcWithNewNodes = pcGroup.copy(nodes = newNodes)
+
+  // Change (edit) some items inside the directory/files list.
+  val pcRewriteRule = new RewriteRule {
+    override def transform(n: scala.xml.Node): Seq[scala.xml.Node] = n match {
+	
+      // We want to comply with the Windows standard pattern of
+      // installing at /Program Files/ManufacturerName/Application
+      // This case effectively inserts the manufacturer name into
+      // the XML as a directory to comply with the standard.
+      case e: scala.xml.Elem if (e \ "@Name").text == "PFiles" => {
+        val apacheDir = <Directory Id="ProgramFilesApache" Name="!(loc.ManufacturerName)" />
+        val apacheDirWithChild = apacheDir.copy(child = e.child)
+        e.copy(child = apacheDirWithChild)
+      }
+	  
+      // We *ARE* going to allow the user to repair and reinstall
+      // the same exact version, so we need to add an attribute
+      // to the MajorUpgrade keyword.  This will trigger an 'ICE61'
+      // error that we suppress on the 'light' linker command line.
+      case e: scala.xml.Elem if e.label == "MajorUpgrade" => {
+        e % scala.xml.Attribute("", "AllowSameVersionUpgrades", "yes", e.attributes)
+      }
+
+      // Fixup for registry key.
+      case e: scala.xml.Elem if e.label == "RegistryValue" => {
+        val attribs = e.attributes.remove("Key")
+        e % scala.xml.Attribute("", "Key", """Software\Apache\Installed Products\Daffodil""", attribs)
+      }
+	  
+      // The WixUI_FeatureTree reference has to be removed so that
+      // our custom Daffodil UI can operate properly.
+      case e: scala.xml.Elem if e.label == "UIRef" && (e \ "@Id").text == "WixUI_FeatureTree" => {
+        scala.xml.NodeSeq.Empty
+      }
+      case `n` => n
+    }
+  }
+
+  // Now apply all the edits in the RewriteRule defined above.
+  val newXml = new RuleTransformer(pcRewriteRule).transform(pcWithNewNodes)
+  <xml:group>{newXml}</xml:group>
+}
diff --git a/daffodil-cli/src/windows/DisclaimerDlg_Daffodil.wxs b/daffodil-cli/src/windows/DisclaimerDlg_Daffodil.wxs
new file mode 100644
index 0000000..39e3cd4
--- /dev/null
+++ b/daffodil-cli/src/windows/DisclaimerDlg_Daffodil.wxs
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+   <Fragment>
+      <UI>
+         <Dialog Id="DisclaimerDlg" Width="370" Height="270" Title="!(loc.DisclaimerDlg_Title)">
+            <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" />
+            <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)">
+               <Condition Action="enable">DisclaimerAccepted = "1"</Condition>
+            </Control>
+            <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
+               <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
+            </Control>
+            <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.LicenseAgreementDlgBannerBitmap)" />
+			<Control Id="DisclaimerTextControl" Type="Text" X="20" Y="60" Width="330" Height="160" Transparent="yes" NoPrefix="yes" Text="!(loc.DisclaimerText)" />
+            <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
+            <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+            <Control Id="Description" Type="Text" X="25" Y="23" Width="340" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.DisclaimerDlgDescription)" />
+            <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.DisclaimerDlg_TitleBold)" />
+         </Dialog>
+      </UI>
+   </Fragment>
+</Wix>
diff --git a/daffodil-cli/src/windows/Product_en-us.wxl b/daffodil-cli/src/windows/Product_en-us.wxl
new file mode 100644
index 0000000..99aea3f
--- /dev/null
+++ b/daffodil-cli/src/windows/Product_en-us.wxl
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<WixLocalization Culture="en-us" Codepage="1252" xmlns="http://schemas.microsoft.com/wix/2006/localization">
+   <String Id="Language">1033</String>         <!-- Supported language and codepage codes can be found here: http://www.tramontana.co.hu/wix/lesson2.php#2.4 -->
+ 
+   <String Id="ApplicationName">Daffodil</String>
+   <String Id="ManufacturerName">Apache</String>
+   
+   <!-- SBT Native Packager plug-in uses 'ManufacturerFullName' instead of 'ManufacturerName'. -->
+   <!-- This doesn't matter most places, but in the directory structure we have to be short and have no spaces. -->
+   <String Id="ManufacturerFullName">Apache</String>
+   
+   <!-- SBT Native Packager plug-in uses 'ProductDescription' as the title on the installer window. -->
+   <String Id="ProductDescription">Daffodil Installer</String>
+   
+   <!-- SBT Native Packager plug-in does not support comments, so this next line is ignored. -->
+   <String Id="Comments">Installs Daffodil</String>
+ 
+   <!-- Set up the Notice dialog. -->
+   <String Id="DisclaimerDlg_Title" Overridable="yes">Daffodil Setup</String>
+   <String Id="DisclaimerDlg_TitleBold" Overridable="yes">{\WixUI_Font_Title}Apache Incubator Disclaimer</String>
+   <String Id="DisclaimerDlgDescription" Overridable="yes">Please read this Disclaimer, then click the 'Next' button</String>
+   <String Id="DisclaimerText" Overridable="yes">{\WixUI_Font_Bigger}Apache Daffodil is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator PMC. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of th [...]
+   
+   <!-- Set up the License Agreement dialog. -->
+   <String Id="LicenseAgreementDlg_Title" Overridable="yes">Daffodil Setup</String>
+   <String Id="LicenseAgreementDlg_TitleBold" Overridable="yes">{\WixUI_Font_Title}Apache Daffodil License</String>   
+   <String Id="LicenseAgreementDlgDescription" Overridable="yes">Please read this License, click the 'I accept' checkbox and then click the 'Next' button.</String>
+
+   <!-- This string is displayed when the user tries to install on a platform that is too old. --> 
+   <String Id="OS2Old">This product requires at least Windows 95 / Windows NT 4.0 Server.</String>
+   
+   <String Id="FeatureCompleteDescription">Daffodil</String>
+   <String Id="FeatureMainProgramDescription">The Daffodil product with all dependencies.</String>
+   <String Id="FeatureMainProgramTitle">Daffodil Installer</String>
+
+</WixLocalization>
diff --git a/daffodil-cli/src/windows/WixUI_Daffodil.wxs b/daffodil-cli/src/windows/WixUI_Daffodil.wxs
new file mode 100644
index 0000000..ed161fd
--- /dev/null
+++ b/daffodil-cli/src/windows/WixUI_Daffodil.wxs
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+   <Fragment>
+ 
+      <UI Id="WixUI_Daffodil">
+         <TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
+         <TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
+         <TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
+ 
+         <Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
+         <Property Id="WixUI_Mode" Value="InstallDir" />
+ 
+         <DialogRef Id="BrowseDlg" />
+         <DialogRef Id="DiskCostDlg" />
+         <DialogRef Id="ErrorDlg" />
+         <DialogRef Id="FatalError" />
+         <DialogRef Id="LicenseAgreementDlg"/>
+         <DialogRef Id="FilesInUse" />
+         <DialogRef Id="MsiRMFilesInUse" />
+         <DialogRef Id="PrepareDlg" />
+         <DialogRef Id="ProgressDlg" />
+         <DialogRef Id="ResumeDlg" />
+         <DialogRef Id="UserExit" />
+ 
+         <!--   Make sure to include custom dialogs in the installer database via a DialogRef command, 
+               especially if they are not included explicitly in the publish chain below -->
+         <DialogRef Id="DisclaimerDlg"/>
+		 
+         <Publish Dialog="BrowseDlg" Control="OK" Event="DoAction" Value="WixUIValidatePath" Order="3">1</Publish>
+         <Publish Dialog="BrowseDlg" Control="OK" Event="SpawnDialog" Value="InvalidDirDlg" Order="4"><![CDATA[WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
+ 
+         <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
+ 
+         <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="DisclaimerDlg">NOT Installed</Publish>
+         <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed AND PATCH</Publish>
+ 
+         <Publish Dialog="DisclaimerDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish>
+         <Publish Dialog="DisclaimerDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg"></Publish> 
+ 
+         <Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="DisclaimerDlg">1</Publish>
+         <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg">LicenseAccepted = "1"</Publish>
+ 
+         <Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="LicenseAgreementDlg">1</Publish>
+         <Publish Dialog="InstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>
+         <Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="WixUIValidatePath" Order="2">NOT WIXUI_DONTVALIDATEPATH</Publish>
+         <Publish Dialog="InstallDirDlg" Control="Next" Event="SpawnDialog" Value="InvalidDirDlg" Order="3"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
+         <Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="4">WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1"</Publish>
+         <Publish Dialog="InstallDirDlg" Control="ChangeFolder" Property="_BrowseProperty" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>
+         <Publish Dialog="InstallDirDlg" Control="ChangeFolder" Event="SpawnDialog" Value="BrowseDlg" Order="2">1</Publish>
+ 
+         <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="InstallDirDlg" Order="1">NOT Installed</Publish>
+         <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">Installed</Publish>
+ 
+         <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
+ 
+         <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
+         <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
+         <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
+      </UI>
+ 
+      <UIRef Id="WixUI_Common"/>
+   </Fragment>
+</Wix>
diff --git a/daffodil-cli/src/windows/apache-daffodil.ico b/daffodil-cli/src/windows/apache-daffodil.ico
new file mode 100644
index 0000000..8ecebb4
Binary files /dev/null and b/daffodil-cli/src/windows/apache-daffodil.ico differ
diff --git a/daffodil-cli/src/windows/banner.bmp b/daffodil-cli/src/windows/banner.bmp
new file mode 100644
index 0000000..8537ce6
Binary files /dev/null and b/daffodil-cli/src/windows/banner.bmp differ
diff --git a/daffodil-cli/src/windows/dialog.bmp b/daffodil-cli/src/windows/dialog.bmp
new file mode 100644
index 0000000..063ee29
Binary files /dev/null and b/daffodil-cli/src/windows/dialog.bmp differ
diff --git a/project/plugins.sbt b/project/plugins.sbt
index fe864da..5d722fc 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.3.6")
+addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.3.17")
 
 addSbtPlugin("org.musigma" % "sbt-rat" % "0.6.0")