测试程序:
//JarTest.java
import com.*;
class JarTest {
public static void main(String args[]) {
CA ca = new CA();
ca.print();
}
}//CA.java
package com;
public class CA
{
public void print()
{
System.out.println ("This class is CA!");
}
}放到对应的目录编译好后,在当前目录下有一个 JarTest.class 还有一个 com 的文件夹,com 文件夹下有一个 CA.class .
(以下的指令都在当前目录下执行)
此时使用  java JarTest    可以得到正确的结果.
接着使用  jar -cf lib.jar com     指令,把 com 文件夹打包为 lib.jar 
这时就可以删除 com 这个文件夹.(当前文件夹下就只有 JarTest.class 和 lib.jar 这两个文件了)
这时可以使用  java -cp .;lib.jar JarTest   来执行程序.一切正常.
当然你也可以把 lib.jar 文件添加到 ClassPath 系统变量中,以上的指令一样能正确的执行.

解决方案 »

  1.   

    接着就开始演示问题:
    当前目录下建立 manifest.mf 文件:内容为
    Main-Class: JarTest然后执行指令:
    jar -cmf manifest.mf j.jar *.class
    把 JarTest.class 打包到 j.jar 文件中.
    此时无论我执行:
    java -jar j.jar
    java -cp lib.jar -jar j.jar
    java -cp .;lib.jar -jar j.jar
    这三个指令,还是把 lib.jar 添加到 ClassPath 中,都只能得到一个结果
    Exception in thread "main" java.lang.NoClassDefFoundError: com/CA
            at JarTest.main(JarTest.java:5)
    不能找到 com/CA 类.然后我编辑 manifest.mf 为:
    Main-Class: JarTest
    Class-Path: .;lib.jar再用 jar -cmf manifest.mf j.jar *.class 打包.
    同样执行上面的三个运行指令,得到结果还是 不能找到 com/CA 类.
    把 lib.jar 添加到 ClassPath 中,结果还是一样.这是为什么呢?????
    怎么 JAR 文件不能设置 类路径的 吗???
    在同样的条件下,只能正确执行 .class 文件,却不能执行 .jar 文件.
    难道一个 jar 文件不能调用另一个 jar 文件里的类吗???请大侠们指点一下!!!!
    谢谢!!!!!!!!!!!!!!!!!!!
      

  2.   

    应该是你打包出了问题!
    你可以尝试把jar解压,
    META-INF和你的包文件夹应该在同一层目录!
    比如我的程序为:package net.csdn.www;
    则META-INF文件夹和net文件夹应该在同一层目录!
      

  3.   

    对于一个 lib 来说,META-INF 并不重要!
    我甚至可以把文件压缩到一个 .zip 文件中,不需要 META-INF 执行 Java 程序时,只要指定了 classpath 中有这个 zip 文件,一样的可以使用!!
      

  4.   

    jar 包可以用 winrar 打开
    你打得包有问题
    包里面应该是  com.*.
                  META-INF
      

  5.   

    对,这些都没有问题!!!!!大家可以看看测试程序的过程!!现在的问题是:
    同样的设置,用 .class 文件可以调用到库,但用 .jar 文件来运行就会找不库!!这是为什么?????
      

  6.   

    用 set CLASSPATH 试过吗,可以吗
      

  7.   

    实在不行的话,你有着急用的先这样
    在manifest.mf中添加一行Class-Path: lib.jar强行指定路径
      

  8.   

    我也试过了,确实是个怪问题!不过你可以把JarTest.class com manifest.mf打到一个jar包中解决
      

  9.   

    如果你想把xp的界面包加到你的jar里面的话  用一个参数在Class-Path: xxx.jar建议楼主到sun看看jar的tutorial  其实很多人对这些都不是很熟悉
    用ide用得太多了
      

  10.   

    回 wangxdsharing 你说的方法是可以的,我自己以前也一直是这样用的!!
    但就是因为所有文件都在一个包里,文件太大,而且也不能多个程序共享!
    所以我才想分开打包,以实现库的共享!!对于大家说的 在 在manifest.mf中添加一行  
    Class-Path:  lib.jar  我这个已经测试过了,大家可以看看我的测试过程!!后来我又换了一台电脑,同样的配置, 使用
    Class-Path:  lib.jar  
    的方法,有时可以,有时有不行,我自己这台电脑是始终不行!!!
    所以才不明白,这是为什么!!!!!也请大家帮我测试一下,这是一个个别的问题,还是一个通用的问题!!
    最好能找到问题的原因!!!谢谢!!!!!!!!
      

  11.   

    java -cp ".;%CLASSPATH%;yourlib.jar;" com.*.yourClass(没有扩展名)
      

  12.   

    可执行Jar文件的Classpath路径是有mainfest文件里的Class-Path项指定的,无法通过-cp等来指定,如果你需要执行一个带外部ClassPath的Jar文件,你只能在命令行指定类名 java -cp your.jar;etc... your.class
      

  13.   

    打包以后解压看一下是否是MANIFEST.mf文件没有打入包中.
      

  14.   

    已经正确的把 MANIFEST.mf 打入包里了!
    呵呵,现在我使用 Class-Path:  lib.jar  可以运行了!!!!!!!但改成 
    Class-Path:  .;lib.jar  
    还是不能运行!
      

  15.   

    这里出的问题:
    jar -cmf manifest.mf j.jar *.class
    你把package弄丢了!!!
      

  16.   

    不好意思,上面看错了,误以为你把com里面的class也放j.jar里面了.java -jar jarfile 和 java -cp jarfile ClassName 这两种运行方式是有区别的。java -jar jarfile这种运行方式的classpath被jar里面的manifest.mf重置了,所以必须在manifest.mf里面指定Class-Path: , 值得注意的是,这里的分隔符是空格,不是分号!例如 Class-Path:  . lib.jar someother.jar  java -cp jarfile ClassName 这种方式就是传统的方式,没什么特别
    java -cp .;j.jar;lib.jar JarTest 即可!
      

  17.   

    哦,谢谢了!!! jkit(不再灌水) 终于说到点子上了,谢谢!!!也谢谢大家的回复!
      

  18.   

    实在是不好意思,误导大家!
    我老是想,java的字符串比较速度怎么可能比C/C++还快呢,String的equals方法是下面这个样子的:
        public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;
    while (n-- != 0) {
        if (v1[i++] != v2[j++])
    return false;
    }
    return true;
        }
    }
    return false;
        }里面有个instanceof操作,有个类型转换,而且数组的访问是有运行期越界检查的,怎么可能比C/C++快嘛!
    定睛一看,有这么个判断:
        int n = count;
        if (n == anotherString.count) {
    因为java String的长度是构造String时就已经计算好的,那么,不同长度的String肯定不相等,根本不需要比较(在求String的长度和比较不等长String时java和Pascal相似,比C高效),而我上面给的两个String恰恰不等长!所以说速度很快,比VC编译的同样的C程序还快。但是,当把第一个String改为和第二个一样长,末尾为“1”后,整个执行时间变成了10多分钟,效率不到C的10分之一!