今天在寫聊天程序,終於寫到雙方通信的時候,發現idea只能開一個客戶端。雖說可以開多線程來實現多開,但是懶得改動代碼,所以我就試試能不能把jar包導出來運行。首先我用maven自帶的工具打了jar包,然后放到桌面。運行命令:
java -jar xxxx.jar
報錯:沒有.jar中主清單屬性,搜索后得知要指定main函數所在位置,所以我又運行命令指定了主類(包名+類名):
java -cp xxx.jar com.xxx.xxx.NettyServer
又報錯,錯誤如圖:
看這個似乎是沒有找到依賴,所以我又把jar包解壓看了一下:
還真沒有lib文件夾,這里依賴了fastjson、netty、slf4j等外部庫,所以我就搜索了一下如何導出可以運行的jar包:
搜索到一篇靠譜的文章 (project structure-->project settings-->Artifacts-->+-->jar-->按照步驟指定lib和main函數,輸出目錄指定resources,里面會生成MAINFEST文件,指定主類位置。-->build -->build ArtiFacts-->out目錄下面找jar包)
按照教程果然導出來可以運行的jar包,導出的包里面有一個MANIFEST.MF文件指定了jar包中主類的位置,但是我的這個jar包里面有兩個要啟動的項目,一個是服務端,一個是客戶端,都在一個包里面,所以我又探索能不能傳入參數,來控制啟動哪一個包。我先考慮到main函數有args參數,在命令行輸入參數,不知道能不能由args字符串數組接收到,所以我寫了一個簡單的測試:
import java.util.Scanner; public class TestMainArgs { public static void main(String[] args) { System.out.println("外界傳入參數:"); for (String arg : args) { System.out.println(arg); } Scanner scanner = new Scanner(System.in); System.out.println("輸入任意字符結束"); scanner.next(); } }
放在桌面,使用命令編譯:
javac XXX.java
然后運行,發現可以傳入多個參數:
所以我在項目里面添加了一個類,接受命令再根據命令執行對應的主類(其實也可以調用任意的函數):
public class SelectServerCommand { public static void main(String[] args) { if (args.length>0){ exec(args); }else{ System.out.println("在java -jar XXX.jar后面帶上server開啟服務端,client開啟客戶端:"); } } public static void exec(String[] args) { if ("server".equals(args[0])){ NettyServer.main(args); }else if ("client".equals(args[0])){ NettyClient.main(args); }else { System.out.println("無法識別的命令!"); } } }
效果良好:
指定server:
指定client:
最后傳到虛擬機試一試:
成功在虛擬機部署了服務端,並且本地連接成功可以通信!這樣的部署只需要一個jar包要管理,真的很方便。就是配置文件不知道怎么搞,還要繼續試驗。