public class ModifyManifest extends AbstractCmdTest{
// private String jarPath="E:\\xxx\\junit-4.8.1.jar"; //要修改自述文件的Jar包路径
// private String jarPath2="E:\\xxx\\junit.jar"; //jar包零时存放路径
@Override
public boolean execute() {
String jarPath=this.getInputInfo("jarPath").toString(); //获取需要修改自述文件的Jar包路径
String jarPath2=this.getInputInfo("jarPath2").toString();//获取Jar零时存放路径
Map manifestMap=(Map) this.getInputInfo("manifest"); //获取带有描述信息的Map
try {
JarFile jarFile = new JarFile(jarPath); //得到要修改的Jar包
Manifest mf=jarFile.getManifest(); //得到其自述文件
StringBuffer attributes=new StringBuffer(); //存放描述信息的StringBuffer
Set maniSet=manifestMap.keySet();
for(Object obj:maniSet){ //向StringBuffer中添加Map中的信息
String key=obj.toString();
String value=(String)manifestMap.get(obj);
attributes.append(key+value+"\n");
}
//把Map中的信息以UTF-8的形式放到流
InputStream mfStream = new ByteArrayInputStream(attributes.toString().getBytes("UTF-8"));
Manifest newmf=new Manifest(mfStream); //用包含Map信息的流生成Manifest
SoftReference<Manifest> manifest=new SoftReference(newmf); //得到Manifest 软引用
Field filed=JarFile.class.getDeclaredField("manRef"); //得到SoftReference<Manifest>反射
filed.setAccessible(true);
filed.set(jarFile, manifest);
//*************输出信息确认修改正确*********
Attributes a=jarFile.getManifest().getMainAttributes();
Set i=a.keySet();
for(Object o:i){
System.out.println(o.toString()+a.getValue(o.toString()));
}
//生成修改后的文件
JarOutputStream jarOutput=new JarOutputStream(new FileOutputStream(jarPath2),newmf);//用新的Manifest文件生成Jar输出流
JarInputStream jarInput = new JarInputStream(new FileInputStream(jarPath)); //jar文件输入流
JarEntry jarEntry=null;
byte[] jarByte=new byte[4096];
while((jarEntry=jarInput.getNextJarEntry())!=null){
jarOutput.putNextEntry(jarEntry);
int length;
while((length=jarInput.read(jarByte))!=-1){
jarOutput.write(jarByte, 0, length);
}
jarOutput.closeEntry();
}
jarOutput.flush();
jarOutput.close();
jarInput.close();
//用新生成的jar包覆盖原来的jar包
FileInputStream fileInput=new FileInputStream(jarPath2);
FileOutputStream fileOutput=new FileOutputStream(jarPath);
byte[] fileByte=new byte[4096];
int fileLength;
while((fileLength=fileInput.read(fileByte))>0){
fileOutput.write(fileByte, 0,fileLength);
}
fileOutput.flush();
fileOutput.close();
fileInput.close();
File f=new File(jarPath2);
f.delete();
return true; //返回true
} catch (IOException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return false;
}
public static void main(String[] args){
//输入参数
Map manifest=new HashMap();
manifest.put("Manifest-Version:", " 123456789.0");
manifest.put("Ant-Version:", " Apache Ant 1.789.1");
manifest.put("Created-By:", " 1.5.0_20-141 (Apple Inc.)");
manifest.put("guga:", " gaaaaa");
M
分享到:
相关推荐
- 归档文件的新名称是xqjapi.jar。 - API方法已被移除。 7. 策略: - “通知ARIS关于服务变更”的政策中包含已删除的操作。 - 设计时策略对正则表达式的处理发生了变更。 8. Web服务互操作性: - 如果WSDL...
这个工具在项目中尤其有用,因为它可以帮助开发者实时跟踪指定目录下的文件或目录的添加、删除、移动和修改事件。`jpathwatch` 的版本为0.95,包含了自述文档,这对于学习和理解如何使用该库非常有帮助。 ### 1. ...
这是 Blackboard Downloader 的自述文件。 该程序将提示输入 blackboard 的用户名和密码,并将从 Blackboard 下载所有文档。 它以与 blackboard 相同的方式构建下载,因此您的教学大纲文件将在“教学大纲”文件夹下...
注意:本自述文件正在进行中。 对MDHT感兴趣的任何人:请随时通过PR修改,更新TODO字段或将其添加到其中的任何部分。 说明文件: 用户文档的两个最佳位置是: 注意:这些信息中有些已经过时,但是大多数仍然非常...
可执行 jar 文件的主类调用 X-definition 的 API(在 jar 存档中稍作修改以缩短其某些复杂性:请参阅自述文件),因此最终用户可以专注于学习 X-definition 格式,这是一个XML 词汇表。 整个项目邀请您利用由 XML ...
自述文件 有效Java书籍中的示例示例。 项目模板和汇总 我们构建一个项目模板。 该模板基于 。 我们做了以下修改的地方: mvn执行 我们可以使用maven exec执行而不是生成一个jar文件:请参阅。 如此处所述: : 那...
自述文件 这是过去 50 年选举结果的简单地理可视化。 使用从美国人口普查局和美国地质调查局收集的数据,我们可以绘制出候选人在总统选举中从美国各县获得的选票比例 我该如何设置? 编译“HelloWorldExample.java...
自述文件 基于JNA的连字符Java API 该软件包包含连字符的基于JNA的Java绑定,有关详细信息,请参见: : 。 这个Java包装器位于: : 请参阅此页面以获取字典: : 构建本机二进制文件 在使用Java API之前,您必须...
其他非关键的TODO项目TODO-编写更好的自述文件待办事项-删除静态lib目录中未使用的文件待办事项-查找更好的操作图标待办事项-编写测试TODO-清理ListData和ItemData类,删除未使用的方法TODO-将关联数组映射列表添加...
工作自述文件工作 3 - 面向对象编程(描述: ://goo.gl/krggc4)教授:Adenilso Simão 这项工作是由以下人员开发的: Giovanni Robira - 8531887 Jorge Simondi - 8517081 Victor Luiz da Silva Mariano Pereira - ...
招聘自述文件定义您可以使用此命令查看日志heroku 日志 --tail 应用修改后,重新打包./gradlew -Pprod bootRepackage -x 测试然后重新部署它./gradlew -Pprod bootRepackage -x test && heroku deploy:jar --jar ...
4. `README.md`:项目的自述文件,通常会提供项目简介、安装和使用指南。 5. `.gitignore`:定义了版本控制系统应该忽略的文件和目录,防止不必要的文件被提交。 使用TrelloExporter之前,你可能需要安装Java ...
"自述文件将很快更新"提示我们,API的文档可能正在更新或完善中。一个清晰、详尽的Readme文件对于开发者理解和使用API至关重要,通常会包含API的安装指南、使用示例、错误处理和版本信息等内容。 总的来说,"exam-...
了解模块的声明、导出和导入,以及对JAR和应用程序的影响,对于现代Java开发是必要的。 11. **函数式编程**:Java 8开始引入函数式编程特性,如Lambda表达式、Stream API和方法引用。熟悉这些新特性,能够编写简洁...