为什么没有使用classpath规范找到jar文件? (来自Oracle的FileChooserDemo)

时间:2013-07-19 04:27:56

标签: java swing

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

http://docs.oracle.com/javase/tutorial/uiswing/examples/components/index.html#JWSFileChooserDemo

下载源代码

遵循java源代码中的编译指令:

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

这很好用。组件dir中生成两个类文件。然后......

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并且适合我的目的。我仍然不明白为什么上面给出的命令不起作用。

1 个答案:

答案 0 :(得分:1)

请按照以下步骤操作:

C Drive

下,说我的目录结构就是这个
  components-JWSFileChooserDemoProject
                  |
  ------------------------------------
  |           |           |          |
nbproject    src      build.xml    manifest.mf
              |
          components
              |
  -------------------------------------------------
  |       |       |                               |
images   jars     |                               |
             JWSFileChooserDemo.java      JWSFileChooserDemo.jnlp

components Directory下创建一个名为Directory的新build,现在Directory - components将有五件事,而不是四件buildimagesjarsJWSFileChooserDemo.javaJWSFileChooserDemo.jnlp

现在先转到components Directory

编译编写此命令:

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

-classpath选项中,您指定在编译{{1}时要包含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内容相同。

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

JWSFILECHOOSERDEMOIMAGE


编辑1:

由于您希望在..\jars\*没有-d选项的情况下执行此操作。与以前一样考虑相同的目录结构,移到Java Compiler - javac

使用此命令进行编译:

components Directory

现在在C:\components-JWSFileChooserDemoProject\src\components>javac -classpath images\*;jars\* JWSFileChooserDemo.java 中手动创建package structure,即创建File System,然后在新创建的Directory components内移动之前创建的.class个文件,并将components Directory文件夹添加到此新创建的images文件夹中。

现在components将有五件事,而不是四件,即Directory - componentscomponents(which further contains JWSFileChooserDemo.class , JWSFileChooserDemo$1.class and images folder)imagesjarsJWSFileChooserDemo.java

使用此命令运行程序:

JWSFileChooserDemo.jnlp

这将为您提供以前的输出,但是,如果您想按照之前的建议移动,请再次将C:\components-JWSFileChooserDemoProject\src\components>java -cp .;jars\* components.JWSFileChooserDemo 文件夹复制到自动生成的images文件夹,因为我只是查看了{{1他们使用components来实现它。


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

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

relative path

如果你不想