Linux环境下运行jar包的几种方式(附详细案例)

Linux环境下运行jar包的几种方式(附详细案例)目录一 引言二 运行 jar 包 1 方式一 2 方式二 3 方式三三 脚本方式一 引言在学习过程中 我们大部分都是在 windows 等非 Linux 环境下进行开发 测试 部署等 但是在实际的工作当中 应用基本都是部署在 Linux 环境下 因此我们要熟悉 Linux 环境下应用的部署测试 如果做开发的还要兼职运维工作的话 那就更有必要掌握 Linux 环境下应用的部署方式

目录

 

一、 引言

二、运行jar包

1、方式一

2、方式二

3、方式三

三、脚本方式


一、 引言

    在学习过程中,我们大部分都是在windows等非Linux环境下进行开发、测试、部署等。但是在实际的工作当中,应用基本都是部署在Linux环境下,因此我们要熟悉Linux环境下应用的部署测试。如果做开发的还要兼职运维工作的话,那就更有必要掌握Linux环境下应用的部署方式。

      在Linux当中,运行jar包主要有以下几种方式。

      为了直观,本文还是以一个实际的项目作为演示,当然,是个极其简单的项目。

      首先,新建一个maven项目,pom.xml文件如下:

 
    
    
    
      4.0.0 
     
    
      ztt 
     
    
      test_jar 
     
    
      1.0-SNAPSHOT 
     
    
      jar 
     
     
      
       
       
         org.apache.maven.plugins 
        
       
         maven-jar-plugin 
        
        
         
          
          
            true 
           
          
            lib/ 
           
          
            hello.TestJar 
           
          
         
        
       
       
       
         org.apache.maven.plugins 
        
       
         maven-compiler-plugin 
        
        
        1.8 
         
           1.8 
          
          
         
           UTF-8 
           
        
       
      
     
   

      注意:在pom.xml里面通过

hello.TestJar
指定了主类,如果不指定,可能会出现“xxx.jar中没有主清单属性”的问题。

      然后,编写一个带main方法的类。

Linux环境下运行jar包的几种方式(附详细案例)

