f



How do I launch a new Java app from a running Java app?

Here is the motivation for my question. I have a Swing-based
application that is launched using Web Start. I would like this
application to launch other application instances using it's own
classpath (e.g. fork new instances of itself) when the user invokes
certain functions.

I know that I can use Runtime or ProcessBuilder to launch another Java
application. If I use this approach, how can I get the current
application's classpath so that I can pass it as an argument to the
Java sub process?

Sincerely,
Steve A

0
12/28/2006 6:57:28 PM
comp.lang.java.programmer 52711 articles. 1 followers. Post Follow

3 Replies
875 Views

Similar Articles

[PageSpeed] 55

On Fri, 29 Dec 2006 02:57:28 +0800, steve.albin@gmail.com wrote
(in article <1167332248.232059.70610@73g2000cwn.googlegroups.com>):

> Here is the motivation for my question. I have a Swing-based
> application that is launched using Web Start. I would like this
> application to launch other application instances using it's own
> classpath (e.g. fork new instances of itself) when the user invokes
> certain functions.
> 
> I know that I can use Runtime or ProcessBuilder to launch another Java
> application. If I use this approach, how can I get the current
> application's classpath so that I can pass it as an argument to the
> Java sub process?
> 
> Sincerely,
> Steve A
> 

The following  segment works on windows/mac & linux and has been in use for 
over 2 years in our office


Fairly easily, basically I use it for deploying updates.
I have a class called "bootloader" that contains the following,  the most 
important thin is that  your "bootloader" class MUST NOT link into any of 
your other libraries. (if it does then the JVM goes on a class hunt trying to 
resolve all other classes & preload them)

That allows you to use the bootloader to auto update any other files , other 
than "bootloader"




OurJarClassPathArray, holds that paths of any jars you may need (libraries, 
DO NOT HARDCODE, or use  imports)

loadThisClass , holds the class you want to run

  final Method mainMethod;
        final Class toRun;

  ClassLoader loader = new URLClassLoader(OurJarClassPathArray);
       toRun = loader.loadClass(loadThisClass);
      mainMethod = findMain(toRun, thisargs);

     if ((mainMethod != null)) {
                //launch the new program in a new thread so we can exit the 
bootloader (can we really?)
                mainThread =
                    new Runnable() {
                            public void run() {
                                try {
                                    final String[] dummy = null;
                                    mainMethod.invoke(null,
                                        new Object[] { dummy });
                                } catch (Exception e) {
                                    System.out.println(
                                        "Exception Caused when trying to 
Execute main Class");
                                    e.printStackTrace();
                                }
                            }
                        };
                        //this appears to be important code that was stopping 
the shit
                        //running on the linux correctly, specifically the 
classloader.
                Thread mainRunner=new Thread(mainThread);
              mainRunner.setContextClassLoader(loader ); 
               mainRunner.start();
 System.out.println("We think have exited the BootLoader ");
        System.gc();

0
steve26 (280)
1/3/2007 8:56:54 AM
steve.albin@gmail.com wrote:
> Here is the motivation for my question. I have a Swing-based
> application that is launched using Web Start. I would like this
> application to launch other application instances using it's own
> classpath (e.g. fork new instances of itself) when the user invokes
> certain functions.

Why not instantiate the new instance directly
from the code in the original instance?  E.G.

class Application {
....
   public void actionPerformed(ActionEvent ae) {
     if (...) {
       Application app = new Application();
    } else if ....

Andrew T.

0
andrewthommo (3108)
1/3/2007 10:04:09 AM
Andrew Thompson wrote:
> steve.albin@gmail.com wrote:
> > Here is the motivation for my question. I have a Swing-based
> > application that is launched using Web Start. I would like this
> > application to launch other application instances using it's own
> > classpath (e.g. fork new instances of itself) when the user invokes
> > certain functions.
>
> Why not instantiate the new instance directly
> from the code in the original instance?  E.G.
>
> class Application {
> ...
>    public void actionPerformed(ActionEvent ae) {
>      if (...) {
>        Application app = new Application();
>     } else if ....
>
> Andrew T.

Or even better...

public void actionPerformed(ActionEvent ae) {
   if (shouldSpawnNewApp) {
      Thread thread = new Thread() {
           public void run() {
               MyMainClass.main(new String[] {} );
           }
      };
      thread.setPriority(Thread.NORM_PRIORITY);
      thread.start();
   }
}

0
1/3/2007 4:59:31 PM
Reply: