Java命令行下Jar包打包小结

jar包打包实现

jar包打包可以使用jar指令实现打包,在命令行中输入jar可以查看jar指令的内容

从最后显示的两个示例看出存在两种打包的方法,两者的区别就是是否使用自己定义的MANIFEST清单文件。第一个示例没有使用MANIFEST文件进行打包,所以最终生成的jar包中MANIFEST文件为默认文件,这种方式适用于比较简单的jar包结构,不存在其他jar包依赖以及生成的jar包不需要可执行。这种方式生成的jar包不能使用java -jar XXX.jar命令执行,因为MANIFEST文件中未指定程序入口。而第二个实例是比较常用的打包方式,即是使用自定义的MANIFEST文件参与打包,这样能够实现往包中添加依赖,并且可以指定程序入口,实现java -jar XXX.jar 直接运行jar包。

第一种简单的打包方式

最简单的就是在当前文件夹下将编译的class字节码文件进行打包输出。示例如下:
编写三个java文件,test1.java test2.java 以及Main.java

public class test1
{
  public static void main(String[] args)
  {
  }
  public void display()
  {
    System.out.println("this is class test1");
  }
}

以及test2.java 文件

public class test2
{
  public static void main(String[] args)
  {
  }
  public void display()
  {
    System.out.println("this is class test2");
  }
}

Main.java

public class Main
{
  public static void main(String[] args)
  {
    for(String a:args)
    {
      System.out.println("给定的参数"+a);
    }
    test1 t1 = new test1();
    t1.display();
    test2 t2 = new test2();
    t2.display();
  }
}

命令行下将这三个文件进行编译,使用javac命令实现编译。

用jar指令将编译的class文件打包

打包过程中有显示已添加清单。用解压工具打开生成的test.jar包,可以看到如下的结构:

除了编译的三个class文件外多了一个META-INF文件夹,里面有一个MANIFEST.MF(清单文件)的文件,这个文件的作用非常重要,后面说明。我们先看它里面的内容

非常简单的清单,只包含清单版本与java版本。

这个时候执行java -jar test.jar有如下效果:

没有主清单属性报错。这是因为我们使用第一种方法生成jar使用了默认的清单,默认清单没有指定程序入口,所以出错。
可以直接更改jar包中的MANIFEST文件(解压工具打开,更改后保存),改成如下效果:

再一次执行java -jar test.jar 后程序输入正确内容:

在MANIFEST文件中添加了Main-Class属性指定了程序入口,实现了直接执行jar文件。
所以说使用默认的MANIFEST是不能直接执行jar文件,要么使用自己定义的MANIFEST文件打包,要么更改包中的MANIFEST文件。

第二种打包方式

第二种打包方式更加通用,一般情况下java文件第一行都是package XXX;即是包名,也决定了编译后的class文件存在的路径。当有多个java文件要编译打包并且他们存在不同的包名时,如果还是按照第一种方法打包时一个文件一个文件的写非常不现实,所以有了第二种方法。将所有要打包的class文件存在的目录以及依赖的jar包全部放在一个根文件夹里面(比如是foo),然后编写MANIFEST清单文件,指定程序入口以及其他添加的依赖的jar包。在执行指令:

注意 上面的指令中foo/ 文件夹后面有一个空格还有一个点

下面看一个例子

同样还是test1.java与test2.java以及Main.java 但是各自有自己的包名。

package cn.mytest1;
public class test1
{
  public static void main(String[] args)
  {
  }
  public void display()
  {
    System.out.println("this is class test1");
  }
}
package cn.mytest2;
public class test2
{
  public static void main(String[] args)
  {
  }
  public void display()
  {
    System.out.println("this is class test2");
  }
}
package cn.mymain;
import cn.mytest1.test1;
import cn.mytest2.test2;
public class Main
{
  public static void main(String[] args)
  {
    for(String item:args)
    {
      System.out.println("传递参数"+item);
    }
    test1 t1 = new test1();
    test2 t2 = new test2();
    t1.display();
    t2.display();
  }
}

