1

如何从独立的 Java 程序调用 Java 命令。

我了解 Runtime.getRuntime().exec("cmd c/javac <>.java"); 会工作。但是,这将是特定于平台的。

任何其他可用的 API 可以使它在 j2sdk1.4 中工作?

4

4 回答 4

3

如果您可以在同一个 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%
于 2009-05-12T07:15:19.587 回答
2

调用 Runtime.getRuntime().exec() 不仅是特定于平台的,而且效率极低。它将导致产生一个全新的 shell 和整个 jvm,这可能会非常昂贵,具体取决于此应用程序的依赖关系(没有双关语)。

执行“外部”Java 代码的最佳方式是将其放在您的 CLASSPATH 中。如果您必须调用应用程序的 main 方法,您可以简单地导入并直接调用该方法。这可以这样做:

import my.externals.SomeMain

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

当然,最好的情况是简单地将其用作外部库并访问您需要的代码,而无需调用 SomeMain.main()。遵循最佳实践并编写适当的封装模块化对象可以在其他应用程序使用时实现更大的可移植性和易用性。

于 2009-05-12T08:25:43.560 回答
0

当您离开 JVM 并转向系统命令时,您必须自己处理特定于平台的命令。JVM 提供了一种很好的抽象方式,那么为什么要放弃呢?

如果要执行 java 特定的二进制文件,请查看 java 的 ant 库。您可以从执行平台相关命令的 java 执行 ant 脚本。

于 2009-05-12T06:34:07.470 回答
0

GAE 上来自 quercus 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();
于 2011-11-04T10:02:59.603 回答