1.項目maven結構:
項目地址:
https://github.com/KouReal/Rpc-Netty-Registry
2.之前沒有在pom.xml中添加spring-boot-maven-build插件,只有在父工程的pom.xml中寫了maven-compiler-plugin這個插件,所以項目只能在eclipse中選中主類run as java application,后來添加了(父工程和子模塊都添加了):
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.1.8.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
3.之后可以在cmd切到項目某個模塊的根目錄,比如RegistryCenter(啟動優先級最高),運行mvn clean package -Dmaven.test.skip=true打包,運行mvn spring-boot:run -Dmaven.test.skip=true運行(界面顯示初次運行會下載很多springboot-core文件還有其他的slfj等等插件,在eclipse中運行不會顯示)
注意:錯誤命令演示:使用java命令沒有用到spring-boot的maven插件,所以會報錯:“NoClassDefFoundError”
后來參考官方文檔,學習到了mvn spring-boot:repackage命令,通過這個命令打包,可以使用java -jar運行,
於是對這個模塊使用:mvn spring-boot:repackage -Dmaven.test.skip=true
結果:
查stackoverflow,應該用:mvn clean install spring-boot:repackage -Dmaven.test.skip=true
然后可以在target目錄用java -jar運行jar包了:
使用repackage命令的作用是對原始的maven打包好的jar文件或war文件進一步打包,添加一些運行時的依賴資源,生成一個更大的jar 包,這個jar包就可以用java -jar運行了。
在linux中運行jar包的命令: java -jar xx.jar
后台nohup運行,同時將標准輸出和錯誤重定向: nohup java -jar xx.jar >xx.log 2>1& &
停止jar包的運行:
(1)pid=`ps -ef | grep xx | grep -v grev | awk '{print $2}'`
(2)kill -9 pid
編寫shell腳本實現:啟動,停止,重啟,狀態
#!/bin/bash export JAVA_HOME=/root/tools/jdk1.8.0_181 export JRE_HOME=/$JAVA_HOME/jre export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin #這里可替換為你自己的執行程序,其他代碼無需更改 APP_NAME=/root/app/springBoot/robotcenter.jar #使用說明,用來提示輸入參數 usage() { echo "Usage: sh robotcenter.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 -jar ${APP_NAME} >robotcenter.out 2>&1 & 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 sleep 5 start } #根據輸入參數,選擇執行對應方法,不輸入則執行使用說明 case "$1" in "start") start ;; "stop") stop ;; "status") status ;; "restart") restart ;; *) usage ;; esac
查看日志:
cat xx.log, less, more都不能動態看到日志的變化,
tail -f xx.log可以動態看到日志變化