目录

javac.exe 编译

jar.exe 打包

java.exe 执行

java  -cp

MANIFEST.MF

java -jar

javaw.exe 命令

替换 .jar 包 class 文件

脚本启停 spring boot Jar 包服务

Windows 系统 bat 启动项目jar包

Linux 系统 shell 启停项目jar包


javac.exe 编译

1、编写的 Java 源文件执行之前都需要使用 javac.exe 命令进行编译,即 *.java 编译成 *.class。

2、javac.exe 在 %JAVA_HOME%/bin 目录下,配置好环境变量后,命令行中可以直接运行。命令行中输入 javac 可以看到详细用法与参数。

C:\Users\Administrator.SC-201707281232>javac
用法: javac <options> <source files>
其中, 可能的选项包括:
  -g                         生成所有调试信息
  -g:none                    不生成任何调试信息
  -g:{lines,vars,source}     只生成某些调试信息
  -nowarn                    不生成任何警告
  -verbose                   输出有关编译器正在执行的操作的消息
  -deprecation               输出使用已过时的 API 的源位置
  -classpath <路径>            指定查找用户类文件和注释处理程序的位置
  -cp <路径>                   指定查找用户类文件和注释处理程序的位置
  -sourcepath <路径>           指定查找输入源文件的位置
  -bootclasspath <路径>        覆盖引导类文件的位置
  -extdirs <目录>              覆盖所安装扩展的位置
  -endorseddirs <目录>         覆盖签名的标准路径的位置
  -proc:{none,only}          控制是否执行注释处理和/或编译。
  -processor <class1>[,<class2>,<class3>...] 要运行的注释处理程序的名称; 绕过默认的搜索进程
  -processorpath <路径>        指定查找注释处理程序的位置
  -parameters                生成元数据以用于方法参数的反射
  -d <目录>                    指定放置生成的类文件的位置
  -s <目录>                    指定放置生成的源文件的位置
  -h <目录>                    指定放置生成的本机标头文件的位置
  -implicit:{none,class}     指定是否为隐式引用文件生成类文件
  -encoding <编码>             指定源文件使用的字符编码
  -source <发行版>              提供与指定发行版的源兼容性
  -target <发行版>              生成特定 VM 版本的类文件
  -profile <配置文件>            请确保使用的 API 在指定的配置文件中可用
  -version                   版本信息
  -help                      输出标准选项的提要
  -A关键字[=值]                  传递给注释处理程序的选项
  -X                         输出非标准选项的提要
  -J<标记>                     直接将 <标记> 传递给运行时系统
  -Werror                    出现警告时终止编译
  @<文件名>                     从文件读取选项和文件名

3、下面新建一个 .java 源文件,进行简单的演示:

import java.util.logging.Logger;
public class HelloWorld {
    private static Logger logger = Logger.getAnonymousLogger();
    public static void main(String[] args) throws InterruptedException {
        int count = 10;
        while (count > 0) {
            logger.info(count + " 秒后运行结束...");
            Thread.sleep(1000);
            count--;
        }
    }
}

注意事项:.java 文件中删除调开始的 package 行,源码中最好不要有中文注释,否则编译时容易报错。

如果执行 java 命令出现:错误: 找不到或无法加载主类。解决办法是:

1)使用管理员身份打开 cmd 执行命令,如果还不行,则执行第二步后,再使用管理员打开 cmd 继续操作

2)1.8 版本JDK "删除环境CLASSPATH变量"

如果javac命令报错如下,则调整.java文件的编码为 GB2312(简体中文)

PS D:\temp\redisClear> javac ./StartAll.java
.\StartAll.java:12: 错误: 编码GBK的不可映射字符
        System.out.println("intervalTime(鏈嶅姟鍓嶅悗杩愯闂撮殧-姣,榛樿30绉?) = " + intervalTime);

4、传递参数给 public static void main(String[] args) 程序入库方法(多个参数时用空格隔开):java HelloWorld param1 param2 param3

jar.exe 打包

1、jar 命令可用于将整个整个项目打包成一个 jar 包,可以看出一个 java 格式的压缩包。

2、通常有以下情况需要进行打包:

