最近发现一个暴怪的 JAR 文件问题!!请各位大侠指点!!!

abcdhy 2004-04-05 10:32:43
我自己使用的环境是 WINXP + JDK1.42 + JCreater2.5
以前开发程序一直在 JC 下做的,很少涉及到 ClassPath 的问题!
最近写了一个小程序,使用了一个网上下载的 XP 的界面包.
发布程序的时候问题出来的:
我直接用 java 执行我编译出来的 class 文件,可以很正常的找到 XP 的界面包。不管我用什么方式(1.指定 ClassPath 的系统变量方式。2.在执行时使用 -cp 指令方式)都能很正确的执行程序。但我把自己的程序打包到一个 JAR 文件后,呵呵,问题出来了,无论我怎么设置 ClassPath ,执行这个 JAR 文件都是不能调用 XP 的界面包了!!!

这是 JAR 文件的问题吗???
请大侠指点一下!!

为了演示这个问题,我自己写了一个简单的测试程序,大家可以自己试试,是不是有我遇到的问题!!

谢谢!!
...全文
82 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
goldenhua 2004-04-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分之一!
abcdhy 2004-04-15
  • 打赏
  • 举报
回复
哦,谢谢了!!!

jkit(不再灌水) 终于说到点子上了,谢谢!!!

也谢谢大家的回复!
jkit 2004-04-12
  • 打赏
  • 举报
回复
不好意思,上面看错了,误以为你把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 即可!
jkit 2004-04-12
  • 打赏
  • 举报
回复
这里出的问题:
jar -cmf manifest.mf j.jar *.class
你把package弄丢了!!!
随风来去 2004-04-12
  • 打赏
  • 举报
回复
我晕,狼平方你简直是在误导,助长不求甚解之风 ^_^

一般来说,工作中使用JC开发的很少见,楼主应该不是为了工作而用的
wolfsquare 2004-04-12
  • 打赏
  • 举报
回复
楼主是学生吧,这种问题有一种方法解决就可以了,何必浪费时间!
zijiren 2004-04-12
  • 打赏
  • 举报
回复
up
abcdhy 2004-04-12
  • 打赏
  • 举报
回复
已经正确的把 MANIFEST.mf 打入包里了!
呵呵,现在我使用

Class-Path: lib.jar

可以运行了!!!!!!!

但改成
Class-Path: .;lib.jar
还是不能运行!
rex0y 2004-04-09
  • 打赏
  • 举报
回复
java -cp ".;%CLASSPATH%;yourlib.jar;" com.*.yourClass(没有扩展名)
DESL 2004-04-09
  • 打赏
  • 举报
回复
打包以后解压看一下是否是MANIFEST.mf文件没有打入包中.
wolfsquare 2004-04-09
  • 打赏
  • 举报
回复
可执行Jar文件的Classpath路径是有mainfest文件里的Class-Path项指定的,无法通过-cp等来指定,如果你需要执行一个带外部ClassPath的Jar文件,你只能在命令行指定类名 java -cp your.jar;etc... your.class
mailguoyy 2004-04-09
  • 打赏
  • 举报
回复
顶!
升烟 2004-04-08
  • 打赏
  • 举报
回复
gz
abcdhy 2004-04-08
  • 打赏
  • 举报
回复
回 wangxdsharing 你说的方法是可以的,我自己以前也一直是这样用的!!
但就是因为所有文件都在一个包里,文件太大,而且也不能多个程序共享!
所以我才想分开打包,以实现库的共享!!

对于大家说的 在

在manifest.mf中添加一行
Class-Path: lib.jar

我这个已经测试过了,大家可以看看我的测试过程!!

后来我又换了一台电脑,同样的配置, 使用
Class-Path: lib.jar
的方法,有时可以,有时有不行,我自己这台电脑是始终不行!!!
所以才不明白,这是为什么!!!!!

也请大家帮我测试一下,这是一个个别的问题,还是一个通用的问题!!
最好能找到问题的原因!!!

谢谢!!!!!!!!
mingjava 2004-04-08
  • 打赏
  • 举报
回复
如果你想把xp的界面包加到你的jar里面的话 用一个参数在Class-Path: xxx.jar

建议楼主到sun看看jar的tutorial 其实很多人对这些都不是很熟悉
用ide用得太多了
wangxdsharing 2004-04-08
  • 打赏
  • 举报
回复
我也试过了,确实是个怪问题!不过你可以把JarTest.class com manifest.mf打到一个jar包中解决
littlegang 2004-04-08
  • 打赏
  • 举报
回复
实在不行的话,你有着急用的先这样
在manifest.mf中添加一行

Class-Path: lib.jar

强行指定路径
rex0y 2004-04-07
  • 打赏
  • 举报
回复
jar 包可以用 winrar 打开
你打得包有问题
包里面应该是 com.*.
META-INF
abcdhy 2004-04-07
  • 打赏
  • 举报
回复
对于一个 lib 来说,META-INF 并不重要!
我甚至可以把文件压缩到一个 .zip 文件中,不需要 META-INF

执行 Java 程序时,只要指定了 classpath 中有这个 zip 文件,一样的可以使用!!
abcdhy 2004-04-07
  • 打赏
  • 举报
回复
都试过了!!

大家可以自己试试测试程序!!
加载更多回复(6)

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