Java:创建和写入一个jar文件并执行

1. 声明

当前内容主要为学习和复习使用java方式生产一个jar并使用命令行执行

主要为使用JarOutputStream方式创建jar文件

2.基本demo

1.首先准备一个java文件(Hello.java)

public class Hello {
	public static void main(String[] args) {
		System.out.println("hello create my jar file");
	}
}

2.找到项目编译路径并找到该Hello.class文件的位置
在这里插入图片描述
3.开始写代码并将这个Hello.class作为启动目标类

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.jar.Attributes;
import java.util.jar.Attributes.Name;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import java.util.zip.ZipEntry;

/**
 * 
 * @author hy
 * @createTime 2021-06-20 09:42:23
 * @description 像某个jar中写入内容
 *
 */
public class WriteJarTest {
	public static void main(String[] args) {
		// 注意jarFile主要使用来读取jar文件的,不能创建jarFile
		String writeJarPath = "C:\\Users\\admin\\Desktop\\java的测试\\read-write-jar-test\\my.jar";
		Manifest manifest = new Manifest();
		Attributes mainAttributes = manifest.getMainAttributes();
		// 配置MANIFEST.MF文件的内容
		mainAttributes.put(new Name("Manifest-Version"), "1.0.0");
		mainAttributes.put(new Name("Main-Class"), "com.hy.test.Hello");

		String classPath = "D:\\eclipse-workspace\\JarReadAndWriteTest\\bin\\com\\hy\\test\\Hello.class";
		File file = new File(classPath);
		try (JarOutputStream jos = new JarOutputStream(new FileOutputStream(writeJarPath), manifest);
				FileInputStream fis = new FileInputStream(file)) {
			// 这里需要获取多个class文件,然后创建并得到各种byte

			JarEntry jarEntry = new JarEntry("com/hy/test/Hello.class");
			byte[] bytes = new byte[1024];
			// 读取单个文件的比特到当前的byte中
			int len = fis.read(bytes);
			byte[] copyOfRange = Arrays.copyOfRange(bytes, 0, len);
			// 放入一个com/hy/test/Hello.class(注意这里不能使用com\\hy\\test\\Hello.class替换,否则执行报错)
			jos.putNextEntry(jarEntry);
			// 开始向当前的单个实体中写入数据(当前Hello.class的比特)
			jos.write(copyOfRange);
			// 关闭这个jar实体,可以开启其他的jar实体
			jos.closeEntry();

			//jar文件写入完毕
			jos.finish();

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		System.out.println("创建一个jar文件成功");

	}
}

注意:Main-Class就是这个运行的类,其他的可以参考之前的博文

3. 创建jar和运行

在这里插入图片描述

在这里插入图片描述
查看其中的MANIFEST.MF和Hello.class发现都是正常的

执行:
在这里插入图片描述

执行成功!

4. 主要遇到的问题

  1. 发现找不到Hello.class但是打包很正常(就是不能使用\\而只能使用/作为jar中的文件分隔符)
  2. 写入的时候需要先jos.putNextEntry(jarEntry);然后在write,最后关闭这个entry(class)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值