将jar文件输出字节流

使用fat jar  将一个工程打包后,使用以下代码 将jar输出为字节流

    public final static byte[] findJarBytes(String path){
        File file = new File(path);
        try{
            FileInputStream fis = new FileInputStream(file);
            JarInputStream jis = new JarInputStream(fis);
            Manifest manifest = jis.getManifest();
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            JarOutputStream jos = null;
            if(manifest!=null)
                jos = new JarOutputStream(out,jis.getManifest());
            else jos = new JarOutputStream(out);

            JarEntry e = null;while ((e=jis.getNextJarEntry()) != null){
                System.out.println(e.getName());
                jos.putNextEntry(e);
            }
            jos.finish();
            jos.close();
            out.close();
            jis.close();
            fis.close();
            return out.toByteArray();
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }

经测试成功输出

使用ant 打包成jar包,使用同样的代码却发现抛出

java.util.zip.ZipException: invalid entry size (expected 5103 but got 0 bytes)
    at java.util.zip.ZipOutputStream.closeEntry(ZipOutputStream.java:243)
    at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:177)
    at java.util.jar.JarOutputStream.putNextEntry(JarOutputStream.java:109)
    at com.meteorite.holy.verify.util.JarUtil.findJarBytes(JarUtil.java:136)

比较两个jar包后,发现只有MANIFEST.MF文件不一致,替换成之前成功的,发现同样报错,至今不解,大致估计是fat jar 和 ant jar 生成方式不同

折腾了一会,将代码中间的替换成

            byte[] bytes = new byte[1024];
            while ((e=jis.getNextJarEntry()) != null){
                System.out.println(e.getName());
                jos.putNextEntry(e);
                int len = 0;
                while((len = jis.read(bytes, 0, bytes.length))!=-1){
                    jos.write(bytes, 0, len);
                }
            }        

经测试成功!

将jar文件输出字节流

时间: 2024-12-30 00:09:54

将jar文件输出字节流的相关文章

向文件输出数据的输出字节流

1 package com.outputstream; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java.util.Arrays; 1

java可执行jar文件向界面输出汉字乱码问题

我编写了一个Windows向Linux传输本地文件工具,在IDE中调试时中文显示没有问题,打成jar后运行时出现了中文乱码. 解决方案: 编写一个.bat文件去运行jar文件,运行时加上参数  java -Dfile.encoding=utf-8 -jar xxxxx.jar,运行时运行批处理文件即可 原文地址:https://www.cnblogs.com/chli0729/p/11164603.html

java之IO输出字节流相关操作

输出字节流: --------| OutputStream 是所有输出字节流 的父类. 抽象类 -----------| FileOutStream 向文件输出数据的输出字节流. FileOutputStream如何使用呢? 1. 找到目标文件 2. 建立数据的输出通道. 3. 把数据转换成字节数组写出. 4. 关闭资源 方法一: import java.io.File; import java.io.FileOutputStream; import java.io.IOException; p

Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法

方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目下建立文件MANIFEST.MF,内容如下: Manifest-Version: 1.0 Class-Path: lib/commons-codec.jar lib/commons-httpclient-3.1.jar lib/commons-logging-1.1.jar lib/log4j-1.

将jar文件加到Maven的local repository中

对于Maven项目来说,日常使用的多数第三方java库文件都可以从Maven的Central Repository中自动下载,但是如果我们需要的jar文件不在Central Repository中,那么我们就需要手动将自己下载的jar文件加入到Maven的local reposotory中了,此时我们需要向Maven提供用于识别jar文件(可能多个)的groupId, artifactId和version等信息. 我并不打算讲怎么将一个下载的jar库加入到local repository中,我们

linux下shell脚本执行jar文件

最近在搞一个shell脚本启动jar文件个关闭jar文件的东东.搞得我都蛋疼了.今天晚上终于弄好了 话说,小弟的linux只是刚入门,经过各方查资料终于搞定了.话不多说,下面开始上小弟写的shell脚本 上面是小弟写的shell脚本.写的不好请见谅. 首先遇到的第一个坑 我在window下写的 然后道linux中执行,在linux死活都说俺的19行有错误,俺就不明白了,哪里有错,问了下别人,也说没错.突然有个高人问我在哪编写的,小弟回答在win下,他告诉俺执行下这个命令: dos2unix se

【转】学习jar命令 创建和解压jar文件包

java编程中每天都用不少jar文件,项目开发中不停地导包,在忙完了一天的工作,放下那些复杂的业务实现,不仅想问这些jar包怎么生成的,jar包有哪些独特的地方等等. 原来这些经常见到的jar包是jar命令生成的,java语言为我们在安装jdk的时候,就随jdk为我们在bin目录中安装好了,在windows系统中是jar.exe程序,Linux系统中为jar文件. jar命令有生成,查看,更新或解开jar包的作用.jar包与其他的压缩包很相似,不过它包含了META-INF/MANIFEST.MF

Java加载jar文件并调用jar文件当中有参数和返回值的方法

在工作当中经常遇到反编译后的jar文件,并要传入参数了解其中的某些方法的输出,想到Java里面的反射可以实现加载jar文件并调用其中的方法来达到自己的目的.就写了个Demo代码. 以下的类可以编译生成hello.jar文件. 1 package org.lele.fatpanda; 2 3 public class Util 4 { 5 public static String myName; 6 /* 7 * 无参数,无返回值的方法. 8 */ 9 public static void get

FileInputStream 原理总结 把文件作为字节流进行读操作

package io; import java.io.FileInputStream; import java.io.IOException; public class IOUtil { /** * 读取指定文件内容,按照16进制输出到控制台,为什么要按十六进制? * 并且每输出10个byte换行 * @throws IOException */ public static void printHex(String filename) throws IOException{ //把文件作为字节流