同样使用javac 指令编译,三个class文件存在于不同的路径下,因为他们包名不一样。把编译号的含有class文件的文件夹全部放在foo文件夹下:

然后在foo 外面写一个MANIFEST文件:

MANIFEST内容如下:

注意:MANIFEST 文件最后一行是空行。

命令行下执行指令:jar cvfm test.jar MANIFEST.MF -C foo/ .

在命令行下测试jar包是否能够直接运行了,使用指令java -jar test.jar

正确打包,成功运行jar.

MANIFEST文件介绍

通过上面的两个例子,可以看到MANIFEST文件对于jar打包都是必须的。MANIFEST文件描述了打包后的jar文件的详细信息,存在于打包后的META-INF 的文件夹.一个简单的MANIFEST文件主要内容如下:

主要就是Manifest-Version Main-Class Class-Path这三个属性在制作jar包时非常重要.Manifest-Version 是版本号,照着写就行。Main-Class则是jar包的入口程序,指定运行的类的全称(一定要包含包名),这样可以使用java -jar name.jar直接运行jar包。第三个Class-Path是指的打包时需要依赖的其他jar包,打包的时候自己的程序中也可能含有其他的jar包所以要添加依赖。

注意每个MANIFEST属性冒号与内容之间都有一个空格,并且写完后最后还要留有一行空行,不然运行时还是出现找不到主清单属性的错误

小结

