"); System.exit(0); }

请注重参数列表是如何被解释的,因为这对于后面的代码是非常重要的。参数的顺序和内容并不是硬性设置的,但是假如你改变它们也要记得适当的修改其他的代码。

访问JAR和它的manifest文件

首先我们必须创建一些知道JAR和manifest文件的对象:

//Create the JarInputStream object, and get its manifest JarInputStream jarIn = new JarInputStream(new FileInputStream(args[0])); Manifest manifest = jarIn.getManifest(); if (manifest == null) { //This will happen if no manifest exists manifest = new Manifest(); }

设置Main-Class属性

我们将Main-Class条目放到manifest文件的主要属性部分。一旦我们从manifest对象获得了这个属性集我们就可以设置适当的主类。然而假如一个Main-Class属性已经存在于原来的JAR时怎么办?这个程序简单的打印一个警告并退出。或许我们可以增加一个命令行参数告诉程序用新的值替换已经存在的那个值.

Attributes a = manifest.getMainAttributes(); String oldMainClass = a.putValue("Main-Class", args[1]); //If an old value exists, tell the user and exit if (oldMainClass != null) { System.out.println("Warning: old Main-Class value is: " + oldMainClass); System.exit(1); }

输出新的JAR

我们需要创建一个新的jar文件,因为我们必须使用JarOutputStream类。注重我们必须保证没有将输入作为输出使用。作为替代,也许程序应该考虑两个jar文件相同并且提示用户是否覆盖原来的。然而我将这个保留给读者作为练习。

System.out.println("Writing to " + args[2] + "..."); JarOutputStream jarOut = new JarOutputStream(new FileOutputStream(args[2]), manifest);

我们必须将原来的JAR中的每个条目都写到新的JAR中,因为对那些条目迭代:

//Create a read buffer to transfer data from the input byte[] buf = new byte[4096]; //Iterate the entries JarEntry entry; while ((entry = jarIn.getNextJarEntry()) != null) { //Exclude the manifest file from the old JAR if ("META-INF/MANIFEST.MF".equals(entry.getName())) continue; //Write the entry to the output JAR jarOut.putNextEntry(entry); int read; while ((read = jarIn.read(buf)) != -1) { jarOut.write(buf, 0, read); } jarOut.closeEntry(); } //Flush and close all the streams jarOut.flush(); jarOut.close(); jarIn.close();

完整程序

当然我们必须将这些代码放到一个类里面的main方法里面,并且具有合适的import声明。

使用范例

让我们用一个范例来使用这个程序。假设你有一个应用其main入口点是类HelloRunnableWorld(这个是它的全类名,也就是包含包名),同样假设你已经创建了一个名字为myjar.jar的JAR,包含整个应用。对于这个jar,我们像这样运行MakeJarRunnable:

java MakeJarRunnable myjar.jar HelloRunnableWorld myjar_r.jar

再强调一次,就像早先提到的,注重参数列表的顺序。假如忘记了顺序,以无参的形式运行程序它就会告诉你使用信息。

使用java -jar命令运行myjar.jar和myjar_r.jar,注重它们的差异。完成这些之后,查看一下它们的manifest文件(META-INF/MANIFEST.MF)。

这里有一个建议:将MakeJarRunnable制作成一个可以运行的JAR!

运行它

通过双击一个JAR或者使用简单的命令总是比将它包含在你的classpath并运行特定的main类方便。为了帮助你作到这一点,JAR规范为JAR的manifest文件提供了一个Main-Class属性。我在这里提出的这个程序让你利用Java的JAR API非常轻易的操作这个属性并制作你自己的可运行的JAR。

