### Java Jar 打包详解 #### 一、引言 在深入探讨Java打包技术之前,我们需要先理解何为`jar`文件。`jar`(Java Archive)文件是一种用于存储多个类文件、相关元数据和资源文件(如图像或文档)的标准格式。这种格式类似于ZIP文件,但具有额外的功能,例如允许类文件的签名以及定义类路径。 #### 二、基础知识 **1. 压缩的目的** - **组织文件**:通过将多个文件压缩到一个文件中,可以更方便地管理和分发。 - **便于管理**:压缩后的文件结构清晰,易于维护。 - **简化部署**:将项目中的所有组件整合到一个文件中,使得部署过程更加简单。 **2. JAR文件的特点** - **自包含**:JAR文件通常包含运行时所需的全部类文件和其他资源。 - **可执行**:如果包含有主类信息(`Main-Class`),则可以直接作为应用程序运行。 - **支持依赖管理**:可以通过指定类路径(`Class-Path`)来引用其他JAR文件。 #### 三、创建JAR文件 **1. 输入:** - **Class文件**:编译后的Java源代码。 - **资源文件**:如图片、HTML文件等非Java源码文件。 - **Manifest文件**:一个文本文件,包含了JAR文件的元数据信息。 **2. 输出:** - **JAR文件**:包含所有输入文件的一个压缩文件。 **3. 创建过程:** - 使用`jar`命令工具,该工具随JDK一起提供。 #### 四、使用`jar`命令详解 **1. 命令格式** ``` jar {c|u|x|t} [vfm0Mi] [jar-file] [manifest-file] [-C directory] files ``` - `c`: 创建新的JAR文件。 - `u`: 更新现有的JAR文件。 - `x`: 解压JAR文件。 - `t`: 查看JAR文件内容。 - `v`: 详细模式,显示添加文件的信息。 - `f`: 指定JAR文件名。 - `m`: 包含manifest文件。 - `-C`: 更改目录。 - `-0`: 不使用ZIP压缩方式。 - `-M`: 不生成manifest文件。 - `-i`: 为JAR文件添加信息。 **2. 示例** - **示例1:创建一个简单的JAR文件** ```shell jar cvf classes.jar Foo.class Bar.class ``` 这条命令会创建一个名为`classes.jar`的JAR文件,并将`Foo.class`和`Bar.class`这两个类文件添加进去。 - **示例2:创建包含manifest文件的JAR文件** ```shell jar cvfm classes.jar mymanifest -C foo/. ``` 其中`foo/`是一个目录,包含了`HelloWorld`类。`mymanifest`是一个manifest文件,通常包含以下内容: ```properties Manifest-Version: 1.0 Created-By: 1.4.2 (Sun Microsystems Inc.) Main-Class: HelloWorld ``` **3. 主类(`Main-Class`)** - 在manifest文件中声明`Main-Class`属性,以便指定程序的入口点。 - 示例: ```properties Manifest-Version: 1.0 Created-By: 1.4.2 (Sun Microsystems Inc.) Main-Class: HelloWorld ``` `HelloWorld`类的代码可能如下所示: ```java public class HelloWorld { public static void main(String[] args) { System.out.println("Hi, HelloWorld!"); } } ``` **4. 运行JAR文件** - 使用`java -jar`命令运行JAR文件: ```shell java -jar hello.jar ``` **5. 解析manifest文件** - 如果manifest文件未正确配置,可能会导致运行时错误。例如: ```shell jar umf MANIFEST.MF app.jar ``` 这条命令会更新`app.jar`文件,并使用`MANIFEST.MF`文件。如果`MANIFEST.MF`文件缺少`Main-Class`属性,则会导致运行时出现`FileNotFoundException`。 #### 五、JAR文件与Tomcat **1. 将JAR文件部署到Tomcat** - 将JAR文件部署到Tomcat中,通常有两种方式:一种是直接将JAR文件放入`lib`目录;另一种是将其包装成WAR文件,即Web应用归档文件。 **2. 示例** - 假设有一个简单的Servlet,名为`HelloWorld`,其代码如下: ```java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello, World!</title>"); out.println("</head>"); out.println("<body>"); out.println("Hello, World!"); out.println("</body>"); out.println("</html>"); } } ``` - 配置`web.xml`文件: ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>hello</servlet-name> <servlet-class>HelloWorld</servlet-class> </servlet> ... </web-app> ``` **3. 部署步骤** - 编译`HelloWorld`类。 - 创建一个包含`HelloWorld.class`的JAR文件。 - 创建一个WAR文件,包含JAR文件和`web.xml`配置文件。 - 将WAR文件放置在Tomcat的`webapps`目录下。 - Tomcat会在启动时自动解压WAR文件,并根据`web.xml`配置部署应用。 #### 六、总结 通过以上内容,我们可以看出,JAR文件是Java开发中不可或缺的一部分,它不仅帮助开发者更好地组织和管理项目文件,还提供了高效的部署机制。了解并掌握JAR文件的创建和使用方法,对于每一个Java开发者来说都是极其重要的技能。
那我们的输入(要压缩的东西)主要是class文件,还有辅助的资源(这其中可能有图片,jsp文件,html文件等等)。Jar技术在jdk1.1版本中就已存在,在1.2中又有了增强。接下来说说jar的好处吧,这是官方的描述:安全,快速下载,压缩,猎取包,版本化包,可携。
说了这么多,我们现在开始实施。
先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1.1或以上版本),看到什么:
用法:jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...
选项:
-c 创建新的存档
-t 列出存档内容的列表
-x 展开存档中的命名的(或所有的〕文件
-u 更新已存在的存档
-v 生成详细输出到标准输出上
-f 指定存档文件名
-m 包含来自标明文件的标明信息
-0 只存储方式;未用zip压缩格式
-M 不产生所有项的清单(manifest〕文件
-i 为指定的jar文件产生索引信息
-C 改变到指定的目录,并且包含下列文件:
如果一个文件名是一个目录,它将被递归处理。
清单(manifest〕文件名和存档文件名都需要被指定,按'm' 和 'f'标志指定的相同顺序。
示例1:将两个class文件存档到一个名为 'classes.jar' 的存档文件中:
jar cvf classes.jar Foo.class Bar.class
示例2:用一个存在的清单(manifest)文件 'mymanifest' 将 foo/ 目录下的所有文件存档到一个名为 'classes.jar' 的存档文件中:
jar cvfm classes.jar mymanifest -C foo/ .
来个小例子试试看:
我们只有一个HelloWorld,如下:
public class HelloWorld{
public static void main(String[ ] args){
System.out.println("Hi, Hello World!");
}
}
剩余7页未读,继续阅读
- 粉丝: 9
- 资源: 15
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于SimPy和贝叶斯优化的流程仿真系统.zip
- (源码)基于Java Web的个人信息管理系统.zip
- (源码)基于C++和OTL4的PostgreSQL数据库连接系统.zip
- (源码)基于ESP32和AWS IoT Core的室内温湿度监测系统.zip
- (源码)基于Arduino的I2C协议交通灯模拟系统.zip
- coco.names 文件
- (源码)基于Spring Boot和Vue的房屋租赁管理系统.zip
- (源码)基于Android的饭店点菜系统.zip
- (源码)基于Android平台的权限管理系统.zip
- (源码)基于CC++和wxWidgets框架的LEGO模型火车控制系统.zip