jar文件打包容易出错的地方就是Manifest清单文件的编写,容易出一些格式上的错误比如属性的冒号和内容之间少空格,Class-Path中添加依赖之间没有空格,依赖文件过多,多行书写的时候每行开头没加空格,文件最后一行没有空行等等。写MANIFEST文件的时候注意这些关键的地方就不会在打包上面耗费太多的时间。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java使用命令行打包JAR

    1.命令行的方式:打包jar cf JAR文件名称 程序文件名称或者程序所在的文件夹举例:jar cf MyApp.jar D:JavaProjectMyApp查看一个jar文件的内容jar tvf JAR文件名称举例:jar tvf MyApp.jar将一个jar文件解压缩jar xf JAR文件名称举例:jar xf MyApp.jar往压缩包里面增加文件jar xf JAR文件名称 添加的文件或者其他的jar文件举例:jar xf MyApp.jar Test.class更新一个jar文件

  • Java命令行下Jar包打包小结

    jar包打包实现 jar包打包可以使用jar指令实现打包,在命令行中输入jar可以查看jar指令的内容 从最后显示的两个示例看出存在两种打包的方法,两者的区别就是是否使用自己定义的MANIFEST清单文件.第一个示例没有使用MANIFEST文件进行打包,所以最终生成的jar包中MANIFEST文件为默认文件,这种方式适用于比较简单的jar包结构,不存在其他jar包依赖以及生成的jar包不需要可执行.这种方式生成的jar包不能使用java -jar XXX.jar命令执行,因为MANIFEST文件

  • 将java程序打成jar包在cmd命令行下执行的方法

    前言 大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口.本文将给大家介绍java程序打成jar包在cmd命令行下执行的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.打包 二.修改配置文件是程序能够引用第三方jar包 1.新建一个文件夹,用来存储这个项目 ------------第三方jar包单独存在一个文件夹下面(这里放在了lib下面)(重点是lib要和weixin.jar同

  • 通过Spring Shell 开发 Java 命令行应用

    提到 Java,大家都会想到 Java 在服务器端应用开发中的使用.实际上,Java 在命令行应用的开发中也有一席之地.在很多情况下,相对于图形用户界面来说,命令行界面响应速度快,所占用的系统资源少.在与用户进行交互的场景比较单一时,命令行界面是更好的选择.命令行界面有其固定的交互模式.通常是由用户输入一系列的参数,在执行之后把相应的结果在控制台输出.命令行应用通常需要处理输入参数的传递和验证.输出结果的格式化等任务.Spring Shell 可以帮助简化这些常见的任务,让开发人员专注于实现应用

  • Java命令行运行错误之找不到或无法加载主类问题的解决方法

    目录 前言: 一. 问题分析 二. 问题解决 1. 类名错误 2. 类所在位置未添加至类加载路径中 三.扩展知识 1. JDK目录结构及环境变量介绍 2. 为什么jdk1.5后不需要配置环境变量了? 总结 前言: 虽然学习Java语言约有两年多,但在最近需要使用命令行工具编译并运行Java程序时,还是报错了.花费了一些时间,解决了该问题,发现解决方法在初学Java时使用过.一则,为了避免以后再出现同样的问题而浪费不必要的时间:二则,作为使用该语言的程序员,对于该语言的一些基本问题,应该有清晰的理

  • windows下jar包开机自动重启的步骤

    最近做了很多项目,不同的系统,不同的部署方式,这里做个记录 1.在jar包目录新建一个start.bat  文件,然后写入启动命令 jar -jar XXXX.jar 2.仍然在此目录,新建start.vbs 文件,然后写入一下命令,命令最后一个0是隐藏窗口运行 createobject("wscript.shell").run"D:\start.bat",0 3.创建run.vbs的快捷方式,移动到:C:\ProgramData\Microsoft\Windows

  • maven springboot如何将jar包打包到指定目录

    目录 如何将jar包打包到指定目录 1.目的 2.修改pom 3.修改启动脚本 jar包外指定配置文件及原理 解决方案 运行 原理 如何将jar包打包到指定目录 今天分享一下springboot将jar包打包到指定目录下. 由于之前上线都是一个打包到一个jar,由于服务多了,1个包100多M,哪怕是小版本上线都需要重新上传jar包. 1.目的 将不常用的比如spring,druid等不常用打包到lib目录,这样每次上线不需要上传这些.第三方或者常改动的还打包到本身的jar包内,每次上线都会新打包

  • maven springboot如何将jar包打包到指定目录

    目录 如何将jar包打包到指定目录 1.目的 2.修改pom 3.修改启动脚本 jar包外指定配置文件及原理 解决方案 运行 原理 如何将jar包打包到指定目录 今天分享一下springboot将jar包打包到指定目录下. 由于之前上线都是一个打包到一个jar,由于服务多了,1个包100多M,哪怕是小版本上线都需要重新上传jar包. 1.目的 将不常用的比如spring,druid等不常用打包到lib目录,这样每次上线不需要上传这些.第三方或者常改动的还打包到本身的jar包内,每次上线都会新打包

  • jar包打包成exe安装包的实现

    目录 1.介绍 2.打包配置 mysql配置 3.项目配置 4.项目打包 1.介绍 jar包启动我们通常是部署在服务器上,用户通过访问服务器来使用系统,但是如果用户想弄成电脑本端单机版,这时候部署的问题就比较麻烦了,不可能每个用户都部署一遍,那么这时候需要弄成exe安装形式,或者脚本安装形式,一键安装部署! 现在我就介绍如何将jar包打包成exe安装包 介绍:比如一个普通的springboot前后端分离项目,含有组件:redis,Nginx , 数据库: Mysql         思路:将用到

  • centos 6.8命令行下使用pptpsetup进行pptp拨号的实现方法

    centos 6.8 命令行下可使用pptpsetup进行pptp拨号 1.先安装ppp,pptp和pptp-setup三个包 yum install -y ppp pptp pptp-setup 2.使用pptpsetup进行连接 pptpsetup --create VPN名字 --server 服务器IP --username 用户名 --password 密码 --encrypt --start [root@centos6-8-1 ~]# pptpsetup --create vpn -

  • linux命令行下使用R语言绘图实例讲解

    使用系统:centos 6.4 64bit 在R语言中可以使用png()等函数生成图片,例如: png("aa.png")可以生成图片. 但是如果你是通过shell远程连接到系统上,可能会碰到如下错误: > png("aa.png") 错误于.External2(C_X11, paste("png::", filename, sep = ""), g$width,  :    无法打开PNG设备 此外: 警告信息: In

随机推荐