diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
new file mode 100644
index 000000000..f5990c39b
--- /dev/null
+++ b/.git-blame-ignore-revs
@@ -0,0 +1,6 @@
+# Commits that git blame should skip, such as whole-file line-ending
+# or formatting changes. GitHub reads this file automatically. To use it
+# locally, run: git config blame.ignoreRevsFile .git-blame-ignore-revs
+
+# Normalize line endings in install4j project files
+dc1fa130561e38fc3e497afd0b3b0e5778e7b1e9
diff --git a/.gitattributes b/.gitattributes
index 1e727afd1..067124344 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -9,5 +9,9 @@ configure-from-env text eol=lf
# Windows scripts must stay CRLF
*.bat text eol=crlf
+# Stored with LF, checked out with native endings. install4j rewrites
+# the whole file with the platform's endings on save.
+*.install4j text
+
# Binary files are left untouched
*.jar binary
diff --git a/.gitignore b/.gitignore
index 9e8e4e77f..17542916c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,6 +36,11 @@ build/
gradle-app.setting
!gradle-wrapper.jar
+##############################
+## install4j
+##############################
+*.install4j~
+
##############################
## IntelliJ
##############################
diff --git a/tools/install4j/oie-installer-config.install4j b/tools/install4j/oie-installer-config.install4j
index c864cee3b..9a7ae3565 100644
--- a/tools/install4j/oie-installer-config.install4j
+++ b/tools/install4j/oie-installer-config.install4j
@@ -1,841 +1,783 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- #
-# Do not modify this file! It may get overwritten in an update. Please put all custom
-# options in custom.vmoptions
-#
--server
--Xmx256m
--Djava.awt.headless=true
--Dapple.awt.UIElement=true
-
-
-
-
-
-
-
-
-
-
-
-
-
- #
-# Do not modify this file! It may get overwritten in an update. Please put all custom
-# options in custom.vmoptions
-#
--server
--Xmx256m
--Djava.awt.headless=true
--Dapple.awt.UIElement=true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ${compiler:installer:mediaRoot}/../governance/branding/icons/oie_logo_only_white_background_128x128.png
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 255
- 255
- 255
- 255
-
-
- 49
- 52
- 53
- 255
-
-
-
-
-
-
-
-
-
-
-
-
- icon:${installer:sys.installerApplicationMode}_header.png
-
-
-
-
- 0
- 5
- 1
- 1
-
-
-
-
- 0
- 20
- 0
- 10
-
-
-
-
- backgroundColor
- foregroundColor
- imageAnchor
- imageFile
- imageOverlap
-
-
-
-
-
-
-
-
- sys.installationDir
-
-
- context.getBooleanVariable("sys.confirmedUpdateInstallation")
-
-
-
-
-
- ${form:welcomeMessage}
-
- !context.isConsole()
-
-
-
-
-
- String message = context.getMessage("ConsoleWelcomeLabel", context.getApplicationName());
-return console.askOkCancel(message, true);
-
-
-
-
-
-
-
- updateCheck
-
-
-
-
- ${i18n:ClickNext}
-
-
-
-
-
-
-
-
- ${i18n:LicenseLabel3}
-
-
-
-
-
-
-
- en
-
- ${compiler:installer:mediaRoot}/server/setup/docs/LICENSE.txt
-
-
-
-
-
- license
-
-
- textSource
- displayedText
- displayedTextFile
- variableName
- acceptInitiallySelected
- readAllRequired
-
-
-
-
-
-
-
-
- ${i18n:InfoBeforeClickLabel}
-
- !context.isConsole()
-
-
-
- <!DOCTYPE html>
-<html>
-<body style="font-family: Arial, sans-serif; line-height: 1.6; margin: 1em; background-color: white; color: black;">
- <h1 style="color: black;">Open Integration Engine - Preview Release</h1>
- <p>This is a preview release of the Open Integration Engine.</p>
- <p>
- This release is recommended for users already familiar with Mirth Connect.
- It installs a fully functional version of the engine with minimal prompts.
- As you have seen - this does require admin permissions to run and install services, we will be updating that!
- </p>
- <h2>Notes</h2>
- <ul>
- <li>Native services are installed for all supported platforms and are configured to start automatically.</li>
- <li><strong>macOS users:</strong> A reboot will automatically start the service.</li>
- <li>
- Default settings from mirth.properties are applied automatically; the installer does not prompt for customization.
- </li>
- <li>This includes ports (default: 8080 and 8443), log and app data paths, and password requirements.</li>
- <li>
- Previous installations are not preserved, though runtime-created directories
- (e.g., appdata)
- are retained across installs.
- </li>
-
- </ul>
-</body>
-</html>
-
-
-
-
- en
-
- ${compiler:installer:mediaRoot}/tools/install4j/readme.html
-
-
-
-
-
-
-
- textSource
- displayedText
- displayedTextFile
- variableName
-
-
-
-
-
-
- console.waitForEnter();
-return true;
-
-
-
-
-
-
-
-
- !context.getBooleanVariable("sys.confirmedUpdateInstallation")
-
-
-
-
- sys.installationDir
-
-
- context.getVariable("sys.responseFile") == null
-
-
-
-
-
- ${i18n:SelectDirLabel(${compiler:sys.fullName})}
-
-
-
-
-
-
-
- suggestAppDir
- validateApplicationId
- existingDirWarning
- checkWritable
- manualEntryAllowed
- checkFreeSpace
- showRequiredDiskSpace
- showFreeDiskSpace
- allowSpacesOnUnix
- validationScript
- standardValidation
-
-
-
-
-
-
-
-
- ${i18n:SelectComponentsLabel2}
-
- !context.isConsole()
-
-
-
-
-
-
- selectionChangedScript
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ${i18n:UninstallerMenuEntry(${compiler:sys.fullName})}
-
- !context.getBooleanVariable("sys.programGroupDisabled")
-
-
-
- ${compiler:sys.fullName} ${compiler:sys.version}
-
-
-
-
- 25
- com.oie.oieservice
-
-
-
-
-
-
- ${i18n:WizardPreparing}
-
-
-
-
-
-
-
-
- ${form:finishedMessage}
-
-
-
-
-
-
-
-
- ${i18n:UninstallerMenuEntry(${compiler:sys.fullName})}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 25
-
-
-
-
-
-
- ${form:welcomeMessage}
-
- !context.isConsole()
-
-
-
-
-
- String message = context.getMessage("ConfirmUninstall", context.getApplicationName());
-return console.askYesNo(message, true);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ${i18n:UninstallerPreparing}
-
-
-
-
-
-
-
-
-
- ${form:successMessage}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #
+# Do not modify this file! It may get overwritten in an update. Please put all custom
+# options in custom.vmoptions
+#
+-server
+-Xmx256m
+-Djava.awt.headless=true
+-Dapple.awt.UIElement=true
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #
+# Do not modify this file! It may get overwritten in an update. Please put all custom
+# options in custom.vmoptions
+#
+-server
+-Xmx256m
+-Djava.awt.headless=true
+-Dapple.awt.UIElement=true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${compiler:installer:mediaRoot}/../governance/branding/icons/oie_logo_only_white_background_128x128.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 255
+ 255
+ 255
+ 255
+
+
+ 49
+ 52
+ 53
+ 255
+
+
+
+
+
+
+
+
+
+
+
+
+ icon:${installer:sys.installerApplicationMode}_header.png
+
+
+
+
+ 0
+ 5
+ 1
+ 1
+
+
+
+
+ 0
+ 20
+ 0
+ 10
+
+
+
+
+ backgroundColor
+ foregroundColor
+ imageAnchor
+ imageFile
+ imageOverlap
+
+
+
+
+
+
+
+
+ sys.installationDir
+
+
+ context.getBooleanVariable("sys.streamlinedInstallation")
+
+
+
+
+
+ ${form:welcomeMessage}
+
+ !context.isConsole()
+
+
+
+
+
+ String message = context.getMessage("ConsoleWelcomeLabel", context.getApplicationName());
+return console.askOkCancel(message, true);
+
+
+
+
+
+
+
+
+
+
+ streamlinedInstallationStrategy
+
+
+
+
+ ${i18n:ClickNext}
+
+
+
+
+
+
+
+
+ ${i18n:LicenseLabel3}
+
+
+
+
+
+
+
+ en
+
+ ${compiler:installer:mediaRoot}/server/setup/docs/LICENSE.txt
+
+
+
+
+
+ license
+
+
+ textSource
+ displayedText
+ displayedTextFile
+ variableName
+ acceptInitiallySelected
+ readAllRequired
+
+
+
+
+
+
+
+
+ ${i18n:InfoBeforeClickLabel}
+
+ !context.isConsole()
+
+
+
+
+
+
+ en
+
+ ${compiler:installer:mediaRoot}/tools/install4j/readme.html
+
+
+
+
+
+
+
+ textSource
+ displayedText
+ displayedTextFile
+ variableName
+
+
+
+
+
+
+ console.waitForEnter();
+return true;
+
+
+
+
+
+
+
+
+ !context.getBooleanVariable("sys.streamlinedInstallation")
+
+
+
+
+ sys.installationDir
+
+
+ context.getVariable("sys.responseFile") == null
+
+
+
+
+
+ ${i18n:SelectDirLabel(${compiler:sys.fullName})}
+
+
+
+
+
+
+
+ suggestAppDir
+ validateApplicationId
+ existingDirWarning
+ checkWritable
+ manualEntryAllowed
+ checkFreeSpace
+ showRequiredDiskSpace
+ showFreeDiskSpace
+ allowSpacesOnUnix
+ validationScript
+ standardValidation
+
+
+
+
+
+
+
+
+ ${i18n:SelectComponentsLabel2}
+
+ !context.isConsole()
+
+
+
+
+
+
+ selectionChangedScript
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${installer:sys.programGroupName}
+ ${installer:sys.symlinkDir}
+
+ !context.getBooleanVariable("sys.programGroupDisabled")
+
+
+
+ ${compiler:sys.fullName} ${compiler:sys.version}
+
+
+
+
+ 25
+ com.oie.oieservice
+
+
+
+
+
+
+ ${i18n:WizardPreparing}
+
+
+
+
+
+
+
+
+ ${form:finishedMessage}
+
+
+
+
+
+
+
+
+ ${i18n:UninstallerMenuEntry(${compiler:sys.fullName})}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 25
+
+
+
+
+
+
+ ${form:welcomeMessage}
+
+ !context.isConsole()
+
+
+
+
+
+ String message = context.getMessage("ConfirmUninstall", context.getApplicationName());
+return console.askYesNo(message, true);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${i18n:UninstallerPreparing}
+
+
+
+
+
+
+
+
+
+ ${form:successMessage}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tools/install4j/readme.html b/tools/install4j/readme.html
index 8c25371a1..339d6ffef 100644
--- a/tools/install4j/readme.html
+++ b/tools/install4j/readme.html
@@ -1,26 +1,26 @@
- Open Integration Engine
- Open Integration Engine
+ Open Integration Engine ${compiler:sys.version}
- This installer sets up a fully functional version of the engine with minimal user input.
+ This installer sets up a fully functional version of the engine with minimal user input,
+ or upgrades an existing installation.
The installer requires administrator permissions to run and install services.
Notes
- Native services are installed for all supported platforms and are configured to start automatically.
- macOS users: A reboot will automatically start the service.
+ Native services are installed for all supported platforms and are configured to start automatically.
+ macOS users: A reboot will automatically start the service.
- Default settings from mirth.properties are applied automatically; the installer does not prompt for customization.
+ A new installation uses the default configuration files in the conf directory;
+ the installer does not prompt for customization.
+ This includes ports (default: 8080 and 8443), log and app data paths, and password requirements.
- This includes ports (default: 8080 and 8443), log and app data paths, and password requirements.
- Previous installations are not preserved, though runtime-created directories
- (e.g., appdata)
- are retained across installs.
+ An upgrade replaces the program files from the previous installation.
+ Files in the conf directory are kept and are not updated with new defaults.
+ Directories created at runtime, such as appdata, are also kept.
-