0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

创建jar文件的过程

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-08 15:36 次阅读

在这篇文章中,我们将介绍一下以编程方式创建jar文件的过程。在编写软件时,最终我们需要将其部署到生产状态。在某些情况下,使用带有独立文件的classpath是可以的。通常情况下,处理一个文件会更方便。在Java的情况下,标准的方法是使用JAR、WAR或EAR文件。

基本过程是编写清单,打开jar,添加内容,最后保存jar。

Jar文件的解剖

jar文件是ZIP文件格式的扩展,包含了一个清单文件。清单文件是JAR文件专用的特殊文件,可能包含各种设置。其中一些是主类、可选数据(即作者、版本等)和代码签名信息

我们可以使用兼容zip的工具来查看和提取部分或全部存档。我们还可以包括一个jars或libs子目录,用于包含依赖性jar。由于jar是zip文件的扩展,我们可以包括任何文件或目录。

创建一个 JarTool

为了简化创建JAR文件的过程,我们创建了一个单独的、普通的旧Java对象(POJO)类,它封装了我们的操作。我们可以将条目放入清单文件,创建JAR文件,添加文件或目录。

我们还可以创建方法来执行从JAR中删除,甚至向现有的JAR追加条目,尽管这些操作需要完全读取和重写JAR。

JAR描述符

为了创建一个JAR文件,我们必须首先开始制定清单。

public class JarTool {    
    private Manifest manifest = new Manifest();

    public void startManifest() {
        manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
    }
}

如果我们希望jar是可执行的,我们必须设置主类。

public void setMainClass(String mainFQCN) {
    if (mainFQCN != null && !mainFQCN.equals("")) {
        manifest.getMainAttributes().put(Attributes.Name.MAIN_CLASS, mainFQCN);
    }
}

另外,如果我们想指定额外的属性,我们可以把它们添加到清单中,比如说。

addToManifest("Can-Redefine-Classes", "true");

下面是这个方法。

public void addToManifest(String key, String value) {
     manifest.getMainAttributes().put(new Attributes.Name(key), value);
}

打开JAR文件进行编写

随着清单的完成,我们现在可以把条目写到JAR文件中。要做到这一点,我们必须首先打开JAR。

public JarOutputStream openJar(String jarFile) throws IOException {        
    return new JarOutputStream(new FileOutputStream(jarFile), manifest);
}

将文件添加到JAR中

在向JAR中添加文件时,Java使用Solaris风格的文件名,使用正斜杠作为分隔符(/)。注意,我们可以添加任何类型的文件,包括其他JAR文件或空目录。这对于包括依赖关系来说真的很方便。

另外,因为JAR文件是classpath的一种形式,我们必须指定我们希望在JAR中使用绝对路径的哪一部分。对于我们的目的,根路径将是我们项目的classpath。

了解了这一点,我们现在可以用这个方法完成我们的JarTool类。

public void addFile(JarOutputStream target, String rootPath, String source) 
  throws FileNotFoundException, IOException {
    String remaining = "";
    if (rootPath.endsWith(File.separator)) {
        remaining = source.substring(rootPath.length());
    } else {
        remaining = source.substring(rootPath.length() + 1);
    }
    String name = remaining.replace("","/");
    JarEntry entry = new JarEntry(name);
    entry.setTime(new File(source).lastModified());
    target.putNextEntry(entry);
    
    BufferedInputStream in = new BufferedInputStream(new FileInputStream(source));
    byte[] buffer = new byte[1024];
    while (true) {
        int count = in.read(buffer);
        if (count == -1) {
            break;
        }
        target.write(buffer, 0, count);
    }
    target.closeEntry();
    in.close();
}

一个工作实例

为了证明可执行jar的最低要求,我们将编写一个应用类,然后看看它是如何工作的。

public class Driver {
    public static void main(String[] args) throws IOException {
        JarTool tool = new JarTool();
        tool.startManifest();
        tool.addToManifest("Main-Class", "com.javanorth.createjar.HelloWorld");

        JarOutputStream target = tool.openJar("HelloWorld.jar");
        
        tool.addFile(target, System.getProperty("user.dir") + "srcmainjava",
          System.getProperty("user.dir") + "srcmainjavacomjavanorthcreatejarHelloWorld.class");
        target.close();
    }
}

HelloWorld类是一个非常简单的类,只有一个main()方法可以打印出文本。

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

为了证明它的作用,我们有这个例子。

$ javac -cp src/main/java src/main/java/com/javanorth/createjar/HelloWorld.java
$ javac -cp src/main/java src/main/java/com/javanorth/createjar/JarTool.java
$ javac -cp src/main/java src/main/java/com/javanorth/createjar/Driver.java
$ java -cp src/main/java com/javanorth/createjar/Driver
$ java -jar HelloWorld.jar
Hello World!

