文章目录

  • 负一、运行环境与前置要求
  • 零、编写并编译 java 源代码文件
    • 编写 java 源代码文件
    • 编译 java 源代码文件
  • 一、编写 MANIFEST.MF 文件
  • 二、将编译得到的 .class 文件进行打包
    • 使用 MANIFEST 文件打包
    • 使用自动生成的 MANIFEST 文件打包
  • 三、执行 .jar 文件
  • 四、整体流程

负一、运行环境与前置要求

  1. 使用 Linux 环境;
  2. 安装了 JDK (Java Development Kit);

注:由于后面用到的 jar 工具是 JDK 的一部分,如果只安装了 JRE 而没有安装 JDK 的话可能会没有该工具。

零、编写并编译 java 源代码文件

如果懒得看中间的内容,建议看完 “零、编写并编译 java 源代码文件” 后直接跳到 “四、整体流程”。

编写 java 源代码文件

例如,当前 java 文件名为 “Hello.java”,该文件中有一个主类 Hello,包声明为 testproject.hello,源代码如下:

package testproject.hello;
public class Hello {public static void main(String[] args) {System.out.println("Hello World!");}
}

编译 java 源代码文件

Hello.java 所在的目录运行一个命令提示符 或 Shell,在终端输入如下命令:

javac -d . Hello.java

其中 -d 参数指明在何处安置文件树,例如 -d . 表示将编译得到的文件树,安置在当前目录下。如果不使用 -d 参数,java 编译器也可以正确地生成 Hello.class 文件,但是并不会创建文件树,而是直接在当前目录创建 Hello.class 文件。正确的文件树结构是 java 项目能够生成可执行 jar 包的必要条件

编译后生成的文件树结构如下:

└─testproject└─helloHello.class

可以看到, Hello.class 类文件被安置在了目录 testproject/hello 中。同理,java 源代码中定义的每一个类在编译后都会得到一个 .class 文件,他们会被安置在 package 声明对应的文件树中。

一、编写 MANIFEST.MF 文件

MANIFEST.MF 的基本格式如下。

Manifest-Version: 1.0
Created-By: 作者
Main-Class: 入口类

这里的入口类不仅要指出类名,还要包含这个类的包的名字,例如上述项目,我们可以这样编写 MANIFEST 文件。

Manifest-Version: 1.0
Created-By: GGN_2015
Main-Class: testproject.hello.Hello

方便起见,我们把 MANIFEST.MF 它放在了当前目录。

需要注意的是 MANIFEST 文件末尾必须要有一个空行,而且每行的冒号后面必须要有一个空格。

注:如果忘记了文件末尾的空行,打包操作能够正确进行,但是这样得到的 jar 包在运行时会产生一个错误:no main manifest attribute, in 文件名.jar。如果冒号后忘记了空格,会在生成 jar 包时产生一个运行时错误:java.io.IOException: invalid header field

二、将编译得到的 .class 文件进行打包

使用 MANIFEST 文件打包

在终端输入如下命令进行打包:

jar cvfm 目标文件名.jar MANIFEST.MF <被打包的class文件序列>

注:此时必须保证 .class 文件均位于自己正确的文件树结构中,否则打包得到的 .jar 文件将无法运行。

例如上面的例子中我们可以使用如下的编译命令:

jar cvfm Hello.jar MANIFEST.MF ./testproject/hello/Hello.class

执行此命令后,当前目录下生成了一个名为 Hello.jar 的文件,如果有很多 .class 文件要被加入到文件序列中,可以使用 *.class 或者 *.* 等带通配符的文件名。

使用自动生成的 MANIFEST 文件打包

还有一种不用自己创建 MANIFEST 文件的打包方式:

jar cvfe Hello.jar 入口类 <被打包的class文件序列>

这里的 “入口类” 也要给出完整的包名,格式和 MANIFET 文件中要求相同。通过这种方式打包无需自己创建 MANIFEST 文件,编译得到的 .jar 中会根据这个入口类自动创建一个 MANIFEST 文件。

三、执行 .jar 文件

使用如下命令即可执行一个有 MANIFEST 文件的 .jar 文件。

java -jar 文件名.jar

例如,在上面的例子中我们可以这样运行 Hello.jar

java -jar Hello.jar

四、整体流程

打包时使用自动生成的 MANIFEST 文件,编译与打包命令大致结构如下:

