代码之家  ›  专栏  ›  技术社区  ›  gatoatigrado

Java新问题:更丰富的Java子进程

  •  1
  • gatoatigrado  · 技术社区  · 15 年前

    我想生成一个子进程Java虚拟机(通过Java API调用)并与之通信。

    也许我只是在谷歌上找不到合适的东西,但我一直被指向runtime.exec(),这不是我想要的。我知道我可以连接标准的输入/输出并使用各种序列化技术,或者使用远程方法调用,但是这些调用看起来很麻烦/很重。看起来API调用可能比试图调用运行时更健壮。(“/Ur/bin/javaCP[St.GETCLSASSPAT]……”)。

    这样做的目的/动机是,动态地重新加载具有许多依赖性的类似乎有些困难(一些站点提到读取.class文件并将其传递给[classloader].defineclass,但这并不能很好地处理依赖类文件的加载)。如果我不需要太多的通信带宽或低延迟,我认为一个新的JVM实例可以很好地工作;那就是与它通信似乎很麻烦。在任何情况下,这个问题的优先级都不是很高;我可能会直截了当地了解如何加载依赖类文件(例如,用于内部类的文件)。

    4 回复  |  直到 14 年前
        1
  •  2
  •   Michael Borgwardt    15 年前

    只要您想要加载的类位于JAR文件或目录树中,并且与您的主应用程序分离,那么使用URLClassLoader并在单独的线程中运行它们就可以了。所有的Java应用服务器都是这样工作的,所以它绝对是一个行之有效的技术。

        2
  •  2
  •   Jared    15 年前

    我绝对建议您看一下 Tomcat servlet container -他们似乎有 确切地 同一类的加载问题似乎已经很好地解决了。

        3
  •  0
  •   Pool    15 年前

    如果你走通讯路线,你应该考虑 Java RMI .

        4
  •  0
  •   Alain O'Dea    14 年前

    赛跑运动员 (见下表)用途 进程生成器 运行 主要的 类路径中任何可用类的函数,使用与当前JVM相同的类路径和库路径。它甚至可以克隆当前JVM的环境和工作目录。

    Caveat: 赛跑运动员 假定 java 是在 PATH 当前JVM的。你可能想把一些逻辑放在定位上 爪哇 java.exe 基于 System.getProperty("java.home") :)

    上市 类运行程序.java :

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    public class ClassRunner
    {
        private final Class<?> classToRun;
    
        public ClassRunner(Class<?> classToRun)
        {
            this.classToRun = classToRun;
        }
    
        public void run(String... args) throws Exception
        {
            String javaCommand = "java";
            String libraryPath = "-Djava.library.path=\"" + System.getProperty("java.library.path") + "\"";
            String classpath = "\"" + System.getProperty("java.class.path") + "\"";
            ProcessBuilder processBuilder = new ProcessBuilder(javaCommand,
                    libraryPath,
                    "-classpath", classpath,
                    classToRun.getCanonicalName());
            processBuilder.redirectErrorStream();
    
            for (String arg : args) processBuilder.command().add(arg);
            Process process = processBuilder.start();
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) System.out.println(line);
            reader.close();
            process.waitFor();
        }
    
        public static void main(String[] args) throws Exception
        {
            new ClassRunner(Main.class).run("Hello");
        }
    }
    

    上市 主类 :

    public class Main
    {
        public static void main(String... args)
        {
            System.out.println("testing Main");
            for (String arg : args) System.out.println(arg);
        }
    }