继续求教,写java程序打jar包问题

ylxq2006 2008-01-09 12:31:20
通常我们把.class文件打包,一般手动把bin下的打成zip形式,然后该文件名为*.jar。大家有没有想过写个程序打jar包呢??

最近我的工程需要这样做,我写了一段程序,用代码打jar包,打包的结果跟手动打jar包后的样子是一模一样的,就是文件大小不一样,手动要大一点,自动的要小一点。

jar包里面什么东西都一样。

但是诡异的问题出现了,在我的工程中,在运行是要用到这个jar包,但是类加载器却加载不到jar包里面的.class文件,如果手动打包扔进去,就可以加载。

我和郁闷,折磨我好几天了,希望借助这个平台,能够得到大家的帮助。谢谢。


前面java2000_net 已经提出了一些问题,感谢他,但是好像还不行。

我的和java2000_net 代码如下:

/**
* 功能:文件夹的压缩打包(jar)
*
* @param inputFileName
* 被压缩或者打包的文件夹 outputFileName 压缩后或者打包的文件
*/

package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;

public class Test {
public static void jar(String inputFileName, String outputFileName) throws Exception {
JarOutputStream out = new JarOutputStream(new FileOutputStream(outputFileName));
File f = new File(inputFileName);// 这里应该以那个目录为根目录,jar的根应该是这个目录下的文件
jar(out, f, "");
out.close();
}

private static void jar(JarOutputStream out, File f, String base) throws Exception {
if (f.isDirectory()) {
File[] fl = f.listFiles();
base = base.length() == 0 ? "" : base + "/";
for (int i = 0; i < fl.length; i++) {
jar(out, fl[i], base + fl[i].getName());
}
} else {
out.putNextEntry(new JarEntry(base));
FileInputStream in = new FileInputStream(f);
byte[] buffer = new byte[1024];
int n = in.read(buffer);
while (n != -1) {
out.write(buffer, 0, n);
n = in.read(buffer);
}
in.close();
}
}

public static void main(String[] args) {
try {
jar("e:\\workplace\\test\\bin", "d://test.jar");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

bin下就是包结构,以及.class文件
...全文
2040 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
s369401 2011-12-04
  • 打赏
  • 举报
回复
学习JAVA中...
wzx168love 2010-08-06
  • 打赏
  • 举报
回复
标记下哦...
木桶爸爸 2010-08-06
  • 打赏
  • 举报
回复
功能很强大啊
shaccpsh 2010-08-06
  • 打赏
  • 举报
回复
用 myeclipse 自动打包
zhyou110z 2010-08-06
  • 打赏
  • 举报
回复

mark
zhulinyunhe 2010-08-06
  • 打赏
  • 举报
回复
很好 啊。看是很多啊
zhangchunlian 2010-05-12
  • 打赏
  • 举报
回复
不错不错
mdzlkj 2008-01-14
  • 打赏
  • 举报
回复
http://www.mdzlkj.cn/
里面的经典代码有个连接有视频示范
欧德卢福克斯 2008-01-14
  • 打赏
  • 举报
回复
关注一下.
token1984 2008-01-13
  • 打赏
  • 举报
回复
mark
goodmrning 2008-01-09
  • 打赏
  • 举报
回复
帮顶
阿非 2008-01-09
  • 打赏
  • 举报
回复
mark~
sun_IT 2008-01-09
  • 打赏
  • 举报
回复
顶,学习.呵呵
qixueqi 2008-01-09
  • 打赏
  • 举报
回复
来过
  • 打赏
  • 举报
回复
MF文件中冒号后面要有且只能有一个空格,注意一下。

该死的CSDN,CSDN发帖时把它替换成三个空格了!
  • 打赏
  • 举报
回复
嗯,重载一下jar方法

public static void jar(String inputFileName, String outputFileName,
String manifestFile) throws Exception {
Manifest manifest = new Manifest(new FileInputStream(manifestFile));
JarOutputStream out = new JarOutputStream(new FileOutputStream(
outputFileName), manifest);
File f = new File(inputFileName);
jar(out, f, "");
out.close();
}

main调用时改为:

jar("f:/aaa", "f:/test.jar", "f:/abc.mf");


就可以了,abc.mf是清单文件应符合MANIFEST.MF文件规范,
至少应有:Manifest-Version: 1.0
也可以加上Main-Class: xxx.xxx.Xxx
最后至少应用两个空行。

希望这些能对您有用。
DrunkWorm 2008-01-09
  • 打赏
  • 举报
回复
不是很明白楼主到底想要表示什么?
为什么不用jar命令,而去偏偏用自己的方法去写呢?如果纯粹是为了学习java sdk也情有可原。
老紫竹 2008-01-09
  • 打赏
  • 举报
回复
我在源代码根目录加了META-INF/MANIFEST.MF
文件内容为空
用这个程序打包,生成的jar依然能用。
ylxq2006 2008-01-09
  • 打赏
  • 举报
回复
谢谢啊,我发现问题所在了,是这个原因啊:

是我多此一举啊,我在bin目录下手工添加这样的目录层次:META-INF/MANIFEST.MF
(不能这样做啊)

再进行打打包是不行的(手动打可以)

MANIFEST.MF是一个特殊的文件,并不能手工把目录加上去的。

如果你在写程序中需要一个这样的MANIFEST.MF,需要在上面代码中
JarOutputStream out = new JarOutputStream(new FileOutputStream(outputFileName),new Manifest())

以上这个程序是可以用的
老紫竹 2008-01-09
  • 打赏
  • 举报
回复
是的,你把那个"/" 改成 "\" 就不行,要不你测试看看!

base = base.length() == 0 ? "" : base + "\\";
加载更多回复(13)

62,623

社区成员

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

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