java命令行执行 jar_java命令打包jar

java命令行执行 jar_java命令打包jar摘要这个技巧阐明了如何不直接处理清单文件而将一个不能运行jar包转换成一个可以执行的jar包。学会如何写一段转换jar包的程序,将你的jar包转换成你能使用java-jar命令运行jar包或象在windows系统上那样通过双击来运行jar包。你可以很容易地将一个应用的所有的类和资源打包到一个jar文件中去。事实上,这只是打包的一个原因。另一个原因是让用户很容易地执行包中的应用。那么在java的…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

摘要

这个技巧阐明了如何不直接处理清单文件而将一个不能运行jar包转换成一个可以执行的jar包。学会如何写一段转换jar包的程序,将你的jar包转换成你能使用java -jar 命令运行jar包或象在windows系统上那样通过双击来运行jar包。

你可以很容易地将一个应用的所有的类和资源打包到一个jar文件中去。事实上,这只是打包的一个原因。另一个原因是让用户很容易地执行包中的应用。那么在java的世界里,为什么jar是第二类公民――仅仅用作打包――当他们能成为第一类公民的时候,能和本地执行程序一样吗?

如果想执行jar文件,可以使用java命令的-jar选项。例如,你有一个可以运行的myjar.jar文件。因为该文件是可以执行的,所以你可以用如下命令执行之:java –jar myjar.jar。此外,安装在windows JRE将会把jar文件和JVM关联起来,以便通过双击来运行jar应用。

现在的问题是:如何把jar做成可以运行的包?

清单文件和主类条目

在大多数jar文件中,在目录META-INF里有个叫MANIFEST.MF的文件。在该文件中,有一个叫Main-Class的特殊条目,它说明了java -jar命令执行的类。

问题是你必须正确地在清单文件中加入这个特殊的条目――它必须是在特定的位置和特定的格式。可是,好多人不喜欢修改配置文件。

用API修改改配置

从java1.2之后,一个叫java.util.jar的包可以操作jar文件(注:它架构在java.util.zip包之上)。Jar包能让你通过Manifest类很容易地操作专门的清单文件。

让我们使用这些API写一个程序。首先,这个程序必须知道三件事:

我们想让它执行的jar文件;

我们想执行的main类(这个文件必须存在于jar包中);

我们要输出的新jar包的名称,因为不是简单地覆盖原文件;

编写代码

上面的列表将组成我们程序的参数。在这里,让我们选择一个合适名字,MakeRunnable咋样?

检查送入main的参数

假设我们的main入口是标准的main(String[])方法。我们首先应该检查程序的参数:

if (args.length != 3) {

System.out.println(“Usage: MakeJarRunnable “

+ “

“);

System.exit(0);

}

由于对后面的程序执行非常重要,一定要注意这个参数列表是如何解释的。参数的顺序和内容不是一成不变的;如果你改变了它们,记得要修改其它代码。

存取jar和它的清单文件

首先,我们必须创建一些知道jar和清单文件的对象:

//创建JarInputStream对象,获取它的清单

JarInputStream jarIn = new JarInputStream(new FileInputStream(args[0]));

Manifest manifest = jarIn.getManifest();

if (manifest == null) {

//如果清单不存在

manifest = new Manifest();

}

设置Main类的属性

我们把Main-Class条目放到清单文件里main属性部分。一旦我们从mainfest对象中得到这个属性集,我们就能设置合适的main类。然而,如果Main-Class属性存在于原始的JAR文件中怎么办?这个程序仅仅打印出一个警告信息并退出。或许,我们可以添加一个命令行参数告诉程序使用新值而不是使用以前的一个:

Attributes a = manifest.getMainAttributes();

String oldMainClass = a.putValue(“Main-Class”, args[1]);

//如果旧值存取,显示提示信息并退出

if (oldMainClass != null) {

System.out.println(“Warning: old Main-Class value is: “

+ oldMainClass);

System.exit(1);

}

输出新的JAR包

我们需要创建一个新的jar文件,因此我们必须使用JarOutputStream类。注意:我们必须确保输出文件和输入文件不相同。作为可选方案,应该考虑如果两个文件同名,程序应该提示用户是否覆盖原始文件。我将这个作为练习留给读者。下面是代码。

System.out.println(“Writing to ” + args[2] + “…”);

JarOutputStream jarOut = new JarOutputStream(new FileOutputStream(args[2]),  manifest);

我们必须将输入jar中每一个条目写到输出jar文件中去,因此,在所有的条目上进行枚举:

//为了从输入中转移数据而创建读缓存

