让java代码在Idea外面运行起来

今天在写聊天程序,终于写到双方通信的时候,发现idea只能开一个客户端。虽说可以开多线程来实现多开,但是懒得改动代码,所以我就试试能不能把jar包导出来运行。首先我用maven自带的工具打了jar包,然后放到桌面。运行命令:

java -jar xxxx.jar

报错:没有.jar中主清单属性,搜索后得知要指定main函数所在位置,所以我又运行命令指定了主类(包名+类名):

java -cp xxx.jar com.xxx.xxx.NettyServer

又报错,错误如图:

让java代码在Idea外面运行起来

看这个似乎是没有找到依赖,所以我又把jar包解压看了一下:

让java代码在Idea外面运行起来

还真没有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

然后运行,发现可以传入多个参数:

让java代码在Idea外面运行起来

所以我在项目里面添加了一个类,接受命令再根据命令执行对应的主类(其实也可以调用任意的函数):

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("无法识别的命令!");
}
}
}

效果良好:

让java代码在Idea外面运行起来

指定server:

让java代码在Idea外面运行起来

让java代码在Idea外面运行起来

指定client:

让java代码在Idea外面运行起来

让java代码在Idea外面运行起来

最后传到虚拟机试一试:

让java代码在Idea外面运行起来

成功在虚拟机部署了服务端,并且本地连接成功可以通信!这样的部署只需要一个jar包要管理,真的很方便。就是配置文件不知道怎么搞,还要继续试验。

上一篇:HDU1102--最小生成树


下一篇:洛谷P2607 [ZJOI2008]骑士(树形dp)