package hello; public class TestJar { public static void main(String[] args) { try { System.out.println("TestJar start!"); for (int i = 0; i < 3; i++) { System.out.println("i:" + i); } // 暂停 Thread.sleep(1000 * 10); System.out.println("TestJar finish!"); } catch (InterruptedException e) { e.printStackTrace(); } } } 

     

      如图所示,代码仅实现了简单的打印功能。在程序执行的过程中,我特意让主线程暂停了10秒,是为了在测试过程中方便观察。

      然后,将此jar包放到Linux环境下(建议使用winSCP操作),本文示例如下:

Linux环境下运行jar包的几种方式(附详细案例)

      然后,cd进入到此目录,下面我们开始就通过不同的方式来运行此jar包。

二、运行jar包

 

1、方式一

      命令格式:java -jar jar包名

      [root@localhost test_jar]# java -jar test_jar-1.0-SNAPSHOT.jar

      执行结果如下:

Linux环境下运行jar包的几种方式(附详细案例)

      10s之后,打印最后一行内容。

Linux环境下运行jar包的几种方式(附详细案例)

      分析:执行此命令的时候,程序会先打印前4行内容,然后暂停10s,当前窗口被锁定,无法进行其它操作,直到暂停时间结束,main方法执行完毕,当前窗口才解除锁定。

     因此,我们可以看到,此方式运行jar包一个极其严重的缺点:锁定窗口。当然,我可以通过CTRL + C打断程序运行,或直接关闭窗口,程序退出,不过在实际的工作环境中,是绝对不会允许这种粗暴的方式终止的运行,毕竟我们的项目都是给用户提供服务的,程序要是退出了,公司还营不营业了。

2、方式二

      命令格式:java -jar jar包名 &

      [root@localhost test_jar]# java -jar test_jar-1.0-SNAPSHOT.jar &

      执行结果如下:

Linux环境下运行jar包的几种方式(附详细案例)

      分析:&代表在后台运行。优点是当前ssh窗口不被锁定,但是当窗口关闭时,程序终止运行。

      那么我们就会想,如何继续改进,让窗口关闭时,程序仍然运行呢?

3、方式三

      方式三主要是引入nohup命令,具体使用主要包括下面三种方式。

(1)命令格式:nohup java -jar jar包名 &

      [root@localhost test_jar]# nohup java -jar test_jar-1.0-SNAPSHOT.jar &     

      nohup 意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行。

      当用 nohup 命令运行jar包时,缺省情况下该应用的所有输出被重定向到nohup.out的文件中,除非另外指定了输出文件。

      执行结果如下:

Linux环境下运行jar包的几种方式(附详细案例)

      然后,我们在当前目录下看到了nohup.out文件。

Linux环境下运行jar包的几种方式(附详细案例)

打开nohup.out文件,发现前面所有的输出都重定向到了此文件里面。

Linux环境下运行jar包的几种方式(附详细案例)

(2)nohup java -jar jar包名 > 文件名 &

     [root@localhost test_jar]# nohup java -jar test_jar-1.0-SNAPSHOT.jar > test.txt &

      执行结果如下:

Linux环境下运行jar包的几种方式(附详细案例)

然后,再当前目录下出现test.txt文件。

Linux环境下运行jar包的几种方式(附详细案例)

      大家文件,发现输出都重定向到了test.txt文件里面。

Linux环境下运行jar包的几种方式(附详细案例)

(3)nohup java -jar jar包名 >output 2>&1 &

      [root@localhost test_jar]# nohup java -jar test_jar-1.0-SNAPSHOT.jar >output 2>&1 &

      linux shell中"2>&1"含 义:

      而标准输出又导入文件output里面,所以结果是标准错误和标准输出都导入文件output里面了。

      至于为什么需要将标准错误重定向到标准输出的原因,那就归结为标准错误没有缓冲区,而stdout有。这就会导致 >output 2>output, 文件output被两次打开,而stdout和stderr将会竞争覆盖,这肯定不是我门想要的。

      执行命令,结果如下:

Linux环境下运行jar包的几种方式(附详细案例)

      再当前目录下,出现了output文件,打开查看内容,在第一行出现了一行乱码(编码问题,不影响程序运行)。

      乱码处理之后的原文是:nohup: 忽略输入。其实就是标准错误的内容,因为>output 2>&1的作用是将标准输出和标准错误都重定向到output文件里。

Linux环境下运行jar包的几种方式(附详细案例)

(4)nohup java -jar jar包名 >/dev/null 2>&1 &

      [root@localhost test_jar]# nohup java -jar test_jar-1.0-SNAPSHOT.jar >/dev/null 2>&1 &

      这里谈一下/dev/null文件的作用。/dev/null是一个虚拟的空设备,可以看作是一个"黑洞",黑洞的特性是只进不出,哪怕是光都逃不掉,/dev/null亦是如此。

      它等价于一个只写文件,所有写入它的内容都会永远丢失。如果尝试从它那儿读取内容,那么什么也读不到。

      明白了/dev/null之后,我们再来看这个命令。>/dev/null 表示将标准输出信息重定向到"黑洞",2>&1 表示将标准错误重定向到标准输出,由于标准输出已经重定向到“黑洞”了(即:标准输出此时也是"黑洞"),再将标准错误输出定向到标准输出,相当于标准错误输出也被定向至“黑洞”。

      执行上述命令,不同于前面的那些命令,可以看到各种标准输出,这里什么也看不到。

三、脚本方式

      脚本方式的本质依然是上面介绍的那些命令,只不过shell脚本更加的方便,并且可以干更多的事情。

      这里依然以test_jar-1.0-SNAPSHOT.jar这个小demo为例,编写如下脚本test_jar.sh:

#!/bin/bash #这里可替换为你自己的执行程序,其他代码无需更改 APP_NAME=test_jar-1.0-SNAPSHOT.jar #使用说明,用来提示输入参数 usage() { echo "Usage: sh 脚本名.sh [start|stop|restart|status]" exit 1 } #检查程序是否在运行 is_exist(){ pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' ` #如果不存在返回1,存在返回0 if [ -z "${pid}" ]; then return 1 else return 0 fi } #启动方法 start(){ is_exist if [ $? -eq "0" ]; then echo "${APP_NAME} is already running. pid=${pid} ." else nohup java -Xmx512m -Xms512m -jar $APP_NAME > test2.txt 2>&1 & echo "${APP_NAME} start success" fi } #停止方法 stop(){ is_exist if [ $? -eq "0" ]; then kill -9 $pid else echo "${APP_NAME} is not running" fi } #输出运行状态 status(){ is_exist if [ $? -eq "0" ]; then echo "${APP_NAME} is running. Pid is ${pid}" else echo "${APP_NAME} is NOT running." fi } #重启 restart(){ stop start } #根据输入参数,选择执行对应方法,不输入则执行使用说明 case "$1" in "start") start ;; "stop") stop ;; "status") status ;; "restart") restart ;; *) usage ;; esac 

      然后,执行这个脚本:

Linux环境下运行jar包的几种方式(附详细案例)

 

Linux环境下运行jar包的几种方式(附详细案例)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209703.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午8:36
下一篇 2026年3月19日 上午8:37


相关推荐

  • 腾讯元宝上线混元T1正式版⭍epSeek V3最新版

    腾讯元宝上线混元T1正式版⭍epSeek V3最新版

    2026年3月12日
    2
  • pycharm 批量修改变量名

    pycharm 批量修改变量名背景 当代码已经写得差不多 需要修改某个变量名时 挨个修改太麻烦了 可通过下述方法进行批量修改 如下介绍 方法一 rename 方法 1 把光标移动到要修改的变量名称上 2 右键 refactor rename 确定 3 在弹出来的框中 选择 renamecodeoc 即修改所有重复出现的变量名 4 变量周围出现红色框 修改变量 确定 5 其他位置的该变量会被同时修改

    2026年3月27日
    2
  • 透彻解读mysql的可重复读、幻读及实现原理

    透彻解读mysql的可重复读、幻读及实现原理目录一 事务的隔离级别二 mysql 怎么实现的可重复读举例说明 MVCC 的实现 MVCC 逻辑流程 插入 MVCC 逻辑流程 删除 MVCC 逻辑流程 修改 MVCC 逻辑流程 查询三 幻读快照读和当前读四 如何解决幻读事务隔离级别有四种 mysql 默认使用的是可重复读 mysql 是怎么实现可重复读的 为什么会出现幻读 是否解决了幻读的问题 一 事务的隔离级别 Re

    2026年3月18日
    2
  • 字符串之切片

    字符串概念及作用字符串相关操作索引Python的字符串是不可以改变的字符序列正向索引:s=”ABCD”s[0]#As[4]#D反向索引:s[-4]#As[-1]#D切片

    2022年3月29日
    49
  • 【微信开放平台】微信第三方扫码登录(亲测可用)「建议收藏」

    【微信开放平台】微信第三方扫码登录(亲测可用)「建议收藏」开放平台需要企业认证才能注册,正好这次公司提供了一个账号,调通以后,就顺便写一篇博客吧。公众平台与开放平台的区别微信开放平台主要面对移动应用/网站应用开发者,为其提供微信登录、分享、支付等相关权限和服务。微信公众平台微信公众平台用于管理、开放微信公众号(包括订阅号、服务号、企业号),简单的说就是微信公众号的后台运营、管理系统。这里想吐槽一下,微信基本注册全都要邮箱,公众号一…

    2022年6月4日
    140
  • pycharm中debug的使用[通俗易懂]

    pycharm中debug的使用[通俗易懂]1.未打断点运程序,输出全部结果2.打断点后,点击debug,代码执行到断点前停止(断点所在行不执行)3.stepover,是在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步4.stepinto,是单步执行,遇到子函数就进入并且继续单步执行5.stepout,当单步执行到子函数内时,用StepOut就可以执行完子函数余下部分,并返回到上一层函数如点击下图中stepout,会直接跳转到test(

    2022年8月28日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号