1)项目作为工具类或者其它原因需要被其它项目引用,此时可以将项目打包成 jar 文件,导入到其它项目中即可。
2)如果项目提供 Main 方法入口,需要像  exe 程序一样直接运行时,此时也应该打包成 jar 包。

3、jar 命令同样是 jdk 自带的命令,在 %JAVA_HOME%/bin 目录下可以找到。

4、jar 包中有一个 META-INF\MANIFEST.MF 文件,打包时会自动生成。manifest 是证明、货单的意思,比如程序的入口类就需要在其中指明,这样运行时才能找到程序的入口。

5、命令行直接输入 jar 可以看到详细的用法与选项:

PS E:\wmx\Log> jar
用法: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
选项:
    -c  创建新档案
    -t  列出档案目录
    -x  从档案中提取指定的 (或所有) 文件
    -u  更新现有档案
    -v  在标准输出中生成详细输出
    -f  指定档案文件名
    -m  包含指定清单文件中的清单信息
    -n  创建新档案后执行 Pack200 规范化
    -e  为捆绑到可执行 jar 文件的独立应用程序
        指定应用程序入口点
    -0  仅存储; 不使用任何 ZIP 压缩
    -P  保留文件名中的前导 '/' (绝对路径) 和 ".." (父目录) 组件
    -M  不创建条目的清单文件
    -i  为指定的 jar 文件生成索引信息
    -C  更改为指定的目录并包含以下文件
如果任何文件为目录, 则对其进行递归处理。
清单文件名, 档案文件名和入口点名称的指定顺序
与 'm', 'f' 和 'e' 标记的指定顺序相同。

示例 1: 将两个类文件归档到一个名为 classes.jar 的档案中:
       jar cvf classes.jar Foo.class Bar.class
示例 2: 使用现有的清单文件 'mymanifest' 并
           将 foo/ 目录中的所有文件归档到 'classes.jar' 中:
       jar cvfm classes.jar mymanifest -C foo/ .

6、下面再新建一个 HelloFriend.java 源文件,结合上面的已经编译好的 HelloWorld.class 进行打包:

import java.util.logging.Logger;
public class HelloFriend {
    private static Logger logger = Logger.getAnonymousLogger();

    public static void main(String[] args) throws InterruptedException {
        int count = 10;
        while (count > 0) {
            logger.info("ÅóÓÑÄãºÃ£¡"+count);
            Thread.sleep(1000);
            count--;
        }
    }
}

jar -cfv hello.jar HelloFriend.class HelloWorld.class :打包成功。

java.exe 执行

1、java.exe 用于运行 java 字节码文件,由 java 虚拟机对字节码进行解释和运行。比如执行 .class 字节码文件和 .jar 程序等。同样在 %JAVA_HOME%/bin 目录下。

3、命令行直接输入 java 可以看到详细的用法与选项。

java  -cp

示例1:java  -cp xxx.jar MainClass:可以查找 jar 中的指定类作为程序的入口类,然后执行。

java -cp hello.jar HelloWorld:表示以 hello.jar 中的 HelloWorld 为入口类进行运行程序。
java -cp hello.jar HelloFriend:表示以 hello.jar 中的 HelloFriend为入口类进行运行程序。
注意:最后的入口类必须是全路径,本例是因为 HelloWorld、HelloFriend 直接在根目录下,所以才这样,如实际中格式应该是:com.lct.main.HelloWorld

MANIFEST.MF

1、除了使用 -cp 选项指定 jar 文件中的入口类,也可以直接修改其中的 META-INF\MANIFEST.MF 清单文件,在其中添加一行指定程序主类(入口类),格式如下所示:

Main-Class: com.wmx.main.HelloWorld

2、提醒清单文件在指定了 Main-Class 之后,可以直接双击 jar 文件进行运行,如同运行 exe 文件一样。 

java -jar

1、java -jar 命令是Java开发中用于运行可执行JAR(Java Archive)文件的一种方式。JAR文件是一种文件格式,用于将多个Java类文件、相关元数据和资源(如文本、图片等)打包成一个文件,便于分发、部署和版本控制。

