我对java有一个新手问题;无法正确设置类路径。我错过了一些非常基本和微不足道的东西。
我有一个jar文件。 foo.jar,在e:\ bar中。
当目前的目录是e:\ bar
时,这可以从命令行工作java -jar foo.jar <params>
当我将目录更改为e:时,它开始抛出未找到类的异常。所以我设置-cp来指定类路径。无论我到目前为止尝试了什么,它都无法工作
java -cp ".;e:/bar/*;e:/bar/lib/*" -jar bar/foo.jar <params>
java -cp "." -jar bar/foo.jar <params>
....
我总是得到这个例外:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/httpclient/MultiThreadedHttpConnectionManager
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.apache.axis.utils.ClassUtils$2.run(ClassUtils.java:187)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.axis.utils.ClassUtils.loadClass(ClassUtils.java:171)
at org.apache.axis.utils.ClassUtils.forName(ClassUtils.java:112)
at org.apache.axis.deployment.wsdd.WSDDTargetedChain.makeNewInstance(WSDDTargetedChain.java:196)
at org.apache.axis.deployment.wsdd.WSDDDeployableItem.getNewInstance(WSDDDeployableItem.java:310)
at org.apache.axis.deployment.wsdd.WSDDDeployableItem.getInstance(WSDDDeployableItem.java:296)
at org.apache.axis.deployment.wsdd.WSDDDeployment.getTransport(WSDDDeployment.java:470)
at org.apache.axis.configuration.FileProvider.getTransport(FileProvider.java:282)
at org.apache.axis.AxisEngine.getTransport(AxisEngine.java:283)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:179)
at org.apache.axis.client.Call.invokeEngine(Call.java:2564)
at org.apache.axis.client.Call.invoke(Call.java:2553)
at com.ideas.jws.gftservice.GFTMessenger.sendMessage(GFTMessenger.java:1
答案 0 :(得分:0)
-cp
不适用于-jar
。
如果你知道主要的班级名称,那么你可以通过不使用-jar
来解决它:
java -cp ".;e:/bar/*;e:/bar/lib/*;bar/foo.jar" main.class.name.Here <params>
答案 1 :(得分:0)
由于应用程序jar依赖于一组特定的jar,一种常见的做法是:
distribution
├─ myapp.jar
└─ lib
├─ libaaa-1.2.3.jar
└─ libbbb-2-3-4.jar
在应用程序jar的META-INF / MANIFEST.MF中,通常会生成一个Class-Path: ...
条目。
然后,您只能运行应用程序foo.jar
本身。
要自动化此类依赖项,我的个人偏好是使用maven
。 (gradle
也很受欢迎。)