Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解析外部依赖的类路径_Java_Jar_Classpath_Manifest_Noclassdeffounderror - Fatal编程技术网

Java 解析外部依赖的类路径

Java 解析外部依赖的类路径,java,jar,classpath,manifest,noclassdeffounderror,Java,Jar,Classpath,Manifest,Noclassdeffounderror,我有一个外部库(只有一个名为org.vinay.dep.DependedClass的类文件) 其包目录结构和目录组织位于桌面上 我有一个名为a.jar的jar,它依赖于我的外部库 执行jar-tf a.jar将给出以下输出 META-INF/ META-INF/MANIFEST.MF com/ com/os/ com/os/hw/ com/os/hw/HelloWorld.class co

我有一个外部库(只有一个名为org.vinay.dep.DependedClass的类文件) 其包目录结构和目录组织位于桌面上

我有一个名为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 
我试着用两种方式运行这个罐子

  • java-classpath C:/Users/vinay/Desktop-jar a.jar
    with 正在创建manifest.mf条目

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

    对于DependedClass

  • java-jar a.jar
    如下更改清单条目后

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

    但这一次,它为HelloWorld抛出了NoClassDefFoundError 阶级本身


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

    我认为不能将-classpath和-jar组合起来。您可以这样做:

    java -cp C:/Users/vinay/Desktop;a.jar com.os.hw.HelloWorld
    
    这假设a.jar在当前文件夹中(或者您也可以将完整路径添加到a.jar)


    将清单中的类路径条目硬编码到本地计算机上的路径永远都不是正确的解决方案:)

    是的,它可以工作。谢谢。但我们不能期望用户知道主类是什么?有没有办法解决jar对未归档的外部类文件的依赖性?是的,您可以通过自定义类加载器加载更多类,例如创建一个URLClassLoader,将jar加载到相对于当前文件夹的文件夹中。更好的方法可能是为应用程序附带一个windows批处理脚本和一个*nix shell脚本,用于设置类路径并正确调用main方法。