2、java -jar 命令的基本语法如下,运行这个命令时,Java虚拟机(JVM)会查找JAR文件中META-INF目录下的MANIFEST.MF文件。MANIFEST.MF文件指定了JAR文件的元数据,包括主类(Main-Class)、第三分依赖包位置等信息。JVM会加载并执行这个主类的main方法。

java [-options1 -options2 ...] -jar xxx.jar [args1 args2 ...]

1)args:用于传递给启动类中 main(String[] args) 方法的参数值;
2)options:用于优化JVM的性能(Sun JVM 常用参数)或配置系统属性。这些参数可以与-jar选项一起使用,例如:
    • -Xms<size>:设置Java堆的初始大小。
    • -Xmx<size>:设置Java堆的最大大小。
    • -Xss<size>:设置每个线程的栈大小。
    • -D<property>=<value>:设置系统属性。
    • -verbose:class:打印类加载信息。
    • -verbose:gc:打印垃圾回收信息。
3)示例:java -Xms256m -Xmx512m -jar HelloWorld.jar  --server.port=8082 --server.servlet./context-path=/coco

javaw.exe 命令

1、javaw.exe 命令与 java.exe 命令在使用上完全一样,区别在于:

1)java.exe 执行文件时,会在命令行中输出程序中的所有输出信息,如 System.out.println(“xxx”) 打印的信息,以及各种日志信息,如 java.util.logging.Logger 等等。
2)javaw.exe 执行文件时,不会输出程序中的任何打印信息。
3)java.exe 运行程序后,任务管理器中进程名称为 java,javaw.exe 运行程序后,任务管理器中的进程名称为 javaw。

2、一言以蔽之:如果想在命令行中看到程序中打印信息,则可以使用 java.exe 命令。反之如果不想看到调试信息,则可以用 javaw.exe 命令。

3、下面修改 HelloWorld.java 文件,简单的演示一下 java、javaw 的区别。

import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.logging.Logger;

/**
 * Created by Administrator on 2019/4/5 0005.
 */
public class HelloWorld {
    private static Logger logger = Logger.getAnonymousLogger();

    public static void main(String[] args) throws InterruptedException, IOException {
        int count = 1;
        File file;
        while (count <= 10) {
            logger.info("创建第 "+(count++) + " 个文件,总数 10 个...");
            file = new File(new Date().getTime() + "");
            file.createNewFile();
            Thread.sleep(1000);
        }
    }
}

4、下面再使用 javaw.exe 命令来执行:

中间 java 命令输出到第 2 个之所以停了,是因为按了 Ctrl + C 强制退出程序了。
java、javaw 执行 jar 文件也是同理,不再累述。

替换 .jar 包 class 文件

1、假如生产上的服务突然出现了一个 bug,而本地开发环境的改动的内容与生产上已经很大了,一时半会没办法立即发布新版本,这个时候就可以采用替类的方式,将影响降低到最小。

2、先把生产上的 .jar 或者 .war 包下载下来。

3、本地环境找到生产版本时期的 bug 所在类的源码,然后进行修复,让 IDE 自动编译,然后找到编译后 .class 文件。

4、最后将修复后 .class 文件替换生产包中的文件。

5、替换 .class 文件时,需要注意如下:

5.1、如果是非第三方依赖包的 .class 文件,则可以使用任意压缩软件打开,然后将新的 .class 文件拖进去替换即可,如下所示。

5.2、如果是第三方依赖包的 .class 文件,则亲测使用 7-zip 压缩工具会有问题,启动服务时报错如下,原因是将第三方依赖包拖进目标包的时候,又被重现压缩了一次,所以导致最终服务起不来了。

    java.lang.IllegalStateException: Unable to open nested entry 'BOOT-INF/lib/xxx-xxx.jar'。

5.3、推荐使用 WinRAR,它有一个功能 "不压缩直接存储的文件",操作如下:先第三方 jar 包提取出来,然后替换 .class 文件,最后再将第三方 jar 包替换回去。它还能根据文件名(包括扩展名,比如 Person.class)快速查找并定位文件的位置,简直太方便了。

winrar 压缩软件下载地址WinRAR archiver, a powerful tool to process RAR and ZIP files

脚本启停 spring boot Jar 包服务

