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

Spring 开发问题

  •  
  •   nnegier · 2023-08-30 05:31:26 +08:00 · 3386 次点击
    这是一个创建于 449 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    第 1 条附言  ·  2023-08-30 09:54:15 +08:00
    服务器是 ubuntu
    21 条回复    2023-08-31 10:47:41 +08:00
    Imindzzz
        1
    Imindzzz  
       2023-08-30 06:26:05 +08:00
    nohup
    tairan2006
        2
    tairan2006  
       2023-08-30 07:31:19 +08:00 via Android
    Linux 的话 Systemd 就行
    Windows 就 nssm
    Noita
        3
    Noita  
       2023-08-30 08:17:45 +08:00 via Android
    linux screen
    heeeeeem
        4
    heeeeeem  
       2023-08-30 08:41:10 +08:00
    1.nohup java -jar xxx.jar &
    2.手动部署,需要每次 kill
    3.idea 有云服务商的插件,可以上传包并执行命令
    Bingchunmoli
        5
    Bingchunmoli  
       2023-08-30 08:42:08 +08:00 via Android
    screen ,nuhup 配合&,或者做成服务
    unfrost
        6
    unfrost  
       2023-08-30 08:47:44 +08:00
    啊这,不管是 Linux 还是 Windows 都直接打成服务启动就好了,做成 jar 。Linux 做一个 System 文件 systemctl start/stop service_name ,就好了。Windows 的话 可以找一下 Git 上的打服务的工具 https://github.com/winsw/winsw ; IDE 直接部署服务器可以去了解一下 jenkins [但是这个一般是用于集成测试,实际生产环境应该都是手动部署的吧]
    Ayanokouji
        7
    Ayanokouji  
       2023-08-30 09:08:54 +08:00
    msaionyc
        8
    msaionyc  
       2023-08-30 09:09:15 +08:00
    nohup
    每次部署之前查服务进程 id 然后 kill 掉,再 java -jar 。
    你可以把这套东西做成脚本,直接执行。包括拉代码,打包,部署的整套流程都可以在脚本里执行
    nothingistrue
        9
    nothingistrue  
       2023-08-30 09:34:27 +08:00
    先学习一些 Linux 、Windows 上控制后台程序的简单知识。
    mango88
        10
    mango88  
       2023-08-30 09:49:55 +08:00
    supervisor
    Oneice
        11
    Oneice  
       2023-08-30 09:56:22 +08:00
    通过 Maven 插件实现自动部署: https://gitee.com/dt_research_institute/deploy-helper
    ljsh093
        12
    ljsh093  
       2023-08-30 09:58:57 +08:00
    javaw -jar
    imokkkk
        13
    imokkkk  
       2023-08-30 10:09:05 +08:00   ❤️ 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  
       2023-08-30 10:41:56 +08:00
    可以看看 java service wrapper
    sankooc
        15
    sankooc  
       2023-08-30 13:42:34 +08:00
    pm2
    dog82
        16
    dog82  
       2023-08-30 15:18:04 +08:00
    你得用 springboot 才能打可执行 jar 包哈
    javak
        17
    javak  
       2023-08-30 15:50:03 +08:00 via iPhone
    200 块,我手把手教你
    S4msara
        18
    S4msara  
       2023-08-30 16:07:12 +08:00
    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  
       2023-08-30 16:39:15 +08:00
    推荐一个优质的 spring/boot/data/security/cloud 的中文文档,无广告,无须登录,无须关注,在线读。

    https://springdoc.cn/docs/
    EscYezi
        20
    EscYezi  
       2023-08-31 01:22:07 +08:00 via iPhone
    可以用 pm2 管理启动停止,比 systemd 简单不少
    tgich
        21
    tgich  
       2023-08-31 10:47:41 +08:00
    写一个 sh 脚本来启动 jar
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1411 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:20 · PVG 01:20 · LAX 09:20 · JFK 12:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.