From dcceb7b719298c8ae96abccd74512f01a02385b5 Mon Sep 17 00:00:00 2001 From: Mike Date: Wed, 29 Jul 2026 09:34:04 +0200 Subject: [PATCH] Fix Java 8 resolution for MfApi restart, refresh targets after settings, and copy errors to clipboard. Co-authored-by: Cursor --- ZA.CoreService.ESBCertificateManager/Form1.cs | 52 +++++-- .../Models/AppSettings.cs | 2 +- .../Models/DatabaseSonicConnection.cs | 12 +- .../Services/CopyableErrorDialog.cs | 135 ++++++++++++++++++ .../Services/JavaRuntimeLocator.cs | 121 ++++++++++++++++ .../Services/RestartExecutor.cs | 4 +- .../Services/RuntimeEnviromentValidator.cs | 11 +- .../Services/SonicCredentialTester.cs | 10 +- .../Services/SonicMfApiExecutor.cs | 89 +++--------- .../Setup/SetupWizardForm.cs | 17 ++- .../Tools/SonicMfContainerTool$Args.class | Bin 1876 -> 1876 bytes .../Tools/SonicMfContainerTool.class | Bin 9577 -> 8167 bytes .../Tools/SonicMfContainerTool.jar | Bin 6550 -> 5754 bytes .../appsettings.json | 2 +- 14 files changed, 358 insertions(+), 97 deletions(-) create mode 100644 ZA.CoreService.ESBCertificateManager/Services/CopyableErrorDialog.cs create mode 100644 ZA.CoreService.ESBCertificateManager/Services/JavaRuntimeLocator.cs diff --git a/ZA.CoreService.ESBCertificateManager/Form1.cs b/ZA.CoreService.ESBCertificateManager/Form1.cs index 4a96ce5..a588088 100644 --- a/ZA.CoreService.ESBCertificateManager/Form1.cs +++ b/ZA.CoreService.ESBCertificateManager/Form1.cs @@ -172,13 +172,12 @@ namespace ZA.CoreService.ESBCertificateManager coordinator, isSettingsMode: true); - if (settingsForm.ShowDialog(this) != DialogResult.OK) - { - return; - } + // Nach dem Schließen immer neu laden: + // Pfade/Container können auch ohne „Profil übernehmen“ angelegt worden sein. + _ = settingsForm.ShowDialog(this); SetStatus( - "Einstellungen übernommen. Anwendung wird aktualisiert ...", + "Einstellungen geschlossen. Ziele werden aktualisiert ...", isError: false); await InitializeApplicationAsync(); @@ -1938,6 +1937,24 @@ namespace ZA.CoreService.ESBCertificateManager { UpdateToNextStep(4); } + else + { + string details = string.Join( + Environment.NewLine + Environment.NewLine, + runResult.TargetResults + .Where(result => !result.Success) + .Select(result => + $"{result.TargetName}: {result.StatusText}" + + Environment.NewLine + + (result.Detail ?? string.Empty))); + + CopyableErrorDialog.Show( + this, + "Neustart fehlgeschlagen (MfApi)", + string.IsNullOrWhiteSpace(details) + ? "Neustart fehlgeschlagen (keine Details)." + : details); + } } catch (OperationCanceledException) { @@ -1946,7 +1963,10 @@ namespace ZA.CoreService.ESBCertificateManager catch (Exception ex) { SetStatus($"Neustart fehlgeschlagen: {ex.Message}", isError: true); - MessageBox.Show(this, ex.Message, "ESB neu starten", MessageBoxButtons.OK, MessageBoxIcon.Error); + CopyableErrorDialog.Show( + this, + "Neustart fehlgeschlagen (MfApi)", + ex.ToString()); } finally { @@ -2051,6 +2071,20 @@ namespace ZA.CoreService.ESBCertificateManager SetStatus( "Deployment für mindestens ein Ziel fehlgeschlagen.", isError: true); + + string details = string.Join( + Environment.NewLine + Environment.NewLine, + runResult.TargetResults + .Where(result => !result.Success) + .Select(result => + $"{result.TargetName}: {result.StatusText}" + + Environment.NewLine + + (result.Detail ?? string.Empty))); + + CopyableErrorDialog.Show( + this, + "Deployment fehlgeschlagen", + details); } } catch (OperationCanceledException) @@ -2063,12 +2097,10 @@ namespace ZA.CoreService.ESBCertificateManager $"Deployment fehlgeschlagen: {ex.Message}", isError: true); - MessageBox.Show( + CopyableErrorDialog.Show( this, - ex.Message, "Deployment fehlgeschlagen", - MessageBoxButtons.OK, - MessageBoxIcon.Error); + ex.ToString()); } finally { diff --git a/ZA.CoreService.ESBCertificateManager/Models/AppSettings.cs b/ZA.CoreService.ESBCertificateManager/Models/AppSettings.cs index 416ab06..97ae614 100644 --- a/ZA.CoreService.ESBCertificateManager/Models/AppSettings.cs +++ b/ZA.CoreService.ESBCertificateManager/Models/AppSettings.cs @@ -46,7 +46,7 @@ public sealed class DatabaseSettings public sealed class RuntimeSettings { public string JavaExecutablePath { get; set; } = - @"Runtime\bin\java.exe"; + @"C:\Program Files (x86)\Java\jre1.8.0_481\bin\java.exe"; public string SonicClientLibraryPath { get; set; } = @"Runtime\SonicClient\lib"; diff --git a/ZA.CoreService.ESBCertificateManager/Models/DatabaseSonicConnection.cs b/ZA.CoreService.ESBCertificateManager/Models/DatabaseSonicConnection.cs index b7fdbd8..1482a8e 100644 --- a/ZA.CoreService.ESBCertificateManager/Models/DatabaseSonicConnection.cs +++ b/ZA.CoreService.ESBCertificateManager/Models/DatabaseSonicConnection.cs @@ -72,10 +72,18 @@ public sealed class DatabaseSonicConnection "Bitte die Einstellungen öffnen und ein Benutzerprofil hinterlegen."); } - string javaExecutablePath = - PathResolver.ResolvePath( + string? javaExecutablePath = + JavaRuntimeLocator.Resolve( runtimeSettings.JavaExecutablePath); + if (javaExecutablePath is null) + { + throw new InvalidOperationException( + "Java 8 wurde nicht gefunden. " + + "Bitte Runtime:JavaExecutablePath auf " + + @"jre1.8*\bin\java.exe setzen."); + } + string sonicClientLibraryPath = PathResolver.ResolvePath( runtimeSettings.SonicClientLibraryPath); diff --git a/ZA.CoreService.ESBCertificateManager/Services/CopyableErrorDialog.cs b/ZA.CoreService.ESBCertificateManager/Services/CopyableErrorDialog.cs new file mode 100644 index 0000000..6227fd3 --- /dev/null +++ b/ZA.CoreService.ESBCertificateManager/Services/CopyableErrorDialog.cs @@ -0,0 +1,135 @@ +namespace ZA.CoreService.ESBCertificateManager.Services; + +/// +/// Fehlerdialog mit Text und Button „In Zwischenablage kopieren“. +/// Kopiert den Fehlertext beim Öffnen automatisch. +/// +public static class CopyableErrorDialog +{ + public static void Show( + IWin32Window? owner, + string title, + string details) + { + string text = string.IsNullOrWhiteSpace(details) + ? "(keine Fehlerdetails)" + : details.Trim(); + + TryCopy(text); + + using Form dialog = new() + { + Text = title, + StartPosition = FormStartPosition.CenterParent, + FormBorderStyle = FormBorderStyle.FixedDialog, + MaximizeBox = false, + MinimizeBox = false, + ShowInTaskbar = false, + ClientSize = new Size(640, 420), + BackColor = Color.FromArgb(16, 28, 48), + ForeColor = Color.FromArgb(241, 245, 249), + Font = new Font("Segoe UI", 9.5f) + }; + + Label hint = new() + { + Text = + "Fehlertext ist in der Zwischenablage — " + + "einfach hier einfügen (Strg+V).", + Location = new Point(16, 12), + AutoSize = false, + Size = new Size(608, 28), + ForeColor = Color.FromArgb(208, 171, 57) + }; + + TextBox box = new() + { + Location = new Point(16, 44), + Size = new Size(608, 310), + Multiline = true, + ReadOnly = true, + ScrollBars = ScrollBars.Both, + WordWrap = false, + Text = text, + BackColor = Color.FromArgb(12, 22, 38), + ForeColor = Color.FromArgb(241, 245, 249), + BorderStyle = BorderStyle.FixedSingle, + Font = new Font("Consolas", 9f) + }; + + Label copyStatus = new() + { + Text = "✓ In Zwischenablage kopiert", + Location = new Point(16, 368), + AutoSize = true, + ForeColor = Color.FromArgb(90, 200, 140) + }; + + Button btnCopy = new() + { + Text = "Nochmal kopieren", + Location = new Point(280, 362), + Size = new Size(160, 36), + FlatStyle = FlatStyle.Flat, + BackColor = Color.FromArgb(39, 52, 73), + ForeColor = Color.FromArgb(241, 245, 249), + Cursor = Cursors.Hand + }; + + btnCopy.FlatAppearance.BorderColor = + Color.FromArgb(36, 74, 117); + + btnCopy.Click += (_, _) => + { + if (TryCopy(text)) + { + copyStatus.Text = "✓ Erneut kopiert"; + copyStatus.ForeColor = + Color.FromArgb(90, 200, 140); + } + else + { + copyStatus.Text = "Kopieren fehlgeschlagen"; + copyStatus.ForeColor = + Color.FromArgb(220, 100, 100); + } + }; + + Button btnClose = new() + { + Text = "Schließen", + Location = new Point(456, 362), + Size = new Size(168, 36), + FlatStyle = FlatStyle.Flat, + BackColor = Color.FromArgb(0, 110, 182), + ForeColor = Color.White, + Cursor = Cursors.Hand, + DialogResult = DialogResult.OK + }; + + btnClose.FlatAppearance.BorderSize = 0; + + dialog.Controls.Add(hint); + dialog.Controls.Add(box); + dialog.Controls.Add(copyStatus); + dialog.Controls.Add(btnCopy); + dialog.Controls.Add(btnClose); + dialog.AcceptButton = btnClose; + dialog.CancelButton = btnClose; + + dialog.ShowDialog(owner); + } + + private static bool TryCopy(string text) + { + try + { + Clipboard.SetText(text); + return true; + } + catch + { + return false; + } + } +} diff --git a/ZA.CoreService.ESBCertificateManager/Services/JavaRuntimeLocator.cs b/ZA.CoreService.ESBCertificateManager/Services/JavaRuntimeLocator.cs new file mode 100644 index 0000000..1352b63 --- /dev/null +++ b/ZA.CoreService.ESBCertificateManager/Services/JavaRuntimeLocator.cs @@ -0,0 +1,121 @@ +namespace ZA.CoreService.ESBCertificateManager.Services; + +/// +/// Findet eine nutzbare Java-8-Runtime für Sonic MfApi. +/// +public static class JavaRuntimeLocator +{ + public static string? Resolve( + string? configuredPath = null) + { + foreach (string? candidate in EnumerateCandidates(configuredPath)) + { + if (string.IsNullOrWhiteSpace(candidate)) + { + continue; + } + + string? resolved = TryResolveExisting(candidate); + + if (resolved is not null) + { + return resolved; + } + } + + return null; + } + + private static IEnumerable EnumerateCandidates( + string? configuredPath) + { + if (!string.IsNullOrWhiteSpace(configuredPath)) + { + yield return configuredPath.Trim(); + } + + yield return + @"C:\Program Files (x86)\Java\jre1.8.0_481\bin\java.exe"; + + yield return + @"C:\Program Files (x86)\Java\jre1.8.0_501\bin\java.exe"; + + yield return + @"C:\Program Files\Java\jre1.8.0_481\bin\java.exe"; + + yield return + @"C:\Program Files (x86)\Common Files\Oracle\Java\java8path\java.exe"; + + foreach (string root in new[] + { + @"C:\Program Files (x86)\Java", + @"C:\Program Files\Java" + }) + { + if (!Directory.Exists(root)) + { + continue; + } + + foreach (string directory in Directory + .EnumerateDirectories(root, "jre1.8*") + .OrderByDescending(path => path, StringComparer.OrdinalIgnoreCase)) + { + yield return Path.Combine(directory, "bin", "java.exe"); + } + + foreach (string directory in Directory + .EnumerateDirectories(root, "jdk1.8*") + .OrderByDescending(path => path, StringComparer.OrdinalIgnoreCase)) + { + yield return Path.Combine(directory, "bin", "java.exe"); + } + } + + string? javaHome = + Environment.GetEnvironmentVariable("JAVA_HOME"); + + if (!string.IsNullOrWhiteSpace(javaHome)) + { + yield return Path.Combine( + javaHome.Trim(), + "bin", + "java.exe"); + } + + string? jreHome = + Environment.GetEnvironmentVariable("JRE_HOME"); + + if (!string.IsNullOrWhiteSpace(jreHome)) + { + yield return Path.Combine( + jreHome.Trim(), + "bin", + "java.exe"); + } + + yield return "java.exe"; + } + + private static string? TryResolveExisting(string candidate) + { + try + { + string resolved = + Path.IsPathRooted(candidate) + ? Path.GetFullPath(candidate) + : Path.GetFullPath( + Path.Combine( + AppContext.BaseDirectory, + candidate)); + + return File.Exists(resolved) + ? resolved + : null; + } + catch + { + return null; + } + } +} diff --git a/ZA.CoreService.ESBCertificateManager/Services/RestartExecutor.cs b/ZA.CoreService.ESBCertificateManager/Services/RestartExecutor.cs index 41e9297..00b0896 100644 --- a/ZA.CoreService.ESBCertificateManager/Services/RestartExecutor.cs +++ b/ZA.CoreService.ESBCertificateManager/Services/RestartExecutor.cs @@ -27,7 +27,9 @@ public sealed class RestartExecutor if (connection is null) { return (false, "Sonic-Verbindung nicht gefunden", - $"Ziel '{target.Name}': SonicConnection '{target.SonicConnectionName}' fehlt in appsettings."); + $"Ziel '{target.Name}': SonicConnection '{target.SonicConnectionName}' " + + "ist nicht geladen. Meist fehlt ein Benutzerprofil " + + "(Einstellungen → Profil anlegen und übernehmen)."); } using SonicManagementClient client = diff --git a/ZA.CoreService.ESBCertificateManager/Services/RuntimeEnviromentValidator.cs b/ZA.CoreService.ESBCertificateManager/Services/RuntimeEnviromentValidator.cs index 767d781..a65c355 100644 --- a/ZA.CoreService.ESBCertificateManager/Services/RuntimeEnviromentValidator.cs +++ b/ZA.CoreService.ESBCertificateManager/Services/RuntimeEnviromentValidator.cs @@ -11,8 +11,8 @@ public sealed class RuntimeEnvironmentValidator { List issues = []; - string javaExecutablePath = - PathResolver.ResolvePath( + string? javaExecutablePath = + JavaRuntimeLocator.Resolve( settings.JavaExecutablePath); string sonicClientLibraryPath = @@ -21,10 +21,11 @@ public sealed class RuntimeEnvironmentValidator string javaVersion = string.Empty; - if (!File.Exists(javaExecutablePath)) + if (javaExecutablePath is null) { issues.Add( - $"Java wurde nicht gefunden: {javaExecutablePath}"); + "Java 8 wurde nicht gefunden. " + + "Runtime:JavaExecutablePath oder installierte jre1.8* prüfen."); } else { @@ -80,7 +81,7 @@ public sealed class RuntimeEnvironmentValidator return new RuntimeValidationResult { IsValid = issues.Count == 0, - JavaExecutablePath = javaExecutablePath, + JavaExecutablePath = javaExecutablePath ?? string.Empty, SonicClientLibraryPath = sonicClientLibraryPath, JavaVersion = javaVersion, Issues = issues diff --git a/ZA.CoreService.ESBCertificateManager/Services/SonicCredentialTester.cs b/ZA.CoreService.ESBCertificateManager/Services/SonicCredentialTester.cs index 7b5606d..583fca4 100644 --- a/ZA.CoreService.ESBCertificateManager/Services/SonicCredentialTester.cs +++ b/ZA.CoreService.ESBCertificateManager/Services/SonicCredentialTester.cs @@ -44,8 +44,8 @@ public sealed class SonicCredentialTester "Für den Verbindungstest fehlt ein Container."); } - string javaPath = - PathResolver.ResolvePath( + string? javaPath = + JavaRuntimeLocator.Resolve( _runtimeSettings.JavaExecutablePath); string libraryPath = @@ -55,10 +55,12 @@ public sealed class SonicCredentialTester string? toolsPath = ResolveToolsDirectory(); - if (!File.Exists(javaPath)) + if (javaPath is null) { return CredentialTestResult.Failed( - $"Java wurde nicht gefunden: {javaPath}"); + "Java 8 wurde nicht gefunden. " + + "Runtime:JavaExecutablePath prüfen " + + @"(z. B. C:\Program Files (x86)\Java\jre1.8.0_481\bin\java.exe)."); } if (!Directory.Exists(libraryPath)) diff --git a/ZA.CoreService.ESBCertificateManager/Services/SonicMfApiExecutor.cs b/ZA.CoreService.ESBCertificateManager/Services/SonicMfApiExecutor.cs index 2fa318a..d445da6 100644 --- a/ZA.CoreService.ESBCertificateManager/Services/SonicMfApiExecutor.cs +++ b/ZA.CoreService.ESBCertificateManager/Services/SonicMfApiExecutor.cs @@ -356,84 +356,35 @@ public sealed class SonicMfApiExecutor private string? ResolveJavaExe() { - foreach (string? candidate - in EnumerateJavaCandidates()) + // Explizite Verbindungs-Pfade zuerst, dann Java-8-Suche + // (Runtime\bin\java.exe fehlt oft; JAVA_HOME zeigt oft auf JDK 21). + string? fromConnection = JavaRuntimeLocator.Resolve( + !string.IsNullOrWhiteSpace(_connection.JavaPath) + ? _connection.JavaPath + : null); + + if (fromConnection is not null) { - if (string.IsNullOrWhiteSpace(candidate)) - { - continue; - } - - string resolvedCandidate; - - try - { - resolvedCandidate = - Path.IsPathRooted(candidate) - ? Path.GetFullPath(candidate) - : Path.GetFullPath( - Path.Combine( - AppContext.BaseDirectory, - candidate)); - } - catch - { - continue; - } - - if (File.Exists(resolvedCandidate)) - { - return resolvedCandidate; - } + return fromConnection; } - return null; - } - - private IEnumerable - EnumerateJavaCandidates() - { - if (!string.IsNullOrWhiteSpace( - _connection.JavaPath)) + if (!string.IsNullOrWhiteSpace(_connection.JavaHome)) { - yield return - _connection.JavaPath.Trim(); - } - - if (!string.IsNullOrWhiteSpace( - _connection.JavaHome)) - { - yield return Path.Combine( + string fromHome = Path.Combine( _connection.JavaHome.Trim(), "bin", "java.exe"); + + string? resolvedHome = + JavaRuntimeLocator.Resolve(fromHome); + + if (resolvedHome is not null) + { + return resolvedHome; + } } - string? javaHome = - Environment.GetEnvironmentVariable( - "JAVA_HOME"); - - if (!string.IsNullOrWhiteSpace(javaHome)) - { - yield return Path.Combine( - javaHome.Trim(), - "bin", - "java.exe"); - } - - string? jreHome = - Environment.GetEnvironmentVariable( - "JRE_HOME"); - - if (!string.IsNullOrWhiteSpace(jreHome)) - { - yield return Path.Combine( - jreHome.Trim(), - "bin", - "java.exe"); - } - - yield return "java.exe"; + return JavaRuntimeLocator.Resolve(); } private ( diff --git a/ZA.CoreService.ESBCertificateManager/Setup/SetupWizardForm.cs b/ZA.CoreService.ESBCertificateManager/Setup/SetupWizardForm.cs index ccc3aa1..4fdff3a 100644 --- a/ZA.CoreService.ESBCertificateManager/Setup/SetupWizardForm.cs +++ b/ZA.CoreService.ESBCertificateManager/Setup/SetupWizardForm.cs @@ -67,6 +67,15 @@ public sealed class SetupWizardForm : Form ShowPanel(_panelStatus, _navButtons[0]); Shown += async (_, _) => await RefreshAllAsync(); + + FormClosing += (_, e) => + { + // X-Button: in Einstellungen trotzdem als „geschlossen mit Änderungen möglich“ + if (_isSettingsMode && DialogResult == DialogResult.None) + { + DialogResult = DialogResult.OK; + } + }; } private void BuildShell() @@ -1138,10 +1147,10 @@ public sealed class SetupWizardForm : Form { if (_isSettingsMode) { - SetupCheckResult check = await _coordinator.CheckAsync(); - DialogResult = check.IsReady - ? DialogResult.OK - : DialogResult.Cancel; + // Katalog-Änderungen (Pfade/Container) sollen die Hauptansicht + // immer aktualisieren – unabhängig davon, ob das Profil schon „ready“ ist. + _ = await _coordinator.CheckAsync(); + DialogResult = DialogResult.OK; } else { diff --git a/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool$Args.class b/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool$Args.class index 729a334072f764f11a838e3d8e57756b3181a3c5..b205b3a68fd3b3ac28b12915d6f5410cde6f9474 100644 GIT binary patch delta 216 zcmcb@cZF|52@4zJUj`N?*2z^YUjsQAIGDH@1etgl#FzvaWSImR6qtk<)R;sV^q9mL zjF==CoSCE;0+?hN5}D)}@|YAD>Y0=ndYDug<}#@>tYXq+*v+KFaEM8l;RI06IVQu& z2UxwC82?V@Wzz)OBf!BBI9ZTQR7_+80|NsigAb5o1JVp&sUVQl80Io9W?03vlwmj13Wh^WD;Z7z^_*i` zJNW>sHxpCkWL`E+pgjT{41tpc*+j)eHZU+SFf#Z6Nj4zO0G0{@NlmU{698%GgJ}o> XYv9JFAr!3PFGK@ByCz7V6}uDwW56xT diff --git a/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.class b/ZA.CoreService.ESBCertificateManager/Tools/SonicMfContainerTool.class index 59a4fa6e38f7d61c47a3be901ca2d6a59c30a3bf..5e969e771cf85706bde494485b396d4bdb1954a5 100644 GIT binary patch literal 8167 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 delta 6146 zcmV+d82#t^ES572P)h>@3IG5I001pWkqjvUEl80!e*!E>k+?H|ZExFD6n^e)Qah=; zC0X0Okcx77vTiH1W3<@@Vd)F==vc=zT-OU3iCto6sNw@c0wJV<5JCthK!^zi z5J*F!tYT6>@Btw{Abt;;fOFGy%~ofUrE{KhpL6cH=f!{i`|CP@QM?oaM~8%ff*?8> z_UevZGN&)+9NRO0O14!!>p129$!gJM2z#Z9<oWRF@cH zg)7EYW29`@#Sz`Bmh9rVU@8i_1v6xBMi$nc3L?T9sJR=4n1Wrx&{303RNeKrOJc36V zB3sV0i&reuqYNfWcFB8+QcDfZi#wAt1{nHITO~U=WnH#jDJO|<6|F_f9u6agAqlF2 zG#+Q@@w=HSYM7?wy8UCB3`1|qC*^q=!&K9g`qU+Tb|#;@G&ia1=Vs5G2qS}o60!;o zVf3Da^%d8DvnrHu(ef<&D#L(Z;O!onMs~KhY zzQi}mH9oW;gK8DjG-{-br-@D~HCe_KLzkxA9RnFBXeu z$dzeDEoxUlM4;*6H1dE%lGcedE;g+pcQs|CDML-!-IVmFASrf$mIVx_2@MirB)imG z*sn%^CRV|IBFIo^Qo∾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 Ut^||51RRrO77zw*7ytkO08Ap)CIA2c diff --git a/ZA.CoreService.ESBCertificateManager/appsettings.json b/ZA.CoreService.ESBCertificateManager/appsettings.json index ea9755d..ae23177 100644 --- a/ZA.CoreService.ESBCertificateManager/appsettings.json +++ b/ZA.CoreService.ESBCertificateManager/appsettings.json @@ -6,7 +6,7 @@ "ConnectionString": "Server=VWEBDEV01;Database=EsbZertifikatManager;Integrated Security=True;Encrypt=True;Column Encryption Setting=Enabled;Application Name=ZA.CoreService.ESBCertificateManager;TrustServerCertificate=True;" }, "Runtime": { - "JavaExecutablePath": "Runtime\\bin\\java.exe", + "JavaExecutablePath": "C:\\Program Files (x86)\\Java\\jre1.8.0_481\\bin\\java.exe", "SonicClientLibraryPath": "Runtime\\SonicClient\\lib", "SetupCompleted": true },