tags:

views:

413

answers:

4

I had written several simple java applications named as A.jar, B.jar. Now i want to write a GUI java program so that user can press button A to execute A.jar and button B to execute B.jar .Also i want to output the runtime process detail in my GUI program. Any suggestion?

+1  A: 

.jar isn't executable. Instantiate classes or make call to any static method.

EDIT: Add Main-Class entry while creating a JAR.

>p.mf (content of p.mf)

Main-Class: pk.Test

>Test.java

package pk;
public class Test{
  public static void main(String []args){
    System.out.println("Hello from Test");
  }
}

Use Process class and it's methods,

public class Exec
{
   public static void main(String []args) throws Exception
    {
        Process ps=Runtime.getRuntime().exec(new String[]{"java","-jar","A.jar"});
        ps.waitFor();
        java.io.InputStream is=ps.getInputStream();
        byte b[]=new byte[is.available()];
        is.read(b,0,b.length);
        System.out.println(new String(b));
    }
}
adatapost
I think the idea is that given access to a jar, how do you add it to the classpath in order to load classes out of it.
Jherico
thank you very much it works!
winson tan
Thanks winson tan.
adatapost
+1  A: 

If I understand correctly it appears you want to run the jars in a separate process from inside your java GUI application.

To do this you can use:

// Run a java app in a separate system process
Process proc = Runtime.getRuntime().exec("java -jar A.jar");
// Then retreive the process output
InputStream in = proc.getInputStream();
InputStream err = proc.getErrorStream();

Its always good practice to buffer the output of the process.

gjrwebber
both works! thanks
winson tan
A: 

If you are java 1.6 then the following can also be done

import javax.tools.JavaCompiler; import javax.tools.ToolProvider;

public class CompilerExample {
public static void main(String[] args) {
String fileToCompile = "/Users/rupas/VolatileExample.java";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int compilationResult = compiler.run(null, null, null, fileToCompile);
if (compilationResult == 0) {
System.out.println("Compilation is successful");
} else {
System.out.println("Compilation Failed");
} } }

rupa
+1  A: 

You can create your own classloader which knows about the jar-file in question, and let it call the main method in A.jar or B.jar respectively. Then when you are done, you can discard the classloader.

Note: This runs inside the current JVM and does not protect the main application from the new code. It is handy for adding new functionality to a running program.

Thorbjørn Ravn Andersen