package net.sf.openrocket.startup; import java.net.URL; import net.sf.openrocket.startup.jij.ClasspathUrlStreamHandler; import net.sf.openrocket.startup.jij.ConfigurableStreamHandlerFactory; import net.sf.openrocket.startup.jij.CurrentClasspathProvider; import net.sf.openrocket.startup.jij.JarInJarStarter; import net.sf.openrocket.startup.jij.ManifestClasspathProvider; import net.sf.openrocket.startup.jij.PluginClasspathProvider; /** * First step in the OpenRocket startup sequence, responsible for * classpath setup. * * The startup class sequence is the following: * 1. Startup * 2. SwingStartup * * This class changes the current classpath to contain the jar-in-jar * library dependencies and plugins in the current classpath, and * then launches the next step of the startup sequence. * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ public class OpenRocket { private static final String STARTUP_CLASS = "net.sf.openrocket.startup.SwingStartup"; public static void main(String[] args) { // This property works around some fundimental bugs in TimSort in the java library which has had known issues // since it was introduced in JDK 1.7. In OpenRocket it manifests when you sort the motors in the motor chooser dialog // by designation. System.setProperty("java.util.Arrays.useLegacyMergeSort","true"); addClasspathUrlHandler(); JarInJarStarter.runMain(STARTUP_CLASS, args, new CurrentClasspathProvider(), new ManifestClasspathProvider(), new PluginClasspathProvider()); } private static void addClasspathUrlHandler() { ConfigurableStreamHandlerFactory factory = new ConfigurableStreamHandlerFactory(); factory.addHandler("classpath", new ClasspathUrlStreamHandler()); URL.setURLStreamHandlerFactory(factory); } }