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

"); 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。

(#)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

状态设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 …

python基础——错误处理

python基础——错误处理 在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因。在操作系统提供的调用中,返回错误码非常常见。比如打开文件的函数ope…

Js操作Select大全(取值、设置选中等等)

jquery操作select(取值&#xff0c;设置选中&#xff09; 每一次操作select的时候&#xff0c;总是要出来翻一下资料&#xff0c;不如自己总结一下&#xff0c;以后就翻这里了。 比如<select class"selector"></select> 1、设置value为pxx的项选中 $(&qu…

java获取数组的最小值_Java 数组获取最大和最小值的实例实现

以下实例演示了如何通过 Collections 类的 Collections.max() 和 Collections.min() 方法来查找数组中的最大和最小值&#xff1a;Main.java 文件&#xff1a;import java.util.Arrays;import java.util.Collections;public class Main {public static void main(String[] args…

Spring_事务(2)

转载于:https://www.cnblogs.com/yang-hao/p/5830952.html

heroku_本月风味– Neo4j和Heroku

herokuNeo4j今年早些时候发起了一项挑战&#xff0c;即“ 种子播云 ”&#xff0c;以使人们使用Neo4j附加组件在Heroku上创建模板或演示应用程序。 经过许多内部辩论之后&#xff0c;我决定进入&#xff0c;但由于缺乏想法而陷入绝望。 当我没有做任何特别的事情时&#xff0c;…

java object对象的方法_Java常见对象Object类中的个别方法

Java常见对象Object类public int hashCode() &#xff1a; 返回该对象的哈希码值。注意&#xff1a;哈希值是根据哈希算法计算出来的一个值&#xff0c;这个值和地址值有关&#xff0c;但是不是实际地址值。你可以理解成地址值。packagecommon_object;public class Demo extend…

很认真地聊一聊程序员的自我修养

最近看了《浅谈程序员的英语学习》&#xff0c;对于文章中的观点我非常认同&#xff0c;英语是非常重要的&#xff0c;但文章站的高度还是太高&#xff0c;具体表述的学习方法我不是很认同&#xff0c;也认为不太实际&#xff0c;恰好之前有一篇一直没有发表的文章想重新发布&a…

Java设计模式教程

课程大纲 架构和计算机科学中的设计模式是记录特定专业领域中设计问题的解决方案的正式方法。 这个想法是由建筑师Christopher Alexander在建筑领域引入的&#xff0c;并已被改编为其他各种学科&#xff0c;包括计算机科学。 设计模式是在软件设计中给定上下文中对常见问题的通…

java字符串学习_java之字符串学习记录

java之字符串学习记录public class StringDemo {public static void main(String[] args) {//静态初始化字符串String s1 "hello china!";String s3 "Hello China!";System.out.println(s1);//动态初始化字符串String s2 new String("hello china!…

IMPDP导入实例(oracle)

【IMPDP导入实例】&#xff1a; su - oracle sqlplus /nolog conn /as sysdba select * from dba_directories; 开始 通过Xshell连接linux服务器后&#xff1a; Connecting to 10.149.56.40:22... [rootoracle ~]# su - oracle [oracleoracle ~]$ sqlplus /nolog SQL> conn …

java中解密技术是什么_详解Java 加密解密技术的分类和归纳

这篇文章主要介绍了Java加密解密基础分类方法汇总的相关资料&#xff0c;需要的朋友可以参考下Java 加密解密基础&#xff1a;密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律&#xff0c;应用于编制密码以保守通信秘密的&#xff0c;称为编码学&#xff1b…

三级菜单的三个版本

1.这是我们通过一般方式进行的&#xff0c;就是按照正常的思路来写的&#xff0c;一步一步走 1 #_author:sangshijia2 #date:2016/8/243 menu_map{4 "河南":{5 "郑州":["新密","登封","中牟"],6 "…

java实现细胞自动机_Java自动机实现

java实现细胞自动机这篇文章将解决在Java中实现有限状态机的问题。 如果您不知道什么是FSM或在什么地方可以使用FSM&#xff0c;您可能会热衷于阅读本 &#xff0c; 本和本 。 如果您发现自己在设计上使用FSM的情况&#xff0c;则可能已经开始为实现相同接口的每个状态编写类。…

代理设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

调研《构建之法》指导下的历届作品

项目名称&#xff1a;未视APP学校&#xff1a;吉首大学团队&#xff1a;北京必趣科技有限公司 简介&#xff1a;发现未知的视界http://plus.jlu.edu.cn/item.php?id377 延续电影瞬间的感动&#xff0c;发现视界未知的温暖 理由:无优势,很多劣势,可是延续电影瞬间的感动&#x…

java图形旋转动画_Java动画:旋转图像

我将假设您了解如何旋转图像一次.如果你不这样做,你可以通过快速谷歌搜索找到它.您需要的是一个为您旋转它的后台进程.它的工作原理如下&#xff1a;/*** Warning - this class is UNSYNCHRONIZED!*/public class RotatableImage {Image image;float currentDegrees;public Rot…

java golang速度_golang思考之运行速度

有些资料显示golang的运行速度很慢&#xff0c;比Java慢&#xff0c;有时比Python慢。学习吧测试发现golang的运行速度和Java差不多。首先&#xff0c;使用各种语言编写同一个CPU密集的程序sum。C(或C)#include #include #include int main(void){int iN;int64_t jN;scanf(&quo…

java 中的正则表达式_Java中的正则表达式–软介绍

java 中的正则表达式正则表达式是一种可以应用于文本&#xff08;Java中的String&#xff09;的模式。 Java提供了java.util.regex包&#xff0c;用于与正则表达式进行模式匹配。 Java正则表达式与Perl编程语言非常相似&#xff0c;并且非常易于学习。 正则表达式匹配文本&…

HTML5移动端触摸事件

工作了近一个月了 因为公司是主要偏向于移动端&#xff0c;开始不懂移动端事件 一直用的click click在安卓端没有什么问题 但在IOS端就有问题了点击之后会延迟半秒 多亏旁边大神指点 原来 iOS上的Safari也支持click 和mouseover等传统的交互事件&#xff0c;只是不推荐在iOS…