javac -d . *.java # 编译当前目录下的所有 .java 文件
jar cvfe 文件名.jar 入口类名 包路径/*.class
java -jar 文件名.jar # 运行 jar 包

示例:

javac -d . Hello.java
jar cvfe Hello.jar testproject.hello.Hello testproject/hello/Hello.class
java -jar Hello.jar

Java 制作 jar 包的基本流程相关推荐

  1. 不使用 Maven 等构建工具,而使用原始方法在 IntelliJ IDEA 中制作 JAR 包

    不使用 Maven 等构建工具,而使用原始方法在 IntelliJ IDEA 中制作 JAR 包 说明 步骤 说明 本文的 原始 Java 程序,指的是不使用项目构建工具(如 Maven)而建立起的一 ...

  2. java bat 运行 jar文件_运行bat文件启动java的jar且不弹出DOS窗口,后台运行java的jar包...

    本文主要是将java的jar包启动的cmd命令添加到bat文件来执行,且不弹出DOS窗口,也就是后台运行java的jar包. 这里以win10为例 1.新建 一个txt文件,在文件添加以下内容.其中E ...

  3. java执行jar中的main_浅谈java 执行jar包中的main方法

    浅谈java 执行jar包中的main方法 通过 OneJar 或 Maven 打包后 jar 文件,用命令: java -jar ****.jar 执行后总是运行指定的主方法,如果 jar 中有多个 ...

  4. Java:Java的jar包之POI的简介、安装、使用方法(基于POI将Word、Excel、PPT转换为html)之详细攻略

    Java:Java的jar包之POI的简介.安装.使用方法(基于POI的转换-Word.Excel.Ppt等转html)之详细攻略 目录 POI的简介 1.基本功能 POI的安装 POI的使用方法(基 ...

  5. java -jar 停止_推荐:Linux启动Java程序jar包Shell脚本

    每次启动Java程序jar包的时候,难道你还在手敲java -jar xxserver.jar--?边敲边想着都需要追加哪些参数? 今天就推荐给大家一个几乎通用的Shell脚本,它支持Java程序Ja ...

  6. java jar 源码乱码,java使用jar包时出现乱码的解决方法

    java使用jar包时出现乱码的解决方法 发布时间:2020-06-17 17:06:29 来源:亿速云 阅读:105 作者:元一 jar包是什么: jar(Java Archive,Java归档文件 ...

  7. python调用java的jar包_python调用java的jar包报错127

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 最近在弄python需要调用到Java的jar包,按照网上的教程走,最后总是报错No matching overloads found for [init ...

  8. Java常见Jar包的用途

    jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用来发现.查找和实现可插入式接口,提供一些一般类实例化.单件的生命周期管理的常用方法. jaxrp ...

  9. 如何快速查找下载java项目所需jar包

    如何快速查找下载java项目所需jar包? JAVA开发过程中,有时需要查找一些jar包,有什么方法可以快速的查找并下载到项目所需jar包? ------------有效建议1------------ ...

最新文章

  1. 未入选新一轮“双一流”!两所高校官宣
  2. python 作业4
  3. 数据仓库项目管理面试题整理(十一)
  4. 第五讲 一阶自治ODE
  5. Sparkmllib scala svm demo
  6. Kubernetes学习总结(9)—— 基础架构的未来是 K8s,那么 K8s 的未来在何方?
  7. [LeetCode118]Pascal's Triangle
  8. 阿里云流水线主机离线启动
  9. 购物车的简单添加与计算
  10. QQ群发消息c语言编程,简单写一个实现QQ群发功能的软件
  11. linux V4L2子系统——v4l2架构(5)之v4l2_device与v4l2_subdev异步机制
  12. 中文名字和英文名字正则匹配
  13. 基于微信小程序的游泳馆管理系统设计与实现-计算机毕业设计源码+LW文档
  14. 原生JS编写简单的编辑器
  15. 深度解读《关于防范NFT相关金融风险倡议》透露哪些监管信号与数字藏品新发展之路?
  16. English语法_关系代词 - 定义与分类
  17. 复旦大学游记(r10笔记第88天)
  18. FreeSwitch调试小技巧
  19. 五、c++学习(加餐1:汇编基础学习)
  20. 全新 ADAS 和自动驾驶车辆系统的处理器性能和安全要求

热门文章

  1. 我的技术投资策略:如何决定学习哪一个新技术的?
  2. ctfhub 默认口令
  3. 商标被抢注如何提出商标异议
  4. JavaScript唐山市地图网页代码
  5. python中numpy.mean()函数,深度理解axis的含义
  6. STA series --- 5 .Delay Calculation
  7. 关于RecyclerView的缓存
  8. 2019-9-2-windows-10「设置」应用完整ms-settings快捷方式汇总
  9. 从零实现深度学习框架——LSTM从理论到实战【理论】
  10. soar SQL分析工具与soar-web可视化