Skip to content
On this page

使用 Java 编写脚本执行 Bash 程序并编译成 Jar 可执行文件

今天我要为大家介绍一种利用 Java 语言编写脚本执行程序并编译成可执行文件的方法。通过这种方法,我们可以轻松地执行各种脚本,并将其封装成独立的可执行文件,方便在不同环境中运行和分享。接下来,我将详细介绍这个 Java 代码的功能以及它如何将脚本编译成 jar 文件,让我们一起来看看吧!

主要内容

首先,让我们来看一下这段 Java 代码的功能。这段代码使用 Java 的 Runtime 类通过执行app.sh脚本来运行命令。具体的代码如下:

java
import java.io.IOException;

public class Main {

  public static void main(String[] args) {

    try {
      // 运行同目录下的app.sh脚本
      String[] cmd = new String[] { "./app.sh" };
      Process p = Runtime.getRuntime().exec(cmd);

      // 等待脚本执行完成
      p.waitFor();

      // 获取退出码
      int exitCode = p.exitValue();

      if (exitCode != 0) {
        // 执行失败
        System.out.println("Error running script. Exit code: " + exitCode);
      } else {
        // 执行成功
        System.out.println("Script executed successfully!");
      }

    } catch (IOException e) {
      // 处理IO异常
      e.printStackTrace();
    } catch (InterruptedException e) {
      // 处理中断异常
      e.printStackTrace();
    }

  }

}

这段代码首先创建一个 String 类型的数组cmd,并将脚本执行命令赋值给它。然后,通过Runtime类的exec方法创建一个子进程来执行脚本。接着,通过调用waitFor方法等待脚本执行完成,并通过exitValue方法获取脚本的退出码。如果退出码不等于 0,则表示脚本执行失败,否则表示执行成功。

接下来,让我们一起来看看如何将这段代码编译成一个 jar 文件,以便我们可以方便地在不同的环境中运行它。

步骤如下:

Step 1: 创建一个名为Main.java的文件,并将以上的 Java 代码复制到该文件中。

Step 2: 打开命令行工具,切换到存放Main.java文件的目录。

Step 3: 输入以下命令进行编译:

bash
javac Main.java

Step 4: 编译成功后,会生成一个Main.class文件。

Step 5: 输入以下命令创建一个名为Main.jar的 jar 文件:

bash
jar cfe Main.jar Main Main.class

其中,Main.jar是生成的 jar 文件的名称,Main是执行入口点的类名,Main.class是编译生成的 class 文件。

Step 6: 完成以上步骤后,我们就成功将代码编译成了一个可执行的 jar 文件。现在,我们可以通过输入以下命令来运行这个 jar 文件:

bash
java -jar Main.jar

如果你看到控制台输出了"Script executed successfully!",那么恭喜你,你已经成功执行了这个脚本!

出现 "no main manifest attribute, in Main.jar" 错误怎么办?

当运行 java -Xms128M -XX:MaxRAMPercentage=95.0 -jar Main.jar 出现以下错误时:

text
no main manifest attribute, in Main.jar

方法一

假设你的主类是:

java
public class Main {
  public static void main(String[] args) {
    // ...
  }
}

编译时需要编译这个 Main 类:

bash
javac Main.java

然后在用 jar 命令创建 JAR 包时,使用-e 参数指定 Main 类作为入口主类:

bash
jar cvfe Main.jar Main Main.class

这样创建的 Main.jar 就包含了 Mainifest 中指定的 Main 主类。

方法二

问题的原因是您在创建可执行的 JAR 文件时,没有指定执行入口点(main manifest attribute)。这导致您在运行java -jar Main.jar命令时出现了错误信息"no main manifest attribute, in Main.jar"。

要解决这个问题,您可以按照以下步骤来添加执行入口点:

Step 1: 在您的项目文件夹中创建一个名为Manifest.txt的文本文件。

Step 2: 打开Manifest.txt文件,并添加以下内容:

text
Main-Class: Main

这里的Main是指您执行入口点的类名,与您编写的 Java 代码中的类名一致。

Step 3: 保存并关闭Manifest.txt文件。

Step 4: 打开命令行工具,切换到存放Manifest.txt文件的目录。

Step 5: 输入以下命令来创建具有执行入口点的 JAR 文件:

bash
jar cfm Main.jar Manifest.txt Main.class

这里的Main.jar是生成的具有执行入口点的 JAR 文件的名称,Manifest.txt是包含执行入口点信息的文本文件的名称,Main.class是编译生成的 class 文件的名称。

Step 6: 完成以上步骤后,再次运行以下命令来执行 JAR 文件:

bash
java -jar Main.jar

你就可以正常运行:

bash
java -Xms128M -XX:MaxRAMPercentage=95.0 -jar Main.jar

不会再出现 no main manifest attribute 的错误。现在,您应该可以看到成功执行脚本的输出了。

另外,也可以通过在 META-INF/MANIFEST.MF 文件中指定 Main-Class 来设置入口类。

总之,原因是 JAR 包中没有设置包含 main 方法的主类,解决方法是在创建 JAR 包时使用-e 参数或 MANIFEST.MF 指定主类。

什么是app.sh脚本?

