【问题标题】:Inner classes not being included in jar file内部类不包含在 jar 文件中
【发布时间】:2012-08-14 22:43:27
【问题描述】:

我已经用六个类制作了一个可运行的 jar 文件:

Main:包含main方法,并在manifest中指定(我包含了一个新行)

Main$1 和 Main$2:主类中的 2 个匿名内部类。 (Main$2 在 main 方法中,但我认为这并不重要。)

表格

Form$1:Form 中的匿名内部类

包装布局

我在制作 jar 文件时指定了这些内部类,但是当我查看它时(我在 mac 上)内部类不在 jar 中!所以当我运行它时,我得到了这个:

 Exception in thread "main" java.lang.NoClassDefFoundError: Main$2
    at Main.main(Main.java:64)
 Caused by: java.lang.ClassNotFoundException: Main$2
    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)
    ... 1 more

我不知道出了什么问题。有人可以帮忙吗?

编辑:我想通了!事实证明,您需要在美元符号前添加一个转义字符 (\),以便命令识别它们。

【问题讨论】:

  • “事实证明,你需要在美元符号前加一个转义字符 () 才能让命令识别它们。” - 不要责怪命令。这是基本的 shell 东西。
  • 我建议您发布您的编辑作为答案。现在是这样做的好时机(请参阅meta.stackexchange.com/questions/17463/…)。
  • 讽刺的是,发帖的时候你还需要在反斜杠前面加一个转义字符!

标签: java class jar anonymous


【解决方案1】:

您已经找到了您的具体答案,但这里有一个更通用的答案。

当您修改程序时,具有自动生成名称的类集(例如,Main$2)将发生变化。此外,如果您将类移动到命名包中,您的 jar 文件将必须具有并行目录结构。您不希望每次发生这种情况时都必须更新您的 makefile 或构建脚本。相反,您应该使用 javac -d 为已编译的类文件指定目标目录,然后将整个层次结构打包起来。

【讨论】:

    【解决方案2】:

    在创建或更新 jar 时,您可以将内部类/匿名类名称用单引号括起来,以避免 shell 解释它们名称中的 $

    【讨论】:

      猜你喜欢
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 2018-11-26
      • 1970-01-01
      • 2012-02-15
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多