【问题标题】:Can not find load class in the lib folder of jar在jar的lib文件夹中找不到加载类
【发布时间】:2011-10-19 05:45:59
【问题描述】:

我将所有依赖项 jar 打包到我最终 jar 的 lib 文件夹中。但是当我像java -cp my.jar MyMainClass这样使用命令执行时,却说无法加载lib文件夹中的类,这是怎么回事?

谢谢

【问题讨论】:

标签: java maven jar


【解决方案1】:

如果您的程序被打包为可执行 jar,您应该有一个单独的文件夹来放置其他 jar 依赖项,然后在运行程序时将该文件夹指定为在类路径中:

java -classpath c:\path\to\dir_with_jars -jar myExecutableJar.jar p1.MainClass

另外:如果您想使用非正统的方法将 jar 依赖项打包到 jar 文件中,您应该将这些依赖项放在可执行 jar 的根目录中,而不是任何文件夹(lib 或其他文件夹)中。这样,它们将有效地位于类路径的根目录中,因此如果您将 jar 运行为:

java -cp:. -jar myJar.jar

它应该可以工作

注意:此答案包含错误,请参阅下面附加的 cmets。这个想法实际上是有一些工具可以让您将 jar 依赖项打包到 jar 中(作为内部 jar),但这将不再作为可以使用默认 JDK 类加载器运行的常规可执行 jar。相反,您需要一个特殊的类加载,它将考虑到内部 jar。提供此功能的工具通常会自动添加必要的特殊类加载并更新 jar 清单以使用它。抱歉弄错了。

【讨论】:

  • 不,它不应该工作。 -jar 将类路径设置为 jar + 在可执行 jar 的清单中指定的所有 external jar 文件。如果嵌套 jar 文件,则需要特定的工具或类加载器来执行应用程序。见stackoverflow.com/questions/183292/…
  • 是的,你说的很对:在可执行 jar 中打包依赖 jar 时,你需要一个特殊的类加载器来加载那些(现在是内部的)jar。例如,当您使用 Eclipse 将项目导出为可运行的 jar 并选择在 jar 中打包依赖项 jar 的选项时,eclipse 还将添加(在您的可执行 jar 中)表示特殊类加载(JarRsrcLoader)的类,并将添加清单它将特殊类加载器的类声明为主类。抱歉,我在回答中说了不正确的话,我会添加一个编辑说明来反映这一点。
【解决方案2】:

您还可以使用 zip 解压缩存档并查看 my.jar 以查看其中的内容以及您的 MyMain.class 是否存在。

【讨论】:

    猜你喜欢
    • 2016-10-21
    • 2018-11-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    相关资源
    最近更新 更多