diff --git a/beast-base/pom.xml b/beast-base/pom.xml index bef1e76..22d20df 100644 --- a/beast-base/pom.xml +++ b/beast-base/pom.xml @@ -186,6 +186,26 @@ + + + org.apache.maven.plugins + maven-assembly-plugin + 3.7.1 + + + package-zip + package + single + + BEAST.base.package.v${project.version} + false + + src/assembly/package.xml + + + + + diff --git a/beast-base/src/assembly/package.xml b/beast-base/src/assembly/package.xml new file mode 100644 index 0000000..f09968b --- /dev/null +++ b/beast-base/src/assembly/package.xml @@ -0,0 +1,33 @@ + + + package + + zip + + false + + + + ${project.basedir}/../version.xml + . + + + + + + lib + true + runtime + + io.github.compevol:beast-pkgmgmt + + + + diff --git a/beast-fx/pom.xml b/beast-fx/pom.xml index 1f251d3..0886aa2 100644 --- a/beast-fx/pom.xml +++ b/beast-fx/pom.xml @@ -124,6 +124,42 @@ org.apache.maven.plugins maven-resources-plugin + + + embed-version-xml-in-jar + generate-resources + copy-resources + + ${project.build.outputDirectory} + + + ${project.basedir} + + version.xml + + + + + + + + copy-version-xml + generate-resources + copy-resources + + ${project.build.directory} + + + ${project.basedir} + + version.xml + + + + + copy-fxtemplates-to-test-classes @@ -198,6 +234,26 @@ + + + org.apache.maven.plugins + maven-assembly-plugin + 3.7.1 + + + package-zip + package + single + + BEAST.app.package.v${project.version} + false + + src/assembly/package.xml + + + + + diff --git a/beast-fx/src/assembly/package.xml b/beast-fx/src/assembly/package.xml new file mode 100644 index 0000000..bdba2ff --- /dev/null +++ b/beast-fx/src/assembly/package.xml @@ -0,0 +1,41 @@ + + + package + + zip + + false + + + + ${project.basedir}/version.xml + . + + + + + + lib + true + runtime + + io.github.compevol:beast-fx + + + + diff --git a/beast-fx/version.xml b/beast-fx/version.xml new file mode 100644 index 0000000..d705ec6 --- /dev/null +++ b/beast-fx/version.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/beast-pkgmgmt/src/main/java/beast/pkgmgmt/PackageManager.java b/beast-pkgmgmt/src/main/java/beast/pkgmgmt/PackageManager.java index 30e6a50..7097dbe 100644 --- a/beast-pkgmgmt/src/main/java/beast/pkgmgmt/PackageManager.java +++ b/beast-pkgmgmt/src/main/java/beast/pkgmgmt/PackageManager.java @@ -746,47 +746,17 @@ public static void loadExternalJarsEvenIfAlreadyLoaded() throws IOException { skippedDirs = stillSkippedDirs; } - // Re-run addInstalledPackages() so that packages loaded via plugin layers in the steps - // above are reflected in the package map before the dependency check below. + // Re-run addInstalledPackages() so that any packages installed from the queued + // install list (processInstallList) above are reflected in the package map before + // the dependency check below. addInstalledPackages(packages); - // Safety net: if BEAST.app is still somehow not marked installed (e.g. a broken - // distribution where BeastLauncher did not bootstrap it into ~/.beast/2.8/), attempt - // a one-time network auto-install. Under normal deployment this block is never entered - // because addInstalledPackages() always marks BEAST.app installed synthetically. - Exception autoInstallFailure = null; - Package beastAppPkg = packages.get(BEAST_APP_PACKAGE_NAME); - if (beastAppPkg == null || !beastAppPkg.isInstalled()) { - try { - addAvailablePackages(packages); - beastAppPkg = packages.get(BEAST_APP_PACKAGE_NAME); - if (beastAppPkg != null && beastAppPkg.isAvailable()) { - Map toInstall = new HashMap<>(); - toInstall.put(beastAppPkg, beastAppPkg.getLatestVersion()); - installPackages(toInstall, false, null); - addInstalledPackages(packages); // refresh map with newly installed package - beastAppPkg = packages.get(BEAST_APP_PACKAGE_NAME); - } - } catch (Exception e) { - autoInstallFailure = e; - System.err.println("Warning: could not auto-install " + BEAST_APP_PACKAGE_NAME + ": " + e); - } - } - - // Dependency check runs here — after all Maven and ZIP packages are loaded, all plugin - // layers are registered, and addInstalledPackages() has been re-run — so the package map - // is complete. Running earlier would flag valid dependencies as missing. Placed before the - // BEAST.app hard-fail so all dependency warnings are visible even in a broken installation. + // Dependency check runs here -- after all Maven and ZIP packages are loaded and all + // plugin layers are registered -- so the package map is complete. Running it earlier + // would flag valid dependencies (resolved via plugin layers) as missing. Utils6.logToSplashScreen("PackageManager::checkInstalledDependencies"); checkInstalledDependencies(packages); - // Hard-fail after dependency check so all warnings are visible first. - if (beastAppPkg == null || !beastAppPkg.isInstalled()) { - throw new RuntimeException(BEAST_APP_PACKAGE_NAME + " is required but is not installed " - + "and could not be auto-installed. Run: packagemanager -add " + BEAST_APP_PACKAGE_NAME, - autoInstallFailure); - } - externalJarsLoaded = true; Utils6.logToSplashScreen("PackageManager::Done"); } // loadExternalJars @@ -924,14 +894,20 @@ public static boolean createAndRegisterModuleLayer(List jarPaths, String packageVersion, String description) { try { ModuleFinder finder = ModuleFinder.of(jarPaths.toArray(Path[]::new)); - ModuleLayer parent = ModuleLayer.boot(); - Set availableModules = parent.modules().stream() + + // Parents for the new layer: the boot layer plus every previously + // registered plugin layer, so a package can read modules provided by + // other packages (e.g. beast.fx -> beast.base once the core modules + // leave the boot layer). The skip/retry loop in loadExternalJars loads + // dependencies before their dependents. + List parentLayers = new ArrayList<>(); + parentLayers.add(ModuleLayer.boot()); + parentLayers.addAll(BEASTClassLoader.getPluginLayers()); + + Set availableModules = parentLayers.stream() + .flatMap(l -> l.modules().stream()) .map(Module::getName) .collect(Collectors.toCollection(HashSet::new)); - // Also include modules from already-loaded plugin layers - for (ModuleLayer layer : BEASTClassLoader.getPluginLayers()) { - layer.modules().stream().map(Module::getName).forEach(availableModules::add); - } // Collect candidate modules (not already loaded) Set candidates = finder.findAll().stream() @@ -990,10 +966,13 @@ public static boolean createAndRegisterModuleLayer(List jarPaths, .toList(); ModuleFinder filteredFinder = ModuleFinder.of(resolvableJars.toArray(Path[]::new)); - Configuration config = parent.configuration() - .resolveAndBind(filteredFinder, ModuleFinder.of(), resolvable); - ModuleLayer layer = parent.defineModulesWithOneLoader( - config, ClassLoader.getSystemClassLoader()); + List parentConfigs = parentLayers.stream() + .map(ModuleLayer::configuration) + .collect(Collectors.toList()); + Configuration config = Configuration.resolveAndBind( + filteredFinder, parentConfigs, ModuleFinder.of(), resolvable); + ModuleLayer layer = ModuleLayer.defineModulesWithOneLoader( + config, parentLayers, ClassLoader.getSystemClassLoader()).layer(); BEASTClassLoader.registerPluginLayer(layer, services); return skipped.isEmpty(); } catch (Exception e) { diff --git a/beast-pkgmgmt/src/main/java/beast/pkgmgmt/launcher/BeastLauncher.java b/beast-pkgmgmt/src/main/java/beast/pkgmgmt/launcher/BeastLauncher.java index c6f910c..f5872cb 100644 --- a/beast-pkgmgmt/src/main/java/beast/pkgmgmt/launcher/BeastLauncher.java +++ b/beast-pkgmgmt/src/main/java/beast/pkgmgmt/launcher/BeastLauncher.java @@ -18,6 +18,8 @@ import java.util.Set; import java.util.jar.JarEntry; import java.util.jar.JarInputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; /** * Bootstrap launcher for BEAST. @@ -189,6 +191,128 @@ private static void copyFileUsingStream(File source, File dest) throws IOExcepti } } + /** + * Seed a bundled core package (e.g. BEAST.base, BEAST.app) into the user + * package directory. The application bundle ships these as full package zips + * under {@code /packages/}. On first run -- or whenever the bundled + * version is newer than the copy already in the user dir -- the zip is + * extracted into {@code //}. A user copy that + * is the same or newer (e.g. an in-place upgrade applied by the package + * manager) is left untouched, so upgrades survive application relaunches. + * + * @return true if a bundled package zip was found and handled (callers can + * then skip the legacy single-jar seeding); false if no bundled zip + * exists (e.g. running from an IDE or a developer build). + */ + static boolean seedBundledPackage(String packageName) { + pathDelimiter = isWindows() ? "\\\\" : "/"; + try { + File bundledZip = findBundledPackageZip(packageName); + if (bundledZip == null) { + return false; + } + double bundledVersion = parseVersion(readVersionFromZip(bundledZip)); + + File pkgDir = new File(getPackageUserDir() + pathDelimiter + packageName); + File userVersionFile = new File(pkgDir, "version.xml"); + if (userVersionFile.exists()) { + double userVersion = parseVersion(readVersion(new FileReader(userVersionFile))); + if (userVersion >= bundledVersion) { + // user dir already holds a same-or-newer copy -- keep it + return true; + } + // bundled copy is newer (app was updated): replace the stale lib + File libDir = new File(pkgDir, "lib"); + if (libDir.exists()) { + deleteDir(libDir); + } + } + + if (!pkgDir.exists() && !pkgDir.mkdirs()) { + return false; + } + PackageManager.doUnzip(bundledZip.getAbsolutePath(), pkgDir.getAbsolutePath()); + return true; + } catch (Exception e) { + // never let seeding hold up launch of BEAST & friends + e.printStackTrace(); + return false; + } + } + + /** + * Locate a bundled package zip (named {@code .package*.zip}) by + * walking up from the launcher jar looking for a {@code packages} directory. + * Returns null when none is found (developer/IDE runs). + */ + static private File findBundledPackageZip(String packageName) throws UnsupportedEncodingException { + BeastLauncher clu = new BeastLauncher(); + String launcherJar = clu.getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); + launcherJar = URLDecoder.decode(launcherJar, "UTF-8"); + File dir = new File(launcherJar).getParentFile(); + while (dir != null) { + File packagesDir = new File(dir, "packages"); + if (packagesDir.isDirectory()) { + File[] matches = packagesDir.listFiles((d, name) -> + name.startsWith(packageName + ".package") && name.endsWith(".zip")); + if (matches != null && matches.length > 0) { + return matches[0]; + } + } + dir = dir.getParentFile(); + } + return null; + } + + /** Read the version="x.y.z" attribute from a package zip's version.xml entry. */ + static private String readVersionFromZip(File zip) throws IOException { + try (ZipFile zf = new ZipFile(zip)) { + ZipEntry entry = zf.getEntry("version.xml"); + if (entry == null) { + return "0.0.0"; + } + return readVersion(new InputStreamReader(zf.getInputStream(entry))); + } + } + + /** Extract the value of the first version="..." (or version='...') attribute. */ + static private String readVersion(Reader reader) throws IOException { + StringBuilder buf = new StringBuilder(); + try (BufferedReader fin = new BufferedReader(reader)) { + String line; + while ((line = fin.readLine()) != null) { + buf.append(line).append(' '); + if (buf.indexOf("version=") >= 0) { + break; + } + } + } + String s = buf.toString(); + int start = s.indexOf("version="); + if (start < 0) { + return "0.0.0"; + } + char quote = s.charAt(start + 8); + int from = start + 9; + int end = s.indexOf(quote, from); + return end < 0 ? "0.0.0" : s.substring(from, end); + } + + /** Recursively delete a directory tree. */ + static private void deleteDir(File dir) { + File[] files = dir.listFiles(); + if (files != null) { + for (File f : files) { + if (f.isDirectory()) { + deleteDir(f); + } else { + f.delete(); + } + } + } + dir.delete(); + } + private static boolean checkForBEAST(File jarDir, String packageName) throws IOException { //System.err.println("Checking out " + jarDir.getAbsolutePath()); boolean foundOne = false; @@ -311,8 +435,16 @@ private static double parseVersion(String versionString) { * @return Class path string for main BEAST process, enclosed in literal quotes. */ public static String getPath(boolean useStrictVersions, String beastFile) throws NoSuchMethodException, SecurityException, ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException { - installBEASTPackage("BEAST.base", false); - installBEASTPackage("BEAST.app", false); + // Seed the bundled core packages into the user package dir. In an installed + // application these extract /packages/.package*.zip so the package + // manager can upgrade them in place; in developer/IDE runs no bundled zip + // exists, so fall back to the legacy single-jar seeding. + if (!seedBundledPackage("BEAST.base")) { + installBEASTPackage("BEAST.base", false); + } + if (!seedBundledPackage("BEAST.app")) { + installBEASTPackage("BEAST.app", false); + } PackageManager.initialise(); diff --git a/beast-pkgmgmt/src/test/java/beast/pkgmgmt/CorePackagesInstalledTest.java b/beast-pkgmgmt/src/test/java/beast/pkgmgmt/CorePackagesInstalledTest.java new file mode 100644 index 0000000..db26a48 --- /dev/null +++ b/beast-pkgmgmt/src/test/java/beast/pkgmgmt/CorePackagesInstalledTest.java @@ -0,0 +1,31 @@ +package beast.pkgmgmt; + +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Regression test for issue #94: a package depending on BEAST.app failed to + * resolve because BEAST.app was never registered as an installed package. + * addInstalledPackages() must register both core packages (BEAST.base and + * BEAST.app) at the running version so the dependency resolver knows them. + */ +public class CorePackagesInstalledTest { + + @Test + public void corePackagesAreRegisteredAsInstalled() { + Map packageMap = new HashMap<>(); + PackageManager.addInstalledPackages(packageMap); + + for (String name : new String[] {PackageManager.BEAST_BASE_PACKAGE_NAME, + PackageManager.BEAST_APP_PACKAGE_NAME}) { + assertTrue(packageMap.containsKey(name), + name + " should be present in the package map"); + assertTrue(packageMap.get(name).isInstalled(), + name + " should be marked as installed"); + } + } +} diff --git a/beast-pkgmgmt/src/test/java/beast/pkgmgmt/ModuleLayerCrossDependencyTest.java b/beast-pkgmgmt/src/test/java/beast/pkgmgmt/ModuleLayerCrossDependencyTest.java new file mode 100644 index 0000000..8771cdc --- /dev/null +++ b/beast-pkgmgmt/src/test/java/beast/pkgmgmt/ModuleLayerCrossDependencyTest.java @@ -0,0 +1,105 @@ +package beast.pkgmgmt; + +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.jar.JarEntry; +import java.util.jar.JarOutputStream; +import java.util.spi.ToolProvider; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Verifies that PackageManager.createAndRegisterModuleLayer() can resolve a + * package whose module dependency lives in another plugin layer (not the boot + * layer). This is the cross-layer behaviour required before beast.base/beast.fx + * can be moved off the boot module path. Under the previous boot-only-parent + * code the dependent package would fail to resolve. + * + * Two minimal modular jars are generated on the fly: mptestplugin requires + * mptestbase. mptestbase is loaded into its own layer first, then mptestplugin + * must resolve against that layer. + */ +public class ModuleLayerCrossDependencyTest { + + @Test + public void dependentPackageResolvesAgainstAnotherPluginLayer() throws Exception { + ToolProvider javac = ToolProvider.findFirst("javac").orElse(null); + Assumptions.assumeTrue(javac != null, "no javac tool available - skipping"); + + Path work = Files.createTempDirectory("mp-layer-test"); + + Path baseJar = buildModuleJar(javac, work, "mptestbase", null, + "module mptestbase { exports mptestbase; }", + "mptestbase", "Base", + "package mptestbase; public class Base { public static String hello() { return \"base\"; } }"); + + Path pluginJar = buildModuleJar(javac, work, "mptestplugin", baseJar, + "module mptestplugin { requires mptestbase; exports mptestplugin; }", + "mptestplugin", "Plugin", + "package mptestplugin; public class Plugin { public static String go() { return mptestbase.Base.hello() + \"+plugin\"; } }"); + + // Load the dependency into its own plugin layer first. + boolean baseLoaded = PackageManager.createAndRegisterModuleLayer( + List.of(baseJar), null, "mptestbase", "1.0", "mptestbase"); + assertTrue(baseLoaded, "dependency module mptestbase should load"); + + // Now load the dependent: its 'requires mptestbase' can only be satisfied + // by the previously-registered plugin layer, not the boot layer. + boolean pluginLoaded = PackageManager.createAndRegisterModuleLayer( + List.of(pluginJar), null, "mptestplugin", "1.0", "mptestplugin"); + assertTrue(pluginLoaded, "dependent module mptestplugin should resolve against the mptestbase layer"); + + // And it must actually link at runtime: Plugin.go() calls Base.hello(). + Class pluginClass = BEASTClassLoader.forName("mptestplugin.Plugin"); + String result = (String) pluginClass.getMethod("go").invoke(null); + assertEquals("base+plugin", result, "cross-layer call should execute"); + } + + /** Compile a single-package module and pack it into a jar; return the jar path. */ + private static Path buildModuleJar(ToolProvider javac, Path work, String moduleName, + Path modulePathJar, String moduleInfo, + String pkg, String className, String classSource) throws IOException { + Path src = work.resolve(moduleName + "-src"); + Files.createDirectories(src.resolve(pkg)); + Files.writeString(src.resolve("module-info.java"), moduleInfo); + Files.writeString(src.resolve(pkg).resolve(className + ".java"), classSource); + + Path classes = work.resolve(moduleName + "-classes"); + Files.createDirectories(classes); + + List args = new ArrayList<>(List.of("-d", classes.toString())); + if (modulePathJar != null) { + args.add("--module-path"); + args.add(modulePathJar.toString()); + } + try (Stream walk = Files.walk(src)) { + walk.filter(p -> p.toString().endsWith(".java")).forEach(p -> args.add(p.toString())); + } + int rc = javac.run(System.out, System.err, args.toArray(new String[0])); + assertEquals(0, rc, "compilation of " + moduleName + " should succeed"); + + Path jar = work.resolve(moduleName + ".jar"); + try (JarOutputStream jos = new JarOutputStream(Files.newOutputStream(jar)); + Stream walk = Files.walk(classes)) { + walk.filter(Files::isRegularFile).forEach(p -> { + try { + jos.putNextEntry(new JarEntry(classes.relativize(p).toString().replace('\\', '/'))); + Files.copy(p, jos); + jos.closeEntry(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + }); + } + return jar; + } +} diff --git a/beast-pkgmgmt/src/test/java/beast/pkgmgmt/launcher/SeedBundledPackageTest.java b/beast-pkgmgmt/src/test/java/beast/pkgmgmt/launcher/SeedBundledPackageTest.java new file mode 100644 index 0000000..4e250f1 --- /dev/null +++ b/beast-pkgmgmt/src/test/java/beast/pkgmgmt/launcher/SeedBundledPackageTest.java @@ -0,0 +1,50 @@ +package beast.pkgmgmt.launcher; + +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.Test; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * End-to-end check of {@link BeastLauncher#seedBundledPackage(String)}: discovery + * of a bundled package zip (via the launcher-jar parent walk), version parsing, + * and extraction into the user package directory. + * + *

