近日,实验室一同学想在Java程序中调用外部的jar命令来自动打包类文件,但是遇到了一个问题:jar命令的执行总是要等到该Java程序执行完成以后才立刻执行完。代码简要如下:
Process p = Runtime.getRuntime().exec("jar -cvf TestMy.jar *.class");
经过不断实验,发现JDK文档中描述如下:
The ProcessBuilder.start()
and Runtime.exec
methods create a native process and return an instance of a subclass of Process
that can be used to control the process and obtain information about it. The class Process
provides methods for performing input from the process, performing output to the process, waiting for the process to complete, checking the exit status of the process, and destroying (killing) the process.
The methods that create processes may not work well for special processes on certain native platforms, such as native windowing processes, daemon processes, Win16/DOS processes on Microsoft Windows, or shell scripts. The created subprocess does not have its own terminal or console. All its standard io (i.e. stdin, stdout, stderr) operations will be redirected to the parent process through three streams (getOutputStream()
, getInputStream()
, getErrorStream()
). The parent process uses these streams to feed input to and get output from the subprocess. Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, and even deadlock. (大致意思是当向子进程写入或从子进程读取流数据失败可能导致子进程阻塞甚至死锁)
The subprocess is not killed when there are no more references to the Process
object, but rather the subprocess continues executing asynchronously.
There is no requirement that a process represented by a Process
object execute asynchronously or concurrently with respect to the Java process that owns the Process
object.
正是红色标记的那句话道出了缘由:由于执行jar -cvf .......子进程向其输出流写入一些执行的信息因此可能导致阻塞甚至死锁,解决的办法十分简单只需用:jar -cf TestMy.jar *.class替代即可,去掉v以后表示执行jar命令而不向输出流写入信息。
分享到:
相关推荐
### Java调用外部程序命令详解 #### 一、引言 在进行系统集成或自动化脚本编写时,经常需要从Java程序中调用外部程序或命令。这种需求常见于多种场景,例如远程服务管理、批处理操作等。本文将详细介绍如何使用...
本文将详细介绍如何使用Java Runtime类中的`getRuntime().exec()`方法来调用系统命令,并提供一些实际应用场景的例子。 ### Java Runtime.getRuntime().exec() `java.lang.Runtime`类提供了运行时系统的表示形式,...
JAVA最好的调用外部命令的类。实际运用下来,比较强壮。
在Linux系统下,Java编程语言提供了丰富的API来执行操作系统级别的命令。这主要通过`java.lang.Runtime`类和`...在实际应用中,应根据具体需求选择合适的方法,并注意处理好命令执行的输入、输出和错误,以及异常情况。
以下是如何使用Java调用Windows命令行的详细步骤和注意事项: 1. **调用外部程序** - 使用`Runtime.getRuntime().exec()`方法创建一个子进程来执行指定的可执行程序。例如: ```java Process process = Runtime....
Java调用doc命令主要涉及到的是Java的进程...总的来说,Java调用doc命令涉及了Java与操作系统交互的能力,这在系统集成、自动化测试或文件处理场景中非常常见。正确理解和使用这些技术能够帮助你构建更强大的Java应用。
Java调用DOS命令是指在Java程序中执行操作系统级别的命令,比如Windows下的CMD命令或Linux下的Shell命令。这种功能在很多场景下都很有用,比如自动化脚本、文件操作、系统管理等。Java提供了Runtime类和...
本文将详细讲解如何使用Java调用外部程序以及如何捕获并处理程序的输出。 首先,`Runtime.getRuntime().exec()`方法是Java中最基础的调用外部程序的方式。它允许我们执行系统命令,并返回一个`Process`对象,通过该...
总结,通过Java调用Windows CMD命令,我们可以方便地执行系统级任务,实现与操作系统的交互。`FileProcessInShell.java`可能就是这样一个例子,它演示了如何在Java程序中执行和处理CMD命令的输出。在实际开发中,...
总之,Java调用DOS命令主要依赖`Runtime`和`Process`类,需要注意命令格式、标准输出处理以及资源管理等问题,以确保命令的正确执行和程序的稳定运行。在实际开发中,应充分考虑各种情况,以保证代码的健壮性和跨...
### 二、执行Java命令引入外部JAR包的方法 #### 方法1:修改系统环境变量 最常见的方式是通过修改系统环境变量`CLASSPATH`来添加外部JAR包。`CLASSPATH`环境变量告诉JVM在哪里可以找到用户自定义的类和资源。例如...
本文将详细探讨如何利用Java调用Linux命令,这一技能对于任何希望在Java应用中集成Linux功能的开发者来说都是至关重要的。 ### Java调用Linux命令的方法 Java提供了多种方式来执行外部命令或脚本,其中最常用的是...
### Java调用Linux命令 Java提供了一种强大的机制来执行操作系统级别的任务,其中包括调用Linux命令。实现这一功能的核心是`Runtime`类中的`exec()`方法。这个方法允许Java应用程序创建一个新的进程来执行指定的...
1. **安全性和权限问题**:直接执行外部命令可能会带来安全隐患,特别是当命令来自不可信源时。确保只执行信任的命令。 2. **异常处理**:在调用`Runtime.exec()`时,应妥善处理可能出现的`IOException`和`...
在Java编程中,有时我们需要与操作系统进行交互,执行一些系统级别的任务,比如运行命令行(CMD)命令。本文将深入探讨如何在Java中调用相应的CMD命令,通过实例来帮助理解这一过程。 首先,Java提供了`Runtime`类...
java 执行linux命令源码,java调用shell脚本源码,java web发布war到tomcat,servlet文件上传,ajax文件上传。 java web 上传war包、停止、启动、发布tomcat。 命令修改成自己的目录即可使用。
在Java中,我们可以使用`Runtime.getRuntime().exec()`方法来执行系统命令。例如,假设我们有一个名为"myProgram.exe"的外部程序位于当前工作目录,我们可以这样调用它: ```java try { Process process = Runtime...
8. **安全考虑**:调用外部命令时要注意权限和安全问题,避免执行未经验证的用户输入,防止命令注入攻击。例如,不要直接拼接用户输入到命令字符串中,而是使用参数化的方式传递。 9. **异步调用**:在某些情况下,...
使用 Java 调用其他.exe 可执行程序时,需要注意以下几点: * 需要确保调用其他.exe 可执行程序的权限,避免出现权限不足的错误。 * 需要确保调用其他.exe 可执行程序的路径正确,避免出现文件不存在的错误。 * ...
在Java编程中,有时我们需要与操作系统进行交互,执行一些系统级别的任务,比如创建文件夹...同时,由于`Runtime.exec()`方法可能涉及权限问题,因此在生产环境中,建议使用更安全的`ProcessBuilder`类来执行外部命令。