如何在idea中调试可执行jar包

本文整体结构如下:

1. 先大致说明下需求:需要在idea中调试可执行jar包的main方法,

2. 然后给出解决方法

3. 说下我之前用的其他方法

4. 说下如何使用java相关的编译命令(javac)、打包命令(jar)生成本文中的可执行jar包

一、需求说明

如图所示,比如我有一个java项目(ProjectMgmtSystem),目前依赖了一个jar包(mypro.jar) 。

该可执行jar包通常会有一个main方法,以及一大堆的方法以及相关类来实现特定的逻辑。这里虽然做了简化,但依然能体现问题的本质,比如我需要对main方法打断点,一步步测试下代码的执行逻辑。

现在我就想在idea中,对这个jar包里的main方法进行调试。当然有人会说不一定非得使用这种方法,在这里我就是有这个需求,我想采用最直接的方式来测这个jar包里的逻辑(其他方法一会我留到后面再说)

二、解决办法

我一开始在网上找了下,没发现什么有价值的信息。最后回归到问题本身,我就是要测一个main方法,然后我就看了下正常情况下可以点debug的main方法配置是怎样的,然后依葫芦画瓢,也创建了一个配置,发现竟然可以用。配置如下:

按照以上步骤操作后,再次点击debug,就会发现竟然可以调试了。效果如下:

三、其他方法

方法一:

一般在使用可执行jar包(以下均以mypro.jar为例)的时候,我们都是在命令行里直接敲 java -jar mypro.jar

这是最原始的方法,只能看看结果,没有办法去跟踪代码的运行逻辑。

方法二:

还有一个办法,自己在项目里引入mypro.jar,自己创建一个类,然后手动去调用jar包里的main方法(如果只想看里面某个方法的运行逻辑,比如getInfo,就需要用下反射来调用)。

四、如何使用java相关的编译命令(javac)、打包命令(jar)生成本文中的可执行jar包

网上有关如何用idea导出jar包的文章很多也很具体,我就不再重复了。

但是关于如何编译并打包jar说的不是很明确,我写这篇博文之前,也花费了一点时间来进行验证(毕竟做开发平时真正需要用javac,jar命令的机会很少),下面简单记录下操作过程。

因为代码整体比较简单,整个jar包里就一个文件,我就不想去再新建一个项目了,然后在idea中导出jar包;还是选择手动创建文件夹,写了一个Demo类,然后执行几条命令编译出jar包

代码目录结构如下:

D:\javapro下面有一个src目录,

Demo.java代码如下:

 
  1. package com.kittycoder;
  2.  
  3. /**
  4. * Created by shucheng on 2019-10-24 下午 20:26
  5. */
  6. public class Demo {
  7.  
  8. public static void main(String[] args) {
  9. Demo demo = new Demo();
  10. System.out.println(demo.getInfo());
  11. }
  12.  
  13. private String getInfo() {
  14. return "Hello World!";
  15. }
  16. }
 

首先是将.java编译成为.class文件

我首先想到的是这样写,但是这样一会还得来回切换目录,我想起javac有一个sourcepath选项,它可以让你在项目源码目录(D:\javapro\src\com)的上一层目录(D:\javapro\src)执行javac进行编译

当然,你也可以在D:\javapro这个目录下编译,

再验证下能否正常运行,一切正常

然后,将class文件打包到jar包中

再来验证下,可以正常运行

所以,建完文件夹,写好代码以后,我只需要进到D:\javapro\src目录下,执行cmd命令:

 
  1. rem 编译并生成jar包
  2. javac -sourcepath . com/kittycoder/Demo.java&&jar -cvfe mypro.jar com.kittycoder.Demo com/kittycoder/Demo.class
  3. rem 验证jar包能否正常运行
  4. java -jar mypro.jar
 

参考链接:

https://blog.csdn.net/zq_zhang/article/details/53924779

https://www.jb51.net/article/131744.htm

https://blog.csdn.net/scholar_man/article/details/79556263

 

附注:

Test.java:

 
  1. package com;
  2.  
  3. import com.kittycoder.Demo;
  4.  
  5. import java.lang.reflect.Method;
  6.  
  7. /**
  8. * Created by shucheng on 2019-10-24 下午 21:11
  9. */
  10. public class Test {
  11.  
  12. public static void main(String[] args) throws Exception {
  13. Demo demo = new Demo();
  14. // System.out.println(demo.getInfo()); // 编译不通过,无法直接访问私有方法
  15. Method getInfoMethod = Demo.class.getDeclaredMethod("getInfo");
  16. getInfoMethod.setAccessible(true);
  17. System.out.println(getInfoMethod.invoke(demo));
  18. }
  19. }
 

一、   nohup java -jar jarName-0.0.1-SNAPSHOT.jar >msg.log 2>&1 &; 

java  -Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=256M -jar a.jar      分配内存
nohup java -Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=256M -jar blade-admin.jar >log.log 2>&1 &

二、配置jar包启动方式为远程调试启动

找到jar所在路径,进入cmd窗口,命令如下,监听启动5005端口(和程序的端口8089没关系)-远程调试启动语句:

java -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n -jar mac-test-0.0.1-SNAPSHOT.jar

// 普通jar包启动语句java -jar mac-test-0.0.1-SNAPSHOT.jar --spring.profiles.active=test >> /var/log/mac-test.log 2>&1 & 说明:spring.profiles.active=test :对应多环境配置的情况,test指的是测试环境,对应application-test.properties 配置文件,意思是运行测试环境的配置 /var/log/mac-test.log :指把程序运行的日志全部输出到/var/log 下 mac-test.log文件中。一般项目都会配置日志框架,比如log4j等。启动会配置具体的日志输出路径。

edea中配置远程调试:
找到Run这个菜单项,鼠标左键单击,弹出二级菜单,找到Edit configrations 并选择,找到一个+号,点击弹出一个选项框,选择remote选项即可
 
  1. java -jar jarName-0.0.1-SNAPSHOT.jar;

  2. 注: 关闭服务器连接时会关闭此程序进程,(推荐测试可用)

2、将jar程序设置成后台运行,并且将标准输出的日志重定向至文件msg.log

 
  1. nohup java -jar jarName-0.0.1-SNAPSHOT.jar >msg.log 2>&1 &;

  2. 注: nohup命令的作用就是让程序在后台运行,不用担心关闭连接进程断掉的问题了(推荐使用)

 
  1. 详解:

  2. nohup

  3. nohup命令运行由Command参数和任何相关的Arg参数指定的命令,忽略所有挂断(SIGHUP)信号。

  4. 在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup命令,添加 &(表示“and”的符号)到命令的尾部。

  5. nohup是no hang up的缩写,就是不挂断的意思。

  6. nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。

  7. 该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。

  8. 在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中。

  9.  
  10. nohup和&的区别

  11. &:指在后台运行,但当用户推出(挂起)的时候,命令自动也跟着退出

  12. nohup:不挂断的运行,注意并没有后台运行的功能,,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,

  13. 例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行。

  14.  
  15. nohup java -jar jarName-0.0.1-SNAPSHOT.jar >msg.log 2>&1 &;

  16. 在上面的例子中,0:stdin (standard input),1:stdout (standard output),2:stderr (standard error);

  17. 2>&1是将标准错误(2)重定向到标准输出(&1),标准输出(&1)再被重定向输入到msg.log文件中。

nohup java -jar -Xms200M -Xmx500M *.jar --spring.profiles.active=prod --server.port=7002 >logs/*.log 2>&1 &
 

 

posted @ 2025-02-05 14:37  CharyGao  阅读(1264)  评论(0)    收藏  举报