为什么找不到类路径规范的jar文件? (来自Oracle的FileChooserDemo)

下载了最新的Java SE。 通过JNLP在http://docs.oracle.com/javase/tutorial/uiswing/components/filechooser.html上运行 FileChooserDemo工作正常。 (Windows框。)

从http://docs.oracle.com/javase/tutorial/uiswing/examples/components/index.html#JWSFileChooserDemo下载源代码

遵循java源代码中的编译说明:

C:components> javac -classpath .;jars/jnlp.jar JWSFileChooserDemo.java 

这很好用。 在组件目录中生成两个类文件。 然后…

 C:components>cd .. C:src> java -classpath .;jars/jnlp.jar components.JWSFileChooserDemo Exception in thread "main" java.lang.NoClassDefFoundError:javax/jnlp/UnavailableServiceException at java.lang.Class.getDeclaredMethods0(Native Method) . . . 

因此找不到UnavailableServiceException.class 。 但是如果列出jar文件,那么类就在那里。 所以我的类路径是错的。

 C:jars> tar tf jnlp.jar META-INF/ META-INF/MANIFEST.MF javax/jnlp/ javax/jnlp/BasicService.class javax/jnlp/ClipboardService.class javax/jnlp/DownloadService.class javax/jnlp/DownloadServiceListener.class javax/jnlp/ExtensionInstallerService.class javax/jnlp/FileContents.class javax/jnlp/FileOpenService.class javax/jnlp/FileSaveService.class javax/jnlp/JNLPRandomAccessFile.class javax/jnlp/PersistenceService.class javax/jnlp/PrintService.class javax/jnlp/ServiceManager.class javax/jnlp/ServiceManagerStub.class javax/jnlp/UnavailableServiceException.class 

我在Mac OSX上试过这个(你必须在分类路径中将分号改为冒号)和同样的东西。

更新:我发现这个在线演示的旧版本不使用UnavailableSewrviceException并独立编译。 它适用于当前的Java并且适合我的目的。 我仍然不明白为什么上面给出的命令不起作用。

按着这些次序 :

假设目录结构就在我身边,在C Drive


  components-JWSFileChooserDemoProject | ------------------------------------ | | | | nbproject src build.xml manifest.mf | components | ------------------------------------------------- | | | | images jars | | JWSFileChooserDemo.java JWSFileChooserDemo.jnlp 

components Directory创建一个名为build的新Directory所以现在Directory - components将有五个东西,而不是四个,即buildimagesjarsJWSFileChooserDemo.javaJWSFileChooserDemo.jnlp

现在首先转到components Directory

要编译写这个命令:

 C:\components-JWSFileChooserDemoProject\src\components>javac -classpath images\*;jars\*;build -d build JWSFileChooserDemo.java 

-classpath选项中,您指定在编译JWSFileChooserDemo.java要包含Directories imagesjarsbuild JWSFileChooserDemo.java-d选项基本上告诉我们.class文件的放置位置。

移至"build"文件夹:

 C:\components-JWSFileChooserDemoProject\src\components>cd build 

运行程序:

 C:\components-JWSFileChooserDemoProject\src\components\build>java -cp .;..\images\*;..\jars\* components.JWSFileChooserDemo 

这里面是-cp选项. 代表,从当前位置看, ..\images\*意味着,在images Directory向上一级,从当前位置获取其所有内容,同样也适用于..\jars\* thingy。

现在您将看到它正常工作,并提供以下输出:

JWSFILECHOOSERDEMOIMAGE


编辑1:

因为你想在没有Java Compiler - javac -d选项的情况下这样做Java Compiler - javac 。 像以前一样考虑相同的目录结构,在components Directory移动。

用这个命令编译:

 C:\components-JWSFileChooserDemoProject\src\components>javac -classpath images\*;jars\* JWSFileChooserDemo.java 

现在在File System手动创建package structure ,即创建Directory components ,然后将之前创建的.class文件移动到这个新创建的components Directory ,并将images文件夹添加到这个新创建的components文件夹中。

现在Directory - components将有五个东西,而不是四个components(which further contains JWSFileChooserDemo.class , JWSFileChooserDemo$1.class and images folder)imagesjarsJWSFileChooserDemo.javaJWSFileChooserDemo.jnlp

使用以下命令运行程序:

 C:\components-JWSFileChooserDemoProject\src\components>java -cp .;jars\* components.JWSFileChooserDemo 

这将给你以前的输出,但是,如果你想按照之前的建议移动,再次将images文件夹复制到自动生成的components文件夹,因为我只是查看.java并使用relative path来工作。


只是这个特殊的解决方案,我将要描述的仅适用于您的情况:

如果之前给出了javac命令,如果你不想创建任何文件夹,那么进入一级,即在组件目录外,并使用此命令运行程序

 C:\components-JWSFileChooserDemoProject\src>java -cp .;components\jars\* components.JWSFileChooserDemo 

如果你不想