📅  最后修改于: 2023-12-03 15:13:03.930000             🧑  作者: Mango
当我们在Java中运行一个'.jar'文件时,有时会出现窗口在双击时立即关闭的情况。这是因为运行'.jar'文件时默认不会显示控制台输出,因此我们需要在程序中手动显示控制台窗口。
下面是解决此问题的步骤:
在'MANIFEST.MF'文件中添加以下内容:
Main-Class: com.example.Main
其中'com.example.Main'是程序的入口类名称。如果不添加此内容,程序将无法正常启动。
在程序的入口类中添加下面的代码:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) throws Exception {
// 显示控制台窗口
if (isWindows()) {
try {
ProcessBuilder builder = new ProcessBuilder(Arrays.asList("cmd", "/c", "start", "cmd.exe", "/k", "echo off"));
builder.redirectErrorStream(true);
Process process = builder.start();
// stdin
InputStream in = process.getInputStream();
OutputStream out = process.getOutputStream();
Thread t1 = new Thread(() -> {
try {
out.write("java -jar YOUR_JAR_FILE_NAME.jar\n".getBytes());
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
});
t1.start();
// stdout
Thread t2 = new Thread(() -> {
byte[] buffer = new byte[4096];
int len;
try {
while ((len = in.read(buffer)) != -1) {
System.out.write(Arrays.copyOf(buffer, len));
System.out.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
});
t2.start();
// wait for execution
process.waitFor();
// wait for threads to finish
t1.join();
t2.join();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
} else {
// 非windows操作系统下,直接启动程序
// your code here
}
}
private static boolean isWindows() {
return System.getProperty("os.name").toLowerCase().startsWith("windows");
}
}
以上代码中,我们通过ProcessBuilder类实现了打开控制台窗口,并在控制台窗口中运行程序的功能。该代码适用于Windows系统。如果您使用的是其他操作系统,请修改代码以适用于您的系统。
在命令行中进入程序根目录,输入以下命令:
jar cvfm YOUR_JAR_FILE_NAME.jar MANIFEST.MF *
其中'YOUR_JAR_FILE_NAME.jar'是您打算生成的'.jar'文件名称。执行此命令后,程序将被打包为一个可执行的'.jar'文件。
以上是解决'.jar 窗口在双击时立即关闭'问题的完整步骤。如果您还有疑问,可以咨询相关专家或使用Java开发者社区的资源进行学习和交流。