【问题标题】:How to create a java progam to compile and run a list of java programs如何创建一个java程序来编译和运行java程序列表
【发布时间】:2011-03-20 23:12:18
【问题描述】:

不使用 .bat 文件,如何为 java 程序构建代码以编译和执行 java 程序列表。

【问题讨论】:

  • 你可能想看看Ant:ant.apache.org
  • 顺便说一句,欢迎来到 Stack Overflow! :)

标签: java


【解决方案1】:

它没有直接回答这个问题,但是一些库可以帮助使用“Runtime.exec()”方法(使用 I/O 流等)来调用“javac”。比如this one,命名为“Shell”(法文文末可以下载库)。

【讨论】:

    【解决方案2】:

    强烈建议为此使用现有的构建工具,例如 AntMaven1。这些工具存在多年,已被广泛使用、测试,它们是要走的路。只是不要重新发明轮子。

    1以防万一您想知道,在内部,这些工具使用来自tools.jar 的旧且未记录的com.sun.tools.javac.Main 类以编程方式调用javac

    【讨论】:

    • @polygenelubricants:好吧,我将其发布为答案,因为我真的认为这是 OP 需要的,即使他还不知道 :)跨度>
    【解决方案3】:

    您可以使用 ANT。而不是从 Eclipse 或其他什么运行 ANT,您也可以从命令运行它。这意味着您可以创建一个执行命令的 java 程序 -> ergo 执行带有参数的 ant。

    这些参数可以从您要构建的应用程序列表中的变量派生而来。

    【讨论】:

      【解决方案4】:

      开启Runtime.exec

      虽然可能不是最理想的解决方案,但您可以使用 Runtime.getRuntime().exec(someCommand) 将 shell 命令作为单独的 Process 执行。还有一些重载将参数作为String[]

      这不是一个简单的解决方案。管理并发 Process 并防止死锁等并非易事。

      相关问题


      关于排空Process

      一般你不能只用waitFor()Process 来终止;您还必须排空其 I/O 流以防止死锁。

      来自the API

      由于部分原生平台只为标准输入输出流提供有限的缓冲区大小,未能及时写入子进程的输入流或读取输出流可能会导致子进程阻塞,甚至死锁。

      相关问题


      关于 Java 6 编译器 API

      在 Java 中编译 Java 源代码的一个选项是使用 Java 6 Compiler API。这需要安装 JDK(不仅仅是 JRE)。

      另见

      相关问题

      【讨论】:

      • JavaCompiler 是这个问题的正确答案,而不是 Runtime.exec 并且绝对不是“改用 ant”
      【解决方案5】:

      使用 Runtime.getRuntime().exec(someCommand) 的另一个问题是您需要从生成进程中读取输出流和错误流,否则您的进程将挂起。

      可用于两个流的缓冲区数量有限,一旦它们填满,程序将等待您从中读取并且无法继续。这两个缓冲区必须在各自独立的线程中读取,这样一个就不会死锁另一个。

      【讨论】:

        【解决方案6】:

        java.lang.Runtime 类有一个方法可以让你执行任意的 shell 命令。所以它应该看起来像这样:

        List<String> commandsToExecute = ...
        
        for (String cmd : commandsToExecute) {
          Process p = Runtime.getRuntime().exec (cmd);
          p.waitFor(); // If you need to run them all sequentially.
        }
        

        还有几个其他版本的 Runtime.exec() 方法都在documentation 中描述。

        【讨论】:

        • waitFor 还不够;必须排空 I/O 流以防止死锁。
        • many things wrong with this code。不幸的是,执行外部命令并不是那么简单。阅读链接文章,了解最重要的陷阱。
        猜你喜欢
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        • 2011-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多