2009-05-12 18 views
1

スタンドアロンのJavaプログラムからJavaコマンドを呼び出す方法を教えてください。別のJavaプログラムを呼び出す

私は、Runtime.getRuntime()。exec( "cmd c/javac <> .java")ということを理解しています。うまくいくでしょう。ただし、これはプラットフォーム固有のものです。

j2sdk1.4で動作させることができるその他のAPIはありますか?

+0

あなたの正確な要件は何ですか? Javaコマンドは何を意味しますか? – pugmarx

+0

同じ質問ですが、何が必要ですか? - 別のJVMでコードを実行したいが、必要なときにコードを開始するか、「メイン」JVMと同時に起動してもかまいません。 - 例では 'javac'を表示しましたが、別のJVMで実行したいJavaコードの種類はありますか? – pgras

答えて

0

JVMを終了してシステムコマンドに移動するときは、プラットフォーム固有のコマンドを自分で処理する必要があります。 JVMは抽象化のための良い方法を提供します、なぜ離れて移動しますか?

Java固有のバイナリを実行する場合は、javaのantライブラリをチェックしてください。プラットフォーム依存のコマンドを実行するJavaからantスクリプトを実行することができます。

public class Launcher { 
    ... 
    public static void main(String[] args) throws Exception { 
     launch(Class.forName(args[0]), programArgs(args, 1)); 
    } 

    protected static void launch(Class program, String[] args) throws Exception { 
     Method main = program.getMethod("main", new Class[]{String[].class}); 
     main.invoke(null, new Object[]{args}); 
    } 

    protected static String[] programArgs(String[] sourceArgs, int n) { 
     String[] destArgs = new String[sourceArgs.length - n]; 
     System.arraycopy(sourceArgs, n, destArgs, 0, destArgs.length); 
     return destArgs; 
    } 

をそして、このようなコマンドラインでそれを実行します:あなたは、同じJVM内のすべてを実行できる場合

3

、あなたはこのような何かを行うことができます(

java Launcher OtherClassWithMainMethod %CMD_LINE_ARGS% 
2

Runtime.getRuntimeを呼び出します).exec()はプラットフォーム固有のものではなく、非常に非効率的です。それは、このアプリケーションの依存性に応じて潜在的に非常に高価な可能性のあるブランドの新しいシェルとjvmを生成します。

"外部" Javaコードを実行する最善の方法は、それをCLASSPATHに配置することです。アプリケーションのメインメソッドを呼び出す必要がある場合は、メソッドを直接インポートして呼び出すことができます。これがそうのように行うことができる。もちろん

import my.externals.SomeMain 

// call as if we are running from console 
SomeMain.main(new String[] {"some", "console", "arguments"}) 

を、最良のシナリオは、単に外部ライブラリとしてこれを使用してSomeMain.main()を呼び出すことなく、必要なコードにアクセスすることです。ベストプラクティスを遵守し、カプセル化されたモジュラーオブジェクトを適切に記述することで、他のアプリケーションで使用される場合には、移植性と使いやすさが大幅に向上します。

0

GAE上コナラPHPからJavaプログラミング:

import com.newatlanta.commons.vfs.provider.gae.GaeVFS; 
import org.apache.commons.io.IOUtils; 
import java.lang.Long; 
import java.lang.Boolean; 
GaeVFS::setRootPath(quercus_servlet_request()->getSession(true)->getServletContext()->getRealPath('/')); 
define('VFSM', GaeVFS::getManager()); 

//VFSM->resolveFile('gae://gaevfs')->createFolder(); 
$file=VFSM->resolveFile('gae://gaevfs/tmp1'); 
//$file->createFile(); 

$text='pp'; 
$method=$file->getClass()->getDeclaredMethod('updateContentSize', array(Long::TYPE, Boolean::TYPE)); 
$method->setAccessible(true); 
$method->invoke($file, strlen($text), true); 
$out=$file->getContent()->getOutputStream(); 
IOUtils::write($text, $out, 'UTF8'); 
$out->close(); 

$in=$file->getContent()->getInputStream(); 
$method=$file->getClass()->getDeclaredMethod('doGetContentSize',array()); 
$method->setAccessible(true); 
$len=$method->invoke($file); 
$whole=IOUtils::toString($in, 'UTF8').':'.$len."<br>"; 
$in->close(); 
echo $whole; 

GaeVFS::clearFilesCache(); 
GaeVFS::close(); 
関連する問題