今天在写聊天程序,终于写到双方通信的时候,发现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包要管理,真的很方便。就是配置文件不知道怎么搞,还要继续试验。

让java代码在Idea外面运行起来的更多相关文章

  1. java代码修改了之后运行仍然是原程序

    有的时候java代码改了之后但是运行的程序却没有发生改动,这是什么情况呢?可能懂得的人都觉得十分简单,但对于我这样的小白来说确实很费力.java代码更改后需要编译生成.class文件,说的直白点,这个 ...

  2. 写好的Java代码在命令窗口运行——总结

    步骤: 1.快捷键 win+r,在窗口中输入cmd,enter键进入DOS窗口. 2.假设写好的代码的目录为:D:\ACM 在DOS中依次写入:cd d: cd ACM 利用cd切换到代码文件所在的目 ...

  3. idea编写的java代码,在cmd运行乱码解决方案

    1.解决方案 使用txt打开,另存为的时候选择编码为ANSI 即可.

  4. Notepad++运行JAVA代码

    第一种方法: 工具栏->运行  点击后选择运行 1.在运行窗口中输入: cmd /k javac "$(FULL_CURRENT_PATH)" & echo 编译成功 ...

  5. Java基础之用记事本编辑java代码运行,并且打成jar包后运行

    使用记事本写java代码 1.在d盘新建一个记事本,名字叫做zhanzhuang.java,会询问不可用,是否继续,点击是 2.在里面编辑就如下内容,注意文件的名字要和 class 后面的名字相对应 ...

  6. 用DOS命令来运行Java代码

    用DOS命令来运行Java代码.. ----------------- Demo.java public class Demo { public static void main(String[] a ...

  7. 在Eclipse中运行JAVA代码远程操作HBase的示例

    在Eclipse中运行JAVA代码远程操作HBase的示例 分类: 大数据 2014-03-04 13:47 3762人阅读 评论(2) 收藏 举报 下面是一个在Windows的Eclipse中通过J ...

  8. 智能客服 利用python运行java代码

    因为需要在linux中用python来进行分析,顾需要利用python来运行java中语音转文字和文字转语音代码 在python中运行java代码需要利用jpype

  9. java中成员变量、代码块、构造函数运行顺序

    1.java虚拟机执行程序,首先须要装载类,安装现装载父类,初始化父类的静态代码块和静态成员变量 再load子类. 初始化子类静态代码块和成员变量 2.load完成父类与子类后,从main函数入口运行 ...

随机推荐

  1. Node的express配置使用ejs模板

    注册ejs模板为html页.以.ejs为后缀的模板页,现在的后缀名可以是.html app.engine('.html', require('ejs').__express); 设置视图模板的默认后缀 ...

  2. Linux之防火墙管理篇[Ubuntu:ufw]

    前言 由于近期,腾讯云服务器就要到期了,学生优惠即将失效了,所以准备将数据库和项目迁移到vultr上.然而,在使用nivicat连接mysql数据库的过程中,却屡次出现:Can't connect t ...

  3. java aes CBC的填充方式发现

    如下的java代码,手动对block进行填充后,使其为16的整数倍后,加密的时候竟然强行再填充了16位,我在尝试用golang实现这段加密时,反复修改了很久,发现golang版的总是比java加密出来 ...

  4. Mvc Swagger报错的解决办法。

    报错信息:Not supported by Swagger 2.0: Multiple operations with path ‘xxxx.aspx’ and method 'POST' 解决办法出 ...

  5. [转] GloVe公式推导

    from: https://pengfoo.com/post/machine-learning/2017-04-11 GloVe(Global Vectors for Word Representat ...

  6. python笔记06-10

    作者:Vamei 出处:http://www.cnblogs.com/vamei 基础06  循环 for循环 举例: range的用法 这个函数的功能是新建一个表.这个表的元素都是整数,从0开始,下 ...

  7. iptables系列

    详情请参考:http://www.zsythink.net/archives/tag/iptables/page/2/

  8. Flask+SQLAlchemy+alembic+Flask-RESTful使用

    前言 其实准备把这篇删掉,先写Flask-restful相关的,后来想想大体框架还是先写出来,这两天踩了很多坑,有的谷歌也没有答案.一直摸索也总算是开始了. 正文 SQLAlchemy/alembic ...

  9. Asp.Net Core 项目搭建基础

    很多新接触ASP.NET Core 技术的同学可能会对项目运行机制不了解,会碰到服务在哪添加?路由在哪配置?中间件怎么使用?依赖注入在哪写?诸如此类的问题.同样作为初学者,以下是本人在学习.Net技术 ...

  10. java类型转化

    Java中的父类/子类相互转化问题: 子类可以转成父类:此时子类能调用父类中定义的方法和变量,如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法 父类转成子类:1.如 ...