为什么找不到类路径规范的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
将有五个东西,而不是四个,即build
, images
, jars
, JWSFileChooserDemo.java
和JWSFileChooserDemo.jnlp
。
现在首先转到components Directory
。
要编译写这个命令:
C:\components-JWSFileChooserDemoProject\src\components>javac -classpath images\*;jars\*;build -d build JWSFileChooserDemo.java
在-classpath
选项中,您指定在编译JWSFileChooserDemo.java
要包含Directories
images
, jars
和build
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。
现在您将看到它正常工作,并提供以下输出:
编辑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)
, images
, jars
, JWSFileChooserDemo.java
和JWSFileChooserDemo.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
如果你不想