我试图弄清楚是否可以运行位于映射网络驱动器上的java类。一个例子是:
C:\temp\groovy>java p:\Test
Exception in thread "main" java.lang.NoClassDefFoundError: p:\Test
Caused by: java.lang.ClassNotFoundException: p:\Test
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: p:\Test. Program will exit.
在尝试之前,我想看看我是否可以运行UNC共享(java \\somehost\share\Test
)上的java类文件。这也不起作用 - 没有找到类def的相同错误。
我做错了还是真的不支持?
由于
答案 0 :(得分:3)
当您将路径作为类名称的一部分时,Java期望它位于与其所在的文件夹层次结构对应的包中。
示例:
> java z:/Test
java.lang.NoClassDefFoundError: z:/Test
Caused by: java.lang.ClassNotFoundException: z:.Test
这里正在寻找“z:.Test”作为完全限定的类名。
假设您的Test类未声明为在任何包中,您需要在类路径中指定目录:
java -cp Z:\path Test
答案 1 :(得分:1)
java启动程序接受一个类作为第一个用于定位要调用的main方法的非选项参数。
默认情况下,第一个非选项 argument是要的类的名称 被调用。完全合格的课程 应该使用名称。如果-jar 选项是指定的,第一个 非选项参数是a的名称 包含类和的JAR存档 应用程序的资源文件, 与启动类指示 Main-Class清单标题。
Java运行时搜索启动 class,以及其他使用的类 三组位置:引导程序 类路径,已安装的扩展, 和用户类路径。
因此,您无法提供p:\Test
作为参数。而是将当前工作目录更改为p:\
,然后执行java Test
。
您可以使用批处理脚本更改目录,而无需手动执行此操作。或者,您可以将类打包到JAR文件中(使用所需的清单),并提供-jar
选项以指定JAR文件到java
可执行文件的绝对路径;如果您不想管理太多的类文件,这是首选。
编辑:您还可以使用@Dave Costa指定的-cp
标志。这将使您无需更改当前目录。