在这里,我们已经编译了每个类,然后执行了Driver类,这将创建HelloWorld jar。最后,我们执行了这个jar,结果是打印出了 "Hello World "信息。

上面的命令应该从项目所在地执行。

总结

在本教程中,我们看到了如何以编程方式创建一个jar文件,向其中添加文件,并最终执行。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102994
  • 软件
    +关注

    关注

    67

    文章

    4348

    浏览量

    85621
  • 文件
    +关注

    关注

    1

    文章

    540

    浏览量

    24402
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66767
收藏 人收藏

    评论

    相关推荐

    Android在引用外部sdk时library与jar的区别

    我在开发的过程中遇到一个奇怪的事情为什么我要是引自己的library(直接引源码)会超出dex65536的限制,但是打成jar在引就会暂时性避免这个问题,打成jar之后里边的field,method会有什么变化呢?打
    发表于 10-29 15:30

    关于JAVA不能打包成jar包的问题

    前几天在对JAVA文件打包成jar包时,遇到一些问题,至今未能解决,记录下来,还望大家指教。   在将多个CLASS文件打包成jar包时,比如我要把放在/mysoft/bin目录下的类
    发表于 12-09 11:57

    请问如何打jar包和运行jar包?

    什么:      用法:jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...
    发表于 07-05 01:08

    基于vuforia的图像识别Jar的使用

    Jar包整合入安卓程序中。首先,新建一个安卓应用程序。将提供的Jar包和so库复制粘贴到程序的libs文件夹中(若无此文件夹则新建)。然后,在需要调用图像识别Activity的时候,只
    发表于 09-20 11:58

    JAR文件包及jar命令详解

    制作可执行的JAR文件包及jar命令详解常常在网上看到有人询问:如何把 java 程序编译成 .exe 文件。通常回答只有两种,一种是制作一个可执行的
    发表于 07-12 08:37

    jar命令与jar包简单介绍

    JAR包是Java中所特有一种压缩文档,其实大家就可以把它理解为.zip包。当然也是有区别的,JAR包中有一个META-INF\MANIFEST.MF文件,当你找成JAR包时,它会自动
    发表于 07-12 08:37

    基于FPGA的mif文件创建与使用

     mif文件创建与使用是在基于FPGA的系统设计中引入ROM的关键环节。对mif文件创建与使用展开详细讨论,给出两种可行性方法,并引入实例在MAX+PLUS Ⅱ环境下做了
    发表于 12-13 17:47 42次下载

    c3p0-0.9.1.2 c3p0连接池jar

    c3p0连接池jar包.......................................
    发表于 02-25 11:54 0次下载

    RXTX_java开发的jar

    这是java开发的jar包。
    发表于 09-26 16:31 8次下载

    jar与war之间不得不说的事

    ava编译好之后生成class文件,但如果直接发布这些class文件的话会很不方便,所以就把许多的class文件打包成一个jarjar中除
    的头像 发表于 12-12 15:32 4991次阅读
    <b class='flag-5'>jar</b>与war之间不得不说的事

    如何创建和使用LabVIEW中的LLB文件

    如何创建和使用LabVIEW中的LLB文件
    发表于 11-22 16:12 0次下载

    python创建文件对象

    2.1. 创建文件对象 **open() 函数用于创建文件对象,基本语法格式如下:** open(文件名[,打开方式]) 注意: 如果只是文件名,代表在当前目录下的
    的头像 发表于 06-21 17:19 1070次阅读
    python<b class='flag-5'>创建文件</b>对象

    e² studio创建lib文件及使用

    目录 一、 简介 二、 制作lib文件 三、 调用库函数 四、 总结 一、简介 工程师在开发过程中时常会因为各种原因,想要把部分代码封装成库函数。e 2 studio自带建立库函数工程的功能,本文
    的头像 发表于 07-12 12:05 681次阅读
    e² studio<b class='flag-5'>创建</b>lib<b class='flag-5'>文件</b>及使用

    安全存储文件创建

    安全存储文件创建 使用安全存储时首先需要创建并初始化该安全文件。 如果在创建安全文件之前,/data/tee目录下没有dirf.db
    的头像 发表于 11-21 15:02 228次阅读
    安全存储<b class='flag-5'>文件</b>的<b class='flag-5'>创建</b>

    如何创建重叠的封装文件

    创建重叠的封装文件是一种常用的软件设计模式,它允许程序员使用多层次的连接和封装来保护数据和功能。下面介绍如何创建重叠的封装文件。 重叠的封装是一种软件设计模式,可用于
    的头像 发表于 01-07 16:51 264次阅读