(#)

jar包不用java命令_使不能运行的JAR文件可以使用java -jar运行相关推荐

  1. jar包一键重启动的shall脚本(可自动判断当前服务是否运行中)

    使用方法 使用 vi/vim 命令在应用 jar 包所在目录下新建一个 restart.sh 的文件 vi restart.sh 复制上面的代码,更改该文件权限为可执行 chmod +x restar ...

  2. jar包启动基础命令

    一般情况下运行jar包,当前是可运行的jar包,直接命令 java -jar common.jar 按下ctrl+C ,关闭当前ssh或者直接关闭窗口,当前程序都会退出. 我们在命令的结尾添加 &qu ...

  3. jenkins 自动化远程部署——部署war包,jar包的bat命令

    目录 1. 部署war包bat @rem 停止在运行的tomact D: cd D:\Program Files\apache-tomcat\bin call shutdown.battitle my ...

  4. 阿里云服务端SDK下载的jar包通过maven命令安装(maven手动安装本地jar包到项目)...

    有些jar包未开源,在maven中央仓库没有未开源的jar包,所以pom文件里不能自动联网下载,可以通过maven命令手动安装本地maven仓库中,手动安装不需要联网,前提是本地已经有要安装的jar包 ...

  5. 命令行,使用java的java 命令,直接调用执行class文件

    目录 0.最基本使用,参照下面链接(以前整理的资料) 1.直接调用java文件■cmd 2.调用jar包(Main Class打包到 jar包时) 3.补充说明 4.运行时,设置系统变量 5.查看类运 ...

  6. 快速替换jar包中.class、.html、.yml格式的文件

    快速替换jar包中.class..html..yml格式的文件 文章目录 快速替换jar包中.class..html..yml格式的文件 背景 下载反编译软件JD-GUI 使用 jd-gui 打开we ...

  7. 使用java的java 命令,直接调用执行class文件

    使用java的java 命令,直接调用执行class文件_sun0322-CSDN博客_java 执行class 更多操作: 命令行,使用java的java 命令,直接调用执行class文件_sun0 ...

  8. java io 文件路径_如何从Java项目中的相对路径读取文件? java.io.File找不到指定的路径...

    如何从Java项目中的相对路径读取文件? java.io.File找不到指定的路径 我有一个包含2个包的项目: ListStopWords.txt ListStopWords.txt 在包(2)中我有 ...

  9. 在Jmeter中添加的JSR223 Sampler后,目前网上资源只有python2.7的jar包,是否有哪位仁兄,有支持python3的jar包,请支持一次。

    在Jmeter中添加的JSR223 Sampler后,目前网上资源只有python2.7的jar包,是否有哪位仁兄,有支持python3的jar包,请支持一次. 附上python2.7的jar包的下载 ...

最新文章

  1. 企业管理,难的是什么?
  2. l293d电机驱动原理_一文搞懂步进电机特性、原理及驱动器设计
  3. 使用调用者权限实现Schema导向操作
  4. Linux之Shell脚本的条件判断和函数
  5. hibernate_day03_MySQL数据库-表与表之间的多对多关系-实例
  6. 【C++基础】异常匹配与内建异常类
  7. 2013年28周信息安全汇总(7.7 - 7.13)
  8. TensorFlow学习之——checkpoints
  9. 开启sql server2008的1433端口
  10. 经济学建模软件 python_从python创建“经济学人”风格的图形
  11. 《Cortex-M0权威指南》之体系结构---栈空间操作
  12. Ehcache学习总结(1)--Ehcache入门介绍
  13. CoreAnimation-CABasicAnimation
  14. 标学教育计算机等级考试系统,标学教育电脑版
  15. RoboWare的安装与使用
  16. PDF文件太大,教你一个方法让PDF文件变小
  17. 单细胞测序系列之二:单细胞基因组测序
  18. python求不规则图形面积_使用Python生成不规则形状的图形
  19. Canal Admin Web-UI 学习
  20. [论文解读]Bayesian Generalized Kernel Inference for Terrain Traversability Mapping

热门文章

  1. [渝粤教育] 中国地质大学 工业通风及除尘 复习题
  2. 【渝粤题库】陕西师范大学165107工作分析与设计作业(高起专)
  3. 【渝粤题库】国家开放大学2021春1020国际私法题目
  4. Lindley equation
  5. electronjs MySQL,javascript – 在Electron应用程序中使用sql.js.
  6. 远程声控系统(MATLAB代码见CSDN资源)
  7. curl -windows下接口通讯
  8. Java 实现常见排序算法
  9. css background size
  10. 职场交流:一位软件工程师的7年总结