Вызов Java-программы из другого - PullRequest
1 голос
/ 12 мая 2009

Как мне вызвать команду Java из автономной Java-программы.

Я понимаю, что Runtime.getRuntime (). Exec ("cmd c / javac <>. Java"); должно сработать. Однако это будет зависеть от платформы.

Любые другие доступные API, которые могли бы заставить его работать в j2sdk1.4?

Ответы [ 4 ]

3 голосов
/ 12 мая 2009

Если вы можете запустить все в той же JVM, вы можете сделать что-то вроде этого:

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;
    }

И запустите его с командной строкой, как это:

java Launcher OtherClassWithMainMethod %CMD_LINE_ARGS%
2 голосов
/ 12 мая 2009

Вызов 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 голосов
/ 04 ноября 2011

Java-программирование из quercus php на GAE:

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();
0 голосов
/ 12 мая 2009

Когда вы выходите из JVM и переходите к системным командам, вам приходится работать с командами, специфичными для платформы, самостоятельно. JVM предлагает хороший способ для абстракции, так зачем уходить?

Если вы хотите выполнить специфичные для Java двоичные файлы, посмотрите муравьиные библиотеки java. Вы можете выполнять ant-скрипты из java, которые выполняют зависящие от платформы команды.

...