1、windows 系统可以使用 .bat 脚本、Linux 系统可以使用 .sh 脚本。.jar、.war 包都是同理。

2、通过脚本来控制 Spring Boot 应用的启停是一种常见的做法,这种方式可以简化操作,提高效率,同时也有利于自动化部署和管理

3、根据实际情况,可以定制这些脚本,例如添加启动参数、日志记录、错误处理等。当 application.properties 或 application.yml 文件在 xxx.jar 应用同目录下时,可以省略 --spring.config.location,直接双击运行,它会自动读取当前目录下的配置 application.properties 或 application.yml 文件。可以在命令行中指定其它 spring boot 参数,如:--server.port=8082 --server.servlet./context-path=/xxx

Windows 系统 bat 启动项目jar包

1、Windows 系统中,在 jar、war 同目录下新建一个 startup.bat 文件,然后输入如下内容,后续可以直接双击此 bat 文件进行启动服务。

@echo on
title grp-workflow-server2-springcloud-2.3.0-SNAPSHOT.jar
chcp 65001
java -jar -Xms128m -Xmx128m grp-workflow-server2-springcloud-2.3.0-SNAPSHOT.jar
pause

1)chcp 65001解决cmd命令行中存在中文乱码问题。

2)grp-workflow-server2-springcloud-2.3.0-SNAPSHOT.jar 是服务包,war包也是一样

2、当有多个服务使用了 bat 脚本启动时,为了方便,可以再新建一个批量启动的 bat 脚本 startAll.bat,用它来执行这些 startup.bat 脚本,这样便可以一键启动全部服务。

cd ./00_Redis-x64-5.0.14.1
start start.bat

ping -n 5 127.1>nul

cd ../01_eureka-server2
start startup.bat

ping -n 30 127.1>nul

cd ../02_gateway-server3
start startup.bat

ping -n 35 127.1>nul

cd ../03_oauth2-server3
start startup.bat

......以此类推

ping -n 80 127.1>nul

cd ../13_frs
start startup_new_frs-server2-2.3.0.bat

ping -n 5 127.1>nul

 Linux 系统 shell 启停项目jar包

1、在服务包的同目录下,创建 start.sh 启动脚本文件,并添加以下内容:

#!/bin/bash
##############################################################################
# 功能:启动 method-logger-server Java 应用(自动识别此前缀开头的JAR包)
# 使用方式:直接运行脚本即可,无需传入参数
# 示例:bash start.sh
# 注意:请根据服务器配置调整 JVM 参数(Xms/Xmx 等)
##############################################################################

# ====================== 核心配置(仅需维护基础标识)======================
# 应用核心标识(匹配JAR包前缀)
APP_ID="method-logger-server"
# JVM参数配置(根据服务器内存调整,示例:4核8G服务器建议Xms2G Xmx4G)
JVM_OPTS="-Xms512m -Xmx512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai"
# 日志输出目录(自动创建,日志文件按日期命名)
LOG_DIR="./logs"
LOG_FILE="${LOG_DIR}/$(date +%Y%m%d).log"
# ==========================================================================

# 检查jps命令是否存在
if ! command -v jps &> /dev/null; then
    echo "❌ 错误:未找到jps命令!请确保已安装JDK并配置JAVA_HOME环境变量"
    exit 1
fi

# ====================== 自动识别JAR包核心逻辑 ======================
# 查找当前目录下以APP_ID开头的JAR包(排除目录,仅匹配文件)
MATCHED_JARS=($(ls -1 "${APP_ID}"*.jar 2>/dev/null | grep -v '/$'))

