问题是这样的,我有一个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下,使用上面的两种方法运行,仍然报错。。
我甚至这样:
还是不行。
像这种引用了第三方包的代码,究竟要怎样才能在命令行下运行呢?
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'>非常感谢各位的帮助,尤其是<atarget="_blank"rel="nofollow">@zfc827提到的java.ext.dirs参数。
另外一个问题,也是因为eclipse默默地为我们做了很多事情,隐藏了一些细节,而使用命令行则需要我们自己去处理一些问题。折腾到现在全部搞定。
其实我就是想在命令行下跑一个deamon守护程序,不想使用tomcat发布服务,太重了。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。