我有这样的目录结构:
src
MyPackageFile1.java
MyPackageFile2.java
vendor
something.jar
Example.java
请注意,下面的所有文件 src
有一个 package com.example;
声明,而 Example.java
不属于该包:它是该包的用法示例(因此 import xyz.pushpad.*;
).
我成功地编译了:
javac -classpath vendor/something.jar src/*.java Example.java
但是当我跑步时:
java Example
我得到:
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: com/example/DeliveryException
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: com.example.MyPackageFile1
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 7 more
2条答案
按热度按时间fnatzsnv1#
如果
MyPackageFile1.java
以及MyPackageFile1.java
在包中声明com.example
,那么就有三个问题:源目录结构错误。应该是这样的:
您使用了错误的类路径分隔符。因为您使用的是linux(基于路径名语法),所以类路径分隔符是
:
不是;
.用于运行代码的类路径错误。这个
java
命令行应该是这样的:然而,这一切都是非常黑客。
除非您的代码库需要模块化为多个代码树,否则您应该将示例源代码放入
src
目录;例如把源代码和编译后的代码放在同一棵树上是个坏主意。更好的办法是使用
-d
期权;例如你应该使用某种构建工具。。。如果你希望你的构建是一致的和可复制的。
tzdcorbm2#
与compile命令类似,run命令也需要类路径上的jar文件
哪里
Example.java
移动到新目录src/com/something