# 处理匹配结果
if [ ${#MATCHED_JARS[@]} -eq 0 ]; then
    echo "❌ 错误:当前目录未找到以 ${APP_ID} 开头的JAR包!"
    exit 1
elif [ ${#MATCHED_JARS[@]} -gt 1 ]; then
    echo "❌ 错误:找到多个以 ${APP_ID} 开头的JAR包,请清理多余文件!"
    echo "匹配到的JAR包:"
    for jar in "${MATCHED_JARS[@]}"; do
        echo "  - $jar"
    done
    exit 1
else
    # 唯一匹配的JAR包赋值
    JAR_FILE="${MATCHED_JARS[0]}"
    echo "✅ 自动识别到JAR包:$JAR_FILE"
fi
# ==========================================================================

# 检查进程是否已启动(避免重复启动)
PID=$(jps -l | grep "$APP_ID" | awk '{print $1}')
if [ -n "$PID" ]; then
    echo "⚠️  $APP_ID 已启动,进程ID:$PID,无需重复启动"
    exit 0
fi

# 创建日志目录(不存在则创建)
if [ ! -d "$LOG_DIR" ]; then
    mkdir -p "$LOG_DIR"
    echo "📁 日志目录不存在,已创建:$LOG_DIR"
fi

# 启动应用(后台运行,日志重定向)
echo "🚀 正在启动 $APP_ID ..."
echo "📋 JVM参数:$JVM_OPTS"
echo "📄 日志文件:$LOG_FILE"

# nohup 后台启动,& 放入后台运行,输出重定向到日志文件
nohup java $JVM_OPTS -jar $JAR_FILE > $LOG_FILE 2>&1 &

# 等待10秒,让进程完成启动
sleep 10

# 检查启动是否成功
NEW_PID=$(jps -l | grep "$APP_ID" | awk '{print $1}')
if [ -n "$NEW_PID" ]; then
    echo "✅ $APP_ID 启动成功!进程ID:$NEW_PID"
    echo "🔍 日志查看命令:tail -n 50 -f $LOG_FILE"
else
    echo "❌ $APP_ID 启动失败!请查看日志:$LOG_FILE"
    exit 1
fi

1)使用 nohup 命令将程序以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端,通俗的说就是程序进行后台运行。 

2)将控制台日志记录在当前目录下日志文件中,如果将日志的输出目录设置为 /dev/null,则表示放弃记录日志。

2、在服务包的同目录下,创建 stop.sh 停止脚本文件,并添加以下内容:

#!/bin/bash
##############################################################################
# 功能:终止指定的Java应用进程(固定标识: method-logger-server)
# 使用方式:直接运行脚本即可,无需传入参数
# 示例:bash stop.sh
##############################################################################

# 固定定义Java应用核心标识(比如匹配method-logger-server3.6.0(build20260205)_SP.jar)
APP_ID="method-logger-server"

# 检查jsp命令是否存在(避免JDK未配置的情况)
if ! command -v jps &> /dev/null; then
    echo "错误:未找到jps命令!请确保已安装JDK并配置JAVA_HOME环境变量"
    exit 1
fi

# 用jps -l查找匹配的Java进程PID(仅提取PID,过滤无关行)
# 匹配包含APP_ID的Java进程(即method-logger-server开头的JAR包)
PID=$(jps -l | grep "$APP_ID" | awk '{print $1}')

# 检查进程是否存在
if [ -z "$PID" ]; then
    echo "✅ 未找到标识为 $APP_ID 的Java进程(对应JAR包),无需终止"
    exit 0
fi

echo "🔍 找到Java进程:PID=$PID(对应应用:$APP_ID)"

# 第一步:温柔终止(给进程释放资源的时间)
echo "📝 尝试温柔终止进程 $PID..."
kill "$PID" > /dev/null 2>&1
# 休眠10秒后进行检测
sleep 10

# 检查是否终止成功
if ! jps -l | grep -w "$PID" &> /dev/null; then
    echo "✅ Java进程 $PID 已温柔终止"
    exit 0
fi

# 第二步:温柔终止失败,强制终止(兜底方案)
echo "⚠️  温柔终止失败,尝试强制终止进程 $PID..."
kill -9 "$PID" > /dev/null 2>&1

# 最终验证终止结果
if ! jps -l | grep -w "$PID" &> /dev/null; then
    echo "✅ Java进程 $PID 已强制终止"
else
    echo "❌ 终止Java进程 $PID 失败!请检查权限或进程状态"
    exit 1
fi

3、在使用这些脚本之前,需要确保它们具有执行权限,可以使用 chmod 命令添加执行权限:

chmod +x start.sh stop.sh

4、最后可以使用脚本来启动和停止 Spring Boot 应用了。

# 启动应用
./start.sh

# 停止应用
./stop.sh

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