V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nnegier
V2EX  ›  Java

Spring 开发问题

  •  
  •   nnegier · 242 天前 · 3141 次点击
    这是一个创建于 242 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想问一下,怎么部署呢?我目前不是 Docker ,所以我想咨询单机下的部署问题。我目前还是拷了一个 tomcat 到服务器然后解压运行,将 spring 弄成 war 放进去。

    但我知道部分朋友是直接打成 jar 包然后运行,这里我有个疑问,是用的哪个命令呢,java -jar 它显然会独占命令行窗口,其次怎样去管理这些已经跑起来的 jar 呢?是通过查端口号来进行 kill 吗?那这样岂不是每次发新包都要 kill 然后再 run 。

    最后一个问题是,有没有办法在 IDE 里面直接部署到服务器呢? Docker 我知道有种方式可以,但我目前还是单机,故不考虑那种方式。

    我这些问题的根源还是我对这些不熟,不敢动,先行谢谢大家了。

    第 1 条附言  ·  241 天前
    服务器是 ubuntu
    21 条回复    2023-08-31 10:47:41 +08:00
    Imindzzz
        1
    Imindzzz  
       242 天前
    nohup
    tairan2006
        2
    tairan2006  
       241 天前 via Android
    Linux 的话 Systemd 就行
    Windows 就 nssm
    Noita
        3
    Noita  
       241 天前 via Android
    linux screen
    heeeeeem
        4
    heeeeeem  
       241 天前
    1.nohup java -jar xxx.jar &
    2.手动部署,需要每次 kill
    3.idea 有云服务商的插件,可以上传包并执行命令
    Bingchunmoli
        5
    Bingchunmoli  
       241 天前 via Android
    screen ,nuhup 配合&,或者做成服务
    unfrost
        6
    unfrost  
       241 天前
    啊这,不管是 Linux 还是 Windows 都直接打成服务启动就好了,做成 jar 。Linux 做一个 System 文件 systemctl start/stop service_name ,就好了。Windows 的话 可以找一下 Git 上的打服务的工具 https://github.com/winsw/winsw ; IDE 直接部署服务器可以去了解一下 jenkins [但是这个一般是用于集成测试,实际生产环境应该都是手动部署的吧]
    Ayanokouji
        7
    Ayanokouji  
       241 天前
    msaionyc
        8
    msaionyc  
       241 天前
    nohup
    每次部署之前查服务进程 id 然后 kill 掉,再 java -jar 。
    你可以把这套东西做成脚本,直接执行。包括拉代码,打包,部署的整套流程都可以在脚本里执行
    nothingistrue
        9
    nothingistrue  
       241 天前
    先学习一些 Linux 、Windows 上控制后台程序的简单知识。
    mango88
        10
    mango88  
       241 天前
    supervisor
    Oneice
        11
    Oneice  
       241 天前
    通过 Maven 插件实现自动部署: https://gitee.com/dt_research_institute/deploy-helper
    ljsh093
        12
    ljsh093  
       241 天前
    javaw -jar
    imokkkk
        13
    imokkkk  
       241 天前   ❤️ 2
    run.sh


    #!/bin/sh
    function runShell() {
    #set jvm heap size
    JVM_ARGS="-Xms256M -Xmx1g -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M"
    #打印 GC 日志
    #JVM_ARGS=${JVM_ARGS}" -XX:+PrintGCDetails -Xloggc:jvm.log -XX:+PrintGCDateStamps "
    #when jvm oom, auto generate dump file
    JVM_ARGS=${JVM_ARGS}" -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=sdm_oom.hprof "
    #jasypt 加解密
    JVM_ARGS=${JVM_ARGS}" -Djasypt.encryptor.password=deviskaifa "
    #JVM_ARGS=${JVM_ARGS}" -Djasypt.encryptor.algorithm=PBEWithMD5AndDES "

    ## 设置临时目录
    TMP_DIR=./tmp
    if [ ! -d $TMP_DIR ];then
    mkdir $TMP_DIR
    else
    echo tmp dir $TMP_DIR exist
    fi
    TMP_DIR_ARG=" -Djava.io.tmpdir="${TMP_DIR}

    ##### 开启 jmx ,方便使用 JVisualVM 监控系统
    # -Dcom.sun.management.jmxremote.port=1099 这个是配置远程 connection 的端口号的,要确定这个端口没有被占用
    # -Dcom.sun.management.jmxremote.ssl=false 指定了 JMX 是否启用 ssl
    # -Dcom.sun.management.jmxremote.authenticate=false 指定了 JMX 是否启用鉴权(需要用户名,密码鉴权)
    # -Djava.rmi.server.hostname=192.168.1.54 这个是配置 server 的 IP 的
    #JVM_ARGS=${JVM_ARGS}" -Djava.rmi.server.hostname=192.168.1.54 -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

    ### remote debug 开启远程调试
    ## -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
    #JVM_ARGS=${JVM_ARGS}" -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 "

    # 获取启动 jar 包
    JAR_NAME=`ls | grep jar`
    path=$(cd "$(dirname "$0")"; pwd)
    cd $path

    nohup java ${JVM_ARGS} ${TMP_DIR_ARG} -jar ${JAR_NAME} $1 $2 $3 $4 $5 $6 > /dev/null 2>error.log &

    echo $! > tpid
    echo Starting...
    echo please use tailf logs/*.log to check success or not.
    }

    if [ ! -f "tpid" ];
    then
    runShell
    else
    tpid=$(cat "tpid")
    running=$(ps -ef |awk '{print $2}'|grep -w $tpid)
    if [ "$running" ];
    then
    echo "Process(pid:$tpid) is already running."
    else
    runShell
    fi
    fi
    shanghai1943
        14
    shanghai1943  
       241 天前
    可以看看 java service wrapper
    sankooc
        15
    sankooc  
       241 天前
    pm2
    dog82
        16
    dog82  
       241 天前
    你得用 springboot 才能打可执行 jar 包哈
    javak
        17
    javak  
       241 天前 via iPhone
    200 块,我手把手教你
    S4msara
        18
    S4msara  
       241 天前
    1.打成 Jar 包的前提是使用了 Spring Boot ;
    2.java -jar 独占命令行窗口可以使用 nohup java -jar xxx.jar > /dev/null 2>&1 &或者 nohup java -jar xxx.jar > log.out &,区别在于前者不将 console 日志输出到日志文件,后者输出;
    3.ps -ef | grep java 查正在运行中的 Java 程序,如果 jar 包名称存在相同,则用端口查然后 kill -9 ;
    4.如果不想每次都 kill 再 run ,可以自己写 shell 脚本,把发版流程( e.g. 上传新版本到发版目录>关闭运行中程序>拷贝并覆盖旧版本>运行程序)用脚本写好,手动的部分就只有上传新版本到发版目录和运行脚本了,或者可以使用 Jenkins ;
    5.是否使用 Docker 与程序是否单机无关。
    KevinBlandy
        19
    KevinBlandy  
       241 天前
    推荐一个优质的 spring/boot/data/security/cloud 的中文文档,无广告,无须登录,无须关注,在线读。

    https://springdoc.cn/docs/
    EscYezi
        20
    EscYezi  
       241 天前 via iPhone
    可以用 pm2 管理启动停止,比 systemd 简单不少
    tgich
        21
    tgich  
       240 天前
    写一个 sh 脚本来启动 jar
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1088 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:16 · PVG 07:16 · LAX 16:16 · JFK 19:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.