接下来我将在文章中继续添加关于app.sh脚本的详细介绍,并为您提供多个脚本的示例。

app.sh是一个 Shell 脚本,用于执行一系列命令和操作。它可以包含各种操作,如文件处理、数据处理、运行其他程序等。通常,app.sh脚本是由开发者根据具体需求编写的,用于自动化一些重复性的任务,提高工作效率。

下面是一些app.sh脚本的示例,展示它们的用途和功能:

示例 1:文件操作脚本

bash
#!/bin/bash

# 复制文件夹中的所有文件到目标文件夹
cp -r /path/to/source/* /path/to/destination/

# 删除文件夹中的所有文件
rm -rf /path/to/folder/*

这个脚本用于执行文件操作,首先使用cp命令将源文件夹中的所有文件复制到目标文件夹中,然后使用rm命令删除指定文件夹中的所有文件。

示例 2:数据处理脚本

bash
#!/bin/bash

# 读取名字列表文件,并打印出列表中的名字
while read line
do
  echo "Hello, $line!"
done < names.txt

这个脚本用于读取一个名字列表文件names.txt,并逐行打印出列表中的每个名字。通过使用循环和输入重定向,我们可以很方便地对数据进行处理。

示例 3:运行其他程序脚本

bash
#!/bin/bash

# 编译并运行Java程序
javac Main.java
java Main

# 执行Python脚本
python script.py

# 运行Node.js应用
node app.js

这个脚本用于编译并运行 Java 程序、执行 Python 脚本以及运行 Node.js 应用。通过在脚本中调用相应的命令,我们可以轻松地运行各种不同的程序。

通过以上示例,我们可以看到app.sh脚本的灵活性和多样性。无论您需要执行哪些操作,只需根据具体需求编写相应的脚本即可。

如何在 Java 中通过 unix_args.txt 文件加载更多命令行参数?

让我为您解释一下关于java -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true @unix_args.txt这个命令的含义。

这个命令是用于在 Unix 系统中以特定的配置参数运行 Java 程序的。让我们逐个解释这些参数的含义:

  1. java:表示要运行 Java 程序的命令。

  2. -Xms128M:是 Java 堆内存的初始大小参数。这里的128M表示初始堆内存的大小为 128 兆字节(MB)。这个参数可以根据您的应用程序要求进行调整。

  3. -XX:MaxRAMPercentage=95.0:是 Java 虚拟机的最大内存使用百分比参数。这里的95.0表示 Java 虚拟机最大内存的使用限制为物理内存的 95%。这个参数可以根据您的系统资源进行调整。

  4. -Dterminal.jline=false:是一个系统属性参数,用于配置使用 JLine 终端时的行为。这里设置为false表示禁用 JLine,即不使用 JLine 来处理命令行输入输出。

  5. -Dterminal.ansi=true:是一个系统属性参数,用于配置是否启用终端的 ANSI 转码支持。这里设置为true表示启用 ANSI 转码支持,可以实现在终端中显示颜色和其他特殊效果。

  6. @unix_args.txt:是一个特殊的参数,用于从文件中加载命令行参数。unix_args.txt是存储了更多命令行参数的文本文件。通过使用@符号,可以将文件中的参数加载到命令中进行使用。

通过运行java -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true @unix_args.txt命令,您将以指定的内存配置参数和系统属性来运行 Java 程序,并且可以将更多的命令行参数从文件中加载。

如何创建unix_args.txt文件?

让我为您解释一下关于unix_args.txt文件的创建方法。

例如,您可以按照以下步骤来创建unix_args.txt文件

如何修改unix_args.txt文件,以便只运行server.jar

unix_args.txt文件是一个文本文件,用于存储额外的命令行参数。要让它只运行server.jar,您可以按照以下步骤进行修改:

Step 1: 打开unix_args.txt文件。

假设 unix_args.txt 文件内容原本是:

text
arg1 arg2 arg3

Step 2: 删除其中所有的内容,并添加以下内容: 如果要修改只运行 server.jar,可以将文件内容改为:

text
-jar server.jar

这将确保unix_args.txt文件中只包含一个参数,即-jar server.jar

Step 3: 保存并关闭unix_args.txt文件。

现在,当您运行java -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true @unix_args.txt命令时,只会运行server.jar。实际执行的就相当于:java -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true -jar server.jar其他参数可以在命令行中直接指定,或者在unix_args.txt文件中继续添加。这样,您可以根据需要轻松修改和管理您的命令行参数。即会使用指定的 JVM 参数来启动 server.jar 文件。

另外也可以指定一些 server.jar 运行时可能需要的配置,例如最大内存:

text
-Xmx512m -jar server.jar

把这些参数写在 unix_args.txt 里即可在不修改原命令的情况下,通过外部文件配置来启动 server.jar。

通过以上的步骤,我们可以轻松地使用 Java 编写脚本执行程序,并将其封装成可执行的 jar 文件。这种方法不仅方便了脚本的执行,而且还方便了脚本的分发和分享。希望本篇文章对大家有所帮助,如果有任何问题或意见,请随时留言给我。谢谢大家的阅读!

附录

Note: 本文由 GPT-4 生成,几乎没有修改。如果你发现有误,请告诉我。谢谢。

上次更新于: