开发者社区> 问答> 正文

一个蛋疼的命令行下运行java classpath设置的问题?报错

问题是这样的,我有一个Java工程,eclipse编译的,引入了几个第三方包,并且有自己的包结构,在eclipse下运行自然不是问题。结构如下:

我现在要运行的是 com.yeepay.service.TestService类,这个类里面import引用了第三方的jar包。我把这些jar包复制了一份放到bin目录下了。

我是这么运行的

E:\data\eclipse\yibaoService\bin>java -classpath E:\data\eclipse\yibaoService\bin com.yeepay.service.TestService

报错。很明显,com/cfca/util/pk/KeyUtil 这个类在我的第三方jar包里。

Exception in thread "main" java.lang.NoClassDefFoundError: com/cfca/util/pk
/KeyUtil
        at com.yeepay.service.TestService.main(TestService.java:32)
Caused by: java.lang.ClassNotFoundException: com.cfca.util.pki.api.KeyUtil
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 1 more

然后这么运行:java -cp E:/data/eclipse/yibaoService/bin/bcmail-jdk14-141.jar;E:/data/eclipse/yibaoService/bin/bcprov-jdk14-141.jar;E:/data/eclipse/yibaoService/bin/CFCACertKitJS;E:/data/eclipse/yibaoService/bin/PKIBASE.jar;E:/data/eclipse/yibaoService/bin/YeePay_HTMLcommon_V3.0.jar; com.yeepay.service.TestService

还是报错。

再然后,把这些jar包扔到jre的lib和ext下,使用上面的两种方法运行,仍然报错。。

我甚至这样:

还是不行。

像这种引用了第三方包的代码,究竟要怎样才能在命令行下运行呢?

展开
收起
爱吃鱼的程序员 2020-06-14 21:05:02 828 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    Maven解决方案是将所有引用的第三方jar包解压后,和你的代码一起打成一个jar包,具体的参考MavenShadePlugin的使用说明。如果你不用Maven,运行java时指定java.ext.dirs到jar包的目录即可。我正在尝试手工解包不过貌似还是不行java-h....看了三个小时能找到的各种手段都尝试了

    -classpath有一个简写参数-cp

    另外,jar包本身就包含完整的class文件集合和路径,因此引入jar包和引入class不同,-cp需要跟jar包的路径,而引入class只需要引入class所在目录即可,这两个不一样。

    有一个奇葩的玩意就是,引入jar包不支持*.jar这种通配,会无法匹配,但是却可以。

    你的命令这样写试试:java-cp.;<spanstyle="font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:14px;line-height:22px;background-color:#FFFFFF;">./ <spanstyle="font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:14px;line-height:22px;background-color:#FFFFFF;">com.yeepay.service.TestService

    <spanstyle="font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:14px;line-height:22px;background-color:#FFFFFF;">再运行不了的话,看看<spanstyle="font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:14px;line-height:22px;background-color:#FFFFFF;">eclipse的输出,能看到eclipse用的命令行参数

    回复<aclass='referer'target='_blank'>@Feng_Yu:eclipse运行server的时候倒是可以看见一大串自定义tomcat的配置参数,运行普通java程序好像没有。还是十分感谢回复<aclass='referer'target='_blank'>@南湖船老大:那就是记错了,很久没用eclipse了,现在都用ideaintellij。intellij是可以看到debug窗口上有详细的java命令行,而且可以在compiler中自定义编译参数我也想过看看eclipse的输出,但是似乎没地方看到最原始的输出。它包装的有点厉害<divclass='ref'>

    引用来自“zfc827”的评论

    Maven解决方案是将所有引用的第三方jar包解压后,和你的代码一起打成一个jar包,具体的参考MavenShadePlugin 的使用说明。如果你不用Maven,运行java时指定java.ext.dirs到jar包的目录即可。

    非常感谢各位的帮助,尤其是<atarget="_blank"rel="nofollow">@zfc827提到的java.ext.dirs参数。

    另外一个问题,也是因为eclipse默默地为我们做了很多事情,隐藏了一些细节,而使用命令行则需要我们自己去处理一些问题。折腾到现在全部搞定。

    其实我就是想在命令行下跑一个deamon守护程序,不想使用tomcat发布服务,太重了。

    2020-06-14 21:05:18
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载