byte[] buf = new byte[4096];

//枚举所有条目

JarEntry entry;

while ((entry = jarIn.getNextJarEntry()) != null) {

//排除旧jar文件中的清单文件

if (“META-INF/MANIFEST.MF”.equals(entry.getName())) continue;

//把条目写到输出jar文件中去

jarOut.putNextEntry(entry);

int read;

while ((read = jarIn.read(buf)) != -1) {

jarOut.write(buf, 0, read);

}

jarOut.closeEntry();

}

//刷新和关闭所有的流

jarOut.flush();

jarOut.close();

jarIn.close();

完成程序

当然,我们必须将这些代码放到一个类中的main方法中,以及引入一些需要的包。资源一节提供了完整的程序。

用法例子

让我们用一个例子说明如何使用这个程序。假设你有一个main入口在叫做HelloRunnableWorld(类全名)类之中的应用,以及你已经创建了一个叫做myjar.jar的jar包,它包含了整个应用。在这个包上运行MakeJarRunnable,如下所示:

java MakeJarRunnable myjar.jar HelloRunnableWorld myjar_r.jar

此外,如前所述,注意我是如何安排参数列表顺序的。如果你忘记了顺序,运行一下这个不带参数的程序,它将会显示一个用法信息。

试着用java -jar命令运行myjar.jar文件,之后在myjar_r.ja文件上。注意他们的不同!完成之后,研究在每一个jar包中的清单文件(META-INF/MANIFEST.MF)。

建议:试着将MakeJarRunnable制作成一个可以运行的Jar文件!

用它处理你想运行的jar包

通过双击或者使用简单的命令运行一个jar包,总是要比把它放到 gagaghost

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/185795.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • LQR控制器(控制器的功能是什么)

    LQR控制器是常见的最优控制器,它的主要特点是将控制量加入到了成本函数中。对于线性系统:x˙=Ax+Bu\dotx=Ax+Bux˙=Ax+Bu设计控制器u=−Kxu=-Kxu=−Kx使得J=12∫0∞xTQx+uTRu dtJ=\frac{1}{2}\int_0^\inftyx^TQx+u^TRu\,dtJ=21​∫0∞​xTQx+uTRudt最小。其中,xTQxx^TQxxTQx是状态部分,uTRuu^TRuuTRu是控制部分。为了求解K,需要引入Riccati微分方程:P

  • 最长上升子序列 (LIS) 详解+例题模板 (全)

    最长上升子序列 (LIS) 详解+例题模板 (全)欢迎访问https://blog.csdn.net/lxt_Lucia~~宇宙第一小仙女\(^o^)/~~萌量爆表求带飞=≡Σ(((つ^o^)つ~dalao们点个关注呗~~————————————我只是一条可爱哒分界线————————————–1.摘要:关…

  • 声源定位方法_声源定位算法

    声源定位方法_声源定位算法目录1.TDOA简介2.时延估计3.定位估计4.声源定位根据现有的研究成果来看,声源定位(SoundSourceLocalization,SSL)存在以下几种方法:基于最大输出功率的可控波束成形的定位方法、基于高分辨谱估计的定位方法和基于到达时延差(TimeDifferenceofArrival,TDOA)估计的定位方法,以及基于机器学习的方法。其中基于时延估计的定位方法计算量小,实时性好,实用性强等特点,我们就先介绍这种较为简单的声源定位算法。基于TDOA的方法一般

  • 监督学习和无监督学习区别

    监督学习和无监督学习区别前言机器学习分为:监督学习,无监督学习,半监督学习(也可以用hinton所说的强化学习)等。在这里,主要理解一下监督学习和无监督学习。监督学习(supervisedlearning)从给定的训练数据集中学习出一个函数(模型参数),当新的数据到来时,可以根据这个函数预测…

  • winrar下载_标致408后尾晃完美解决方案

    winrar下载_标致408后尾晃完美解决方案本文参考撸Linux的文章https://www.lulinux.com/archives/13192018年wineQQ最完美解决方案(多Linux发行版通过测试并稳定运行)腾讯官方早就在10年代初就停止运营Linux版QQ,然而民间折腾Linux版QQ的脚步从来没停过。时至今日,它总算有了完美无暇的方案——deepinwine系列。要感谢deepin公司的最大努力。也…

  • redis(五)Jedis连接redis[通俗易懂]

    redis(五)Jedis连接redis[通俗易懂]一、创建项目1.1、创建项目,导入依赖<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.0.0</version></dependency>注意:远程服务器器可以连通p

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号