【问题标题】:resolving classpath for external dependency解析外部依赖的类路径
【发布时间】:2012-06-11 10:13:36
【问题描述】:

我有一个外部库(只有一个名为 org.vinay.dep.DependedClass 的类文件)。它在里面 它的包目录结构和目录org在桌面上。

我有一个名为 a.jar 的 jar,它依赖于我的外部库。

执行 jar -tf a.jar 给出以下输出,

META-INF/                
META-INF/MANIFEST.MF     
com/      
com/os/          
com/os/hw/          
com/os/hw/HelloWorld.class       
com/os/hw/HwUtil.class 

我尝试以 2 种方式运行 jar

  1. java -classpath C:/Users/vinay/Desktop -jar a.jar 与 manifest.mf 条目正在

    清单版本:1.0
    创建者:1.6.0_05 (Sun 微系统公司)
    主类:com.os.hw.HelloWorld

    得到了 DependedClass

    的 NoClassDefFoundError
  2. java -jar a.jar 如下更改清单条目后

    清单版本:1.0
    创建者:1.6.0_05 (Sun 微系统公司)
    主类:com.os.hw.HelloWorld
    类路径:C:/Users/vinay/Desktop

    但这一次它为 HelloWorld 抛出了 NoClassDefFoundError 类本身

当我将外部库打包到 jar 中并在清单文件中使用 jar 名称作为 Class-Path 条目时,它可以工作。有没有办法在不将外部库打包到 jar 的情况下解决这个问题?

【问题讨论】:

    标签: java jar classpath manifest noclassdeffounderror


    【解决方案1】:

    我认为您不能将 -classpath 和 -jar 结合使用。你可以这样做:

    java -cp C:/Users/vinay/Desktop;a.jar com.os.hw.HelloWorld
    

    这假设 a.jar 位于当前文件夹中(或者您也可以添加 a.jar 的完整路径)。

    将清单的 Class-Path 条目硬编码到本地计算机上的路径绝不是正确的解决方案 :)

    【讨论】:

    • 是的。它有效。谢谢。但是我们不能指望用户知道主类是对的吗?有没有办法解决jar对未归档的外部类文件的依赖?
    • 是的,您可以通过自定义类加载器加载更多类,例如通过创建一个 URLClassLoader 来加载相对于当前文件夹的文件夹中的 jar。更好的方法可能是为您的应用程序提供一个用于 windows 的批处理脚本和一个用于 *nix 的 shell 脚本,它可以设置类路径并正确调用 main 方法。
    猜你喜欢
    • 2019-06-03
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    相关资源
    最近更新 更多