讓java代碼在Idea外面運行起來


今天在寫聊天程序,終於寫到雙方通信的時候,發現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包要管理,真的很方便。就是配置文件不知道怎么搞,還要繼續試驗。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM