如何在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代码如下:
package com.kittycoder;
/**
* Created by shucheng on 2019-10-24 下午 20:26
*/
public class Demo {
public static void main(String[] args) {
Demo demo = new Demo();
System.out.Info());
}
private String getInfo() {
return "Hello World!";
}
}
⾸先是将.java编译成为.class⽂件,
idea debug
我⾸先想到的是这样写,但是这样⼀会还得来回切换⽬录,我想起javac有⼀个sourcepath选项,它可以让你在项⽬源码⽬录(D:\javapro\src\com)的上⼀层⽬录(D:\javapro\src)执⾏javac进⾏编译
当然,你也可以在D:\javapro这个⽬录下编译,
再验证下能否正常运⾏,⼀切正常
然后,将class⽂件打包到jar包中
再来验证下,可以正常运⾏
所以,建完⽂件夹,写好代码以后,我只需要进到D:\javapro\src⽬录下,执⾏cmd命令:
rem 编译并⽣成jar包
javac -sourcepath . com/kittycoder/Demo.java&&jar -cvfe mypro.jar com.kittycoder.Demo com/kittycoder/Demo.class
rem 验证jar包能否正常运⾏
java -jar mypro.jar
参考链接:
附注:
Test.java:
package com;
import com.kittycoder.Demo;
import flect.Method;
/**
* Created by shucheng on 2019-10-24 下午 21:11
*/
public class Test {
public static void main(String[] args) throws Exception {
Demo demo = new Demo();
// System.out.Info()); // 编译不通过,⽆法直接访问私有⽅法        Method getInfoMethod = DeclaredMethod("getInfo");
getInfoMethod.setAccessible(true);
System.out.println(getInfoMethod.invoke(demo));
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。