The test is a no-op unless a bundled zip is discoverable, i.e. a + * {@code BEAST.base.package.v*.zip} has been staged under a {@code packages/} + * directory in the launcher-jar parent chain (e.g. {@code beast-pkgmgmt/target/packages/}). + * It therefore passes silently on CI and does real work when run locally after staging. + */ +public class SeedBundledPackageTest { + + @Test + public void seedsBaseIntoUserDir() throws Exception { + Path userDir = Files.createTempDirectory("beast-seed-test"); + String prev = System.getProperty("beast.user.package.dir"); + System.setProperty("beast.user.package.dir", userDir.toString()); + try { + boolean handled = BeastLauncher.seedBundledPackage("BEAST.base"); + Assumptions.assumeTrue(handled, + "no bundled BEAST.base zip staged under a packages/ dir - skipping"); + + Path versionXml = userDir.resolve("BEAST.base").resolve("version.xml"); + Path lib = userDir.resolve("BEAST.base").resolve("lib"); + assertTrue(Files.exists(versionXml), "version.xml should be extracted to the user dir"); + assertTrue(Files.isDirectory(lib), "lib/ should be extracted to the user dir"); + try (Stream jars = Files.list(lib)) { + assertTrue(jars.anyMatch(p -> p.toString().endsWith(".jar")), + "lib/ should contain at least one jar"); + } + } finally { + if (prev == null) { + System.clearProperty("beast.user.package.dir"); + } else { + System.setProperty("beast.user.package.dir", prev); + } + } + } +} diff --git a/release/Linux/linuxbin/applauncher b/release/Linux/linuxbin/applauncher index 8394890..759324f 100755 --- a/release/Linux/linuxbin/applauncher +++ b/release/Linux/linuxbin/applauncher @@ -44,11 +44,11 @@ else fi if [ -n "$BEAST_EXTRA_LIBS" ]; then - exec "$JAVA" --module-path "$APP" --add-modules ALL-MODULE-PATH \ + exec "$JAVA" --module-path "$APP" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \ -Xss256m -Xmx8g -Djava.library.path="$BEAST_EXTRA_LIBS" -Duser.language=en -Dfile.encoding=UTF-8 \ -m beast.pkgmgmt/beast.pkgmgmt.launcher.AppLauncherLauncher "$@" else - exec "$JAVA" --module-path "$APP" --add-modules ALL-MODULE-PATH \ + exec "$JAVA" --module-path "$APP" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 \ -m beast.pkgmgmt/beast.pkgmgmt.launcher.AppLauncherLauncher "$@" fi diff --git a/release/Linux/linuxbin/beast b/release/Linux/linuxbin/beast index 26113d9..16aae17 100755 --- a/release/Linux/linuxbin/beast +++ b/release/Linux/linuxbin/beast @@ -69,6 +69,6 @@ if [ -n "$BEAST_EXTRA_LIBS" ]; then fi fi -exec "$JAVA" --module-path "$APP" --add-modules ALL-MODULE-PATH \ +exec "$JAVA" --module-path "$APP" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \ -Xss256m -Xmx8g -Djava.library.path="$LD_LIBRARY_PATH" -Duser.language=en -Dfile.encoding=UTF-8 \ -m beast.pkgmgmt/beast.pkgmgmt.launcher.BeastLauncher "$@" diff --git a/release/Linux/linuxbin/beauti b/release/Linux/linuxbin/beauti index f4f4e7f..29d61bb 100755 --- a/release/Linux/linuxbin/beauti +++ b/release/Linux/linuxbin/beauti @@ -25,6 +25,6 @@ JAVA_HOME="$BUNDLE_HOME/jre" export JAVA_HOME JAVA="$JAVA_HOME/bin/java" APP="$BUNDLE_HOME/lib" -exec "$JAVA" --module-path "$APP" --add-modules ALL-MODULE-PATH \ +exec "$JAVA" --module-path "$APP" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 \ -m beast.pkgmgmt/beast.pkgmgmt.launcher.BeautiLauncher -capture "$@" diff --git a/release/Linux/linuxbin/loganalyser b/release/Linux/linuxbin/loganalyser index 71d8236..99c0365 100755 --- a/release/Linux/linuxbin/loganalyser +++ b/release/Linux/linuxbin/loganalyser @@ -44,11 +44,11 @@ else fi if [ -n "$BEAST_EXTRA_LIBS" ]; then - exec "$JAVA" --module-path "$APP" --add-modules ALL-MODULE-PATH \ + exec "$JAVA" --module-path "$APP" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \ -Xss256m -Xmx8g -Djava.library.path="$BEAST_EXTRA_LIBS" -Duser.language=en -Dfile.encoding=UTF-8 \ -m beast.pkgmgmt/beast.pkgmgmt.launcher.AppLauncherLauncher beastfx.app.tools.LogAnalyser "$@" else - exec "$JAVA" --module-path "$APP" --add-modules ALL-MODULE-PATH \ + exec "$JAVA" --module-path "$APP" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 \ -m beast.pkgmgmt/beast.pkgmgmt.launcher.AppLauncherLauncher beastfx.app.tools.LogAnalyser "$@" fi diff --git a/release/Linux/linuxbin/logcombiner b/release/Linux/linuxbin/logcombiner index 9a6a4b2..ae1b372 100755 --- a/release/Linux/linuxbin/logcombiner +++ b/release/Linux/linuxbin/logcombiner @@ -25,6 +25,6 @@ JAVA_HOME="$BUNDLE_HOME/jre" export JAVA_HOME JAVA="$JAVA_HOME/bin/java" APP="$BUNDLE_HOME/lib" -exec "$JAVA" --module-path "$APP" --add-modules ALL-MODULE-PATH \ +exec "$JAVA" --module-path "$APP" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 \ -m beast.pkgmgmt/beast.pkgmgmt.launcher.LogCombinerLauncher "$@" diff --git a/release/Linux/linuxbin/packagemanager b/release/Linux/linuxbin/packagemanager index 70fea70..c5e5f51 100755 --- a/release/Linux/linuxbin/packagemanager +++ b/release/Linux/linuxbin/packagemanager @@ -25,6 +25,6 @@ JAVA_HOME="$BUNDLE_HOME/jre" export JAVA_HOME JAVA="$JAVA_HOME/bin/java" APP="$BUNDLE_HOME/lib" -exec "$JAVA" --module-path "$APP" --add-modules ALL-MODULE-PATH \ +exec "$JAVA" --module-path "$APP" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 \ -m beast.pkgmgmt/beast.pkgmgmt.PackageManager "$@" diff --git a/release/Linux/linuxbin/treeannotator b/release/Linux/linuxbin/treeannotator index fd8d1f1..df815c5 100755 --- a/release/Linux/linuxbin/treeannotator +++ b/release/Linux/linuxbin/treeannotator @@ -25,6 +25,6 @@ JAVA_HOME="$BUNDLE_HOME/jre" export JAVA_HOME JAVA="$JAVA_HOME/bin/java" APP="$BUNDLE_HOME/lib" -exec "$JAVA" --module-path "$APP" --add-modules ALL-MODULE-PATH \ +exec "$JAVA" --module-path "$APP" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 \ -m beast.pkgmgmt/beast.pkgmgmt.launcher.TreeAnnotatorLauncher "$@" diff --git a/release/Mac/build-sign-dmg.sh b/release/Mac/build-sign-dmg.sh index 9ffa67d..633a21a 100755 --- a/release/Mac/build-sign-dmg.sh +++ b/release/Mac/build-sign-dmg.sh @@ -169,6 +169,14 @@ find "$REPO_ROOT/beast-fx/target/lib" -name "*.jar" \ ! -name "javafx-*" ! -name "jdk-jsobject-*" \ -exec cp {} "$STAGING/" \; +# Move the core BEAST modules (beast.base, beast.fx) off the boot module path: +# they ship as user-installable packages (bundled below, seeded into the user +# package dir on first run, and loaded as plugin module layers) so the package +# manager can upgrade them in place. The launcher (beast-pkgmgmt) and the +# third-party dependencies stay on the boot module path; JavaFX is provided by +# the bundled Zulu JRE+FX as platform modules. +rm -f "$STAGING"/beast-base-*.jar "$STAGING"/beast-fx-*.jar + # Verify main JAR is present if [ ! -f "$STAGING/$MAIN_JAR" ]; then echo "ERROR: Main JAR not found in staging: $MAIN_JAR" @@ -211,9 +219,14 @@ sed -i '' '/^app\.classpath/d' "$BEAST_CFG" sed -i '' 's|^app\.mainclass=.*|app.mainmodule=beast.pkgmgmt/beast.pkgmgmt.launcher.BeastLauncher|' "$BEAST_CFG" # The native launcher resolves $APPDIR to the app/ directory at runtime. # Use = syntax because each java-options line is passed as a single JVM argument. +# JavaFX and jdk.jsobject are added explicitly: beast.fx (which requires them) is no +# longer on the boot module path, so nothing else pulls them out of the bundled +# JRE+FX. Naming them here resolves them into the boot layer, where the beast.fx +# plugin module layer reads them. Their transitive requires (javafx.graphics/base/ +# media) come along automatically. sed -i '' '/^\[JavaOptions\]/a\ java-options=--module-path=\$APPDIR\ -java-options=--add-modules=ALL-MODULE-PATH +java-options=--add-modules=ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject ' "$BEAST_CFG" # jpackage may strip bin/java from the bundled runtime (it uses its own native @@ -227,6 +240,26 @@ echo " Copied java binary from JRE+FX into runtime." echo " BEAST.app created." +# ── Bundle core package zips for first-run seeding ─────────────────────────── +# BEAST.base and BEAST.app ship as full package zips inside the app image +# (Contents/app/packages/) rather than on the boot module path. On first launch +# BeastLauncher.seedBundledPackage() extracts them into the user package dir, where +# they load as plugin module layers, so the package manager can upgrade them in +# place. Placed after jpackage so codesign seals them, in a subdirectory kept out +# of the module path. +APP_DIR_IN_BUNDLE="$OUTPUT/BEAST.app/Contents/app" +mkdir -p "$APP_DIR_IN_BUNDLE/packages" +BASE_PKG_ZIP=$(find "$REPO_ROOT/beast-base/target" -maxdepth 1 -name "BEAST.base.package.v*.zip" | head -1) +APP_PKG_ZIP=$(find "$REPO_ROOT/beast-fx/target" -maxdepth 1 -name "BEAST.app.package.v*.zip" | head -1) +for PKG_ZIP in "$BASE_PKG_ZIP" "$APP_PKG_ZIP"; do + if [ -z "$PKG_ZIP" ]; then + echo "ERROR: a core package zip was not found (run 'mvn package' first)" + exit 1 + fi + cp "$PKG_ZIP" "$APP_DIR_IN_BUNDLE/packages/" + echo " Bundled $(basename "$PKG_ZIP") into Contents/app/packages/" +done + # ── Step 3a: Create lightweight wrapper .app bundles ───────────────────────── @@ -249,17 +282,25 @@ build_wrapper_app() { # ── Launcher shell script ── # Derive the module/class from the fully qualified main class # e.g. beast.pkgmgmt.launcher.BeautiLauncher → -m beast.pkgmgmt/beast.pkgmgmt.launcher.BeautiLauncher + # + # --add-modules MUST name javafx.* and jdk.jsobject explicitly, exactly as + # BEAST.cfg does for the jpackage launcher. The JavaFX JARs are no longer on + # the module path ($BEAST_APP/app) — they come from the bundled JRE+FX as + # platform modules, which ALL-MODULE-PATH does not pull in. The launcher loads + # beast.fx as a plugin ModuleLayer; beast.fx requires javafx.graphics/controls, + # so without these the GUI apps (BEAUti/TreeAnnotator/LogCombiner/AppLauncher) + # fail module resolution and die silently when double-clicked from Finder. local module_name module_name=$(echo "$main_class" | sed 's/\.launcher\..*//') local launch_cmd if [ -n "$extra_args" ]; then launch_cmd="exec \"\$BEAST_APP/runtime/Contents/Home/bin/java\" \\ - --module-path \"\$BEAST_APP/app\" --add-modules ALL-MODULE-PATH \\ + --module-path \"\$BEAST_APP/app\" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \\ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 \\ -m $module_name/$main_class $extra_args \"\$@\"" else launch_cmd="exec \"\$BEAST_APP/runtime/Contents/Home/bin/java\" \\ - --module-path \"\$BEAST_APP/app\" --add-modules ALL-MODULE-PATH \\ + --module-path \"\$BEAST_APP/app\" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \\ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 \\ -m $module_name/$main_class \"\$@\"" fi diff --git a/release/Mac/macbin/applauncher b/release/Mac/macbin/applauncher index ea202fc..2174ef5 100755 --- a/release/Mac/macbin/applauncher +++ b/release/Mac/macbin/applauncher @@ -45,12 +45,12 @@ fi if [ -n "$BEAST_EXTRA_LIBS" ]; then "$JAVA" -Dlauncher.wait.for.exit=true \ - --module-path "$BEAST_APP/app" --add-modules ALL-MODULE-PATH \ + --module-path "$BEAST_APP/app" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \ -Xss256m -Xmx8g -Djava.library.path="$BEAST_EXTRA_LIBS" -Duser.language=en -Dfile.encoding=UTF-8 \ -m beast.pkgmgmt/beast.pkgmgmt.launcher.AppLauncherLauncher "$@" else "$JAVA" -Dlauncher.wait.for.exit=true \ - --module-path "$BEAST_APP/app" --add-modules ALL-MODULE-PATH \ + --module-path "$BEAST_APP/app" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 \ -m beast.pkgmgmt/beast.pkgmgmt.launcher.AppLauncherLauncher "$@" fi diff --git a/release/Mac/macbin/beast b/release/Mac/macbin/beast index 3671c1c..44e6550 100755 --- a/release/Mac/macbin/beast +++ b/release/Mac/macbin/beast @@ -71,6 +71,6 @@ if [ -n "$BEAST_EXTRA_LIBS" ]; then fi "$JAVA" -Dlauncher.wait.for.exit=true \ - --module-path "$BEAST_APP/app" --add-modules ALL-MODULE-PATH \ + --module-path "$BEAST_APP/app" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \ -Xss256m -Xmx8g -Djava.library.path="$LD_LIBRARY_PATH" -Duser.language=en -Dfile.encoding=UTF-8 \ -m beast.pkgmgmt/beast.pkgmgmt.launcher.BeastLauncher "$@" diff --git a/release/Mac/macbin/beauti b/release/Mac/macbin/beauti index 26a6015..d90de71 100755 --- a/release/Mac/macbin/beauti +++ b/release/Mac/macbin/beauti @@ -27,6 +27,6 @@ BEAST_APP="$BEAST/BEAST.app/Contents" export JAVA_HOME="$BEAST_APP/runtime/Contents/Home" JAVA="$JAVA_HOME/bin/java" "$JAVA" -Dlauncher.wait.for.exit=true \ - --module-path "$BEAST_APP/app" --add-modules ALL-MODULE-PATH \ + --module-path "$BEAST_APP/app" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 \ -m beast.pkgmgmt/beast.pkgmgmt.launcher.BeautiLauncher -capture "$@" diff --git a/release/Mac/macbin/loganalyser b/release/Mac/macbin/loganalyser index 7d29312..c56529f 100755 --- a/release/Mac/macbin/loganalyser +++ b/release/Mac/macbin/loganalyser @@ -45,12 +45,12 @@ fi if [ -n "$BEAST_EXTRA_LIBS" ]; then "$JAVA" -Dlauncher.wait.for.exit=true \ - --module-path "$BEAST_APP/app" --add-modules ALL-MODULE-PATH \ + --module-path "$BEAST_APP/app" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \ -Xss256m -Xmx8g -Djava.library.path="$BEAST_EXTRA_LIBS" -Duser.language=en -Dfile.encoding=UTF-8 \ -m beast.pkgmgmt/beast.pkgmgmt.launcher.AppLauncherLauncher beastfx.app.tools.LogAnalyser "$@" else "$JAVA" -Dlauncher.wait.for.exit=true \ - --module-path "$BEAST_APP/app" --add-modules ALL-MODULE-PATH \ + --module-path "$BEAST_APP/app" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 \ -m beast.pkgmgmt/beast.pkgmgmt.launcher.AppLauncherLauncher beastfx.app.tools.LogAnalyser "$@" fi diff --git a/release/Mac/macbin/logcombiner b/release/Mac/macbin/logcombiner index edbdaa9..7064c40 100755 --- a/release/Mac/macbin/logcombiner +++ b/release/Mac/macbin/logcombiner @@ -27,6 +27,6 @@ BEAST_APP="$BEAST/BEAST.app/Contents" export JAVA_HOME="$BEAST_APP/runtime/Contents/Home" JAVA="$JAVA_HOME/bin/java" "$JAVA" -Dlauncher.wait.for.exit=true \ - --module-path "$BEAST_APP/app" --add-modules ALL-MODULE-PATH \ + --module-path "$BEAST_APP/app" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 \ -m beast.pkgmgmt/beast.pkgmgmt.launcher.LogCombinerLauncher "$@" diff --git a/release/Mac/macbin/packagemanager b/release/Mac/macbin/packagemanager index 7f41cc5..e097f68 100755 --- a/release/Mac/macbin/packagemanager +++ b/release/Mac/macbin/packagemanager @@ -27,6 +27,6 @@ BEAST_APP="$BEAST/BEAST.app/Contents" export JAVA_HOME="$BEAST_APP/runtime/Contents/Home" JAVA="$JAVA_HOME/bin/java" "$JAVA" \ - --module-path "$BEAST_APP/app" --add-modules ALL-MODULE-PATH \ + --module-path "$BEAST_APP/app" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 \ -m beast.pkgmgmt/beast.pkgmgmt.PackageManager "$@" diff --git a/release/Mac/macbin/treeannotator b/release/Mac/macbin/treeannotator index e0b00be..9ce4c93 100755 --- a/release/Mac/macbin/treeannotator +++ b/release/Mac/macbin/treeannotator @@ -27,6 +27,6 @@ BEAST_APP="$BEAST/BEAST.app/Contents" export JAVA_HOME="$BEAST_APP/runtime/Contents/Home" JAVA="$JAVA_HOME/bin/java" "$JAVA" -Dlauncher.wait.for.exit=true \ - --module-path "$BEAST_APP/app" --add-modules ALL-MODULE-PATH \ + --module-path "$BEAST_APP/app" --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject \ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 \ -m beast.pkgmgmt/beast.pkgmgmt.launcher.TreeAnnotatorLauncher "$@" diff --git a/release/Windows/assemble-bundle.sh b/release/Windows/assemble-bundle.sh index 6ba155d..a5cf286 100644 --- a/release/Windows/assemble-bundle.sh +++ b/release/Windows/assemble-bundle.sh @@ -185,16 +185,22 @@ echo " Exe files at bundle root: $(find "$BUNDLE" -maxdepth 1 -name '*.exe' | # jpackage emits classpath-mode cfg when --main-jar is used. Three transforms: # 1. Delete app.classpath= (all JARs go on module-path, not classpath) # 2. app.mainclass= → app.mainmodule=beast.pkgmgmt/ (module-path launch) -# 3. Inject --module-path=$APPDIR and --add-modules=ALL-MODULE-PATH into [JavaOptions] -# so module descriptors (provides/requires) resolve at runtime. +# 3. Inject --module-path=$APPDIR and --add-modules=ALL-MODULE-PATH (plus the +# JavaFX + jdk.jsobject modules) into [JavaOptions] so module descriptors +# (provides/requires) resolve at runtime. # $APPDIR is jpackage's own placeholder; the native launcher resolves it at runtime. +# JavaFX and jdk.jsobject MUST be named explicitly: the JavaFX JARs are not on the +# module path (they were excluded from staging) — they come from the bundled JRE+FX +# as platform modules, which ALL-MODULE-PATH does not pull in. The launcher loads +# beast.fx as a plugin ModuleLayer; beast.fx requires javafx.graphics/controls, so +# without these the GUI apps fail module resolution and never open a window. echo "" echo "==> Step 5: Patching .cfg files to module-path mode..." for cfg in "$BUNDLE/app/"*.cfg; do sed -i \ -e '/^app\.classpath/d' \ -e 's|^app\.mainclass=\(.*\)|app.mainmodule=beast.pkgmgmt/\1|' \ - -e '/^\[JavaOptions\]/a java-options=--module-path=$APPDIR\njava-options=--add-modules=ALL-MODULE-PATH' \ + -e '/^\[JavaOptions\]/a java-options=--module-path=$APPDIR\njava-options=--add-modules=ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject' \ "$cfg" done diff --git a/release/Windows/bat/applauncher.bat b/release/Windows/bat/applauncher.bat index 5000135..40b6720 100644 --- a/release/Windows/bat/applauncher.bat +++ b/release/Windows/bat/applauncher.bat @@ -2,6 +2,6 @@ set "BUNDLE_HOME=%~dp0.." "%BUNDLE_HOME%\runtime\bin\java.exe" ^ --module-path "%BUNDLE_HOME%\app" ^ - --add-modules ALL-MODULE-PATH ^ + --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject ^ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 ^ -m beast.pkgmgmt/beast.pkgmgmt.launcher.AppLauncherLauncher %* \ No newline at end of file diff --git a/release/Windows/bat/beast.bat b/release/Windows/bat/beast.bat index 0b8cfa1..e503399 100644 --- a/release/Windows/bat/beast.bat +++ b/release/Windows/bat/beast.bat @@ -2,6 +2,6 @@ set "BUNDLE_HOME=%~dp0.." "%BUNDLE_HOME%\runtime\bin\java.exe" ^ --module-path "%BUNDLE_HOME%\app" ^ - --add-modules ALL-MODULE-PATH ^ + --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject ^ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 ^ -m beast.pkgmgmt/beast.pkgmgmt.launcher.BeastLauncher %* diff --git a/release/Windows/bat/beauti.bat b/release/Windows/bat/beauti.bat index a18a6c6..12b19ac 100644 --- a/release/Windows/bat/beauti.bat +++ b/release/Windows/bat/beauti.bat @@ -2,6 +2,6 @@ set "BUNDLE_HOME=%~dp0.." "%BUNDLE_HOME%\runtime\bin\java.exe" ^ --module-path "%BUNDLE_HOME%\app" ^ - --add-modules ALL-MODULE-PATH ^ + --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject ^ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 ^ -m beast.pkgmgmt/beast.pkgmgmt.launcher.BeautiLauncher -capture %* \ No newline at end of file diff --git a/release/Windows/bat/loganalyser.bat b/release/Windows/bat/loganalyser.bat index 9d9a068..10a447c 100644 --- a/release/Windows/bat/loganalyser.bat +++ b/release/Windows/bat/loganalyser.bat @@ -2,6 +2,6 @@ set "BUNDLE_HOME=%~dp0.." "%BUNDLE_HOME%\runtime\bin\java.exe" ^ --module-path "%BUNDLE_HOME%\app" ^ - --add-modules ALL-MODULE-PATH ^ + --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject ^ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 ^ -m beast.pkgmgmt/beast.pkgmgmt.launcher.AppLauncherLauncher beastfx.app.tools.LogAnalyser %* \ No newline at end of file diff --git a/release/Windows/bat/logcombiner.bat b/release/Windows/bat/logcombiner.bat index c944ec4..a0ab36e 100644 --- a/release/Windows/bat/logcombiner.bat +++ b/release/Windows/bat/logcombiner.bat @@ -2,6 +2,6 @@ set "BUNDLE_HOME=%~dp0.." "%BUNDLE_HOME%\runtime\bin\java.exe" ^ --module-path "%BUNDLE_HOME%\app" ^ - --add-modules ALL-MODULE-PATH ^ + --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject ^ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 ^ -m beast.pkgmgmt/beast.pkgmgmt.launcher.LogCombinerLauncher %* \ No newline at end of file diff --git a/release/Windows/bat/packagemanager.bat b/release/Windows/bat/packagemanager.bat index 45f97aa..a2292f3 100644 --- a/release/Windows/bat/packagemanager.bat +++ b/release/Windows/bat/packagemanager.bat @@ -2,6 +2,6 @@ set "BUNDLE_HOME=%~dp0.." "%BUNDLE_HOME%\runtime\bin\java.exe" ^ --module-path "%BUNDLE_HOME%\app" ^ - --add-modules ALL-MODULE-PATH ^ + --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject ^ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 ^ -m beast.pkgmgmt/beast.pkgmgmt.PackageManager %* \ No newline at end of file diff --git a/release/Windows/bat/treeannotator.bat b/release/Windows/bat/treeannotator.bat index 5599aa5..6b9fe94 100644 --- a/release/Windows/bat/treeannotator.bat +++ b/release/Windows/bat/treeannotator.bat @@ -2,6 +2,6 @@ set "BUNDLE_HOME=%~dp0.." "%BUNDLE_HOME%\runtime\bin\java.exe" ^ --module-path "%BUNDLE_HOME%\app" ^ - --add-modules ALL-MODULE-PATH ^ + --add-modules ALL-MODULE-PATH,javafx.controls,javafx.fxml,javafx.swing,javafx.web,jdk.jsobject ^ -Xss256m -Xmx8g -Duser.language=en -Dfile.encoding=UTF-8 ^ -m beast.pkgmgmt/beast.pkgmgmt.launcher.TreeAnnotatorLauncher %* \ No newline at end of file diff --git a/version.xml b/version.xml index 8656341..2ac3aa5 100644 --- a/version.xml +++ b/version.xml @@ -312,139 +312,5 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -