课时103:生成jar文件
摘要:
1. 生成 Jar 文件的概念
2. Jar 打包操作
01. JAR文件的概念
当一个项目开发完成之后,通常会生成大量的 .class 文件。为了方便管理这些文件,可以采用压缩的形式进行处理。通常会将相关的类文件分组打包,例如将 A 组的类文件打包成一个包, B 组的类文件打包成另一个包。在 Java 中,这种打包后的文件称为 JAR 文件。如果希望将程序打包为 Jar 文件,可以直接使用JDK中提供的 Jar 命令。
在早期的 JDK 版本中,可以通过直接输入jar命令来查看其使用方法。然而,从 JDK 1.9 开始,为了统一命令格式,需要使用“—help ” 来查看相关说明。
运行结果如下图:
注:现在只需要执行就可以获得相关命令
02. 打包操作
下面通过程序的具体演示来实现 Jar 的使用与配置的操作
2.1定义一个程序类,这个类的代码如下(简单代码):
恢复 Message 的代码:
package cn.mldn.util; public class Massage { public String getContent(){ return "www.mldn.cn"; } }
2.2对程序进行编译与打包处理:
对程序进行打包编译:javac -d.Message.java;
此时会形成 cn 的包,包里面有相应的子包与 *.class 文件,将其打包为 mldn.jar
; 代码为 jar -cvf mldn.jar cn;
-“-c”:创建一个新的 Jar 文件
-“-v”:得到一个详细输出
-“-f”:设置要生成的 Jar 文件名称,本出定义的是“ mldn.jar
”
通过以上操作,即可完成 Jar 文件的打包处理。
2.3配置 CLASSPATH
打包后的 Jar 文件无法直接使用。
如果删除 cn 文件夹并运行TestMessage.java
文件,将会出现如下错误
在 Java 中,如果你尝试通过 javac -d.TestMessage.java 这样的路径访问某个文件或资源时,系统提示文件不存在,这是因为即使你将文件放置在程序同级目录中,Java 也不会自动识别它。Java 程序需要通过类路径(Classpath)来定位资源文件。如果你尝试用 RAR 工具直接打开一个 JAR 文件,虽然可以查看其内容,但这并不意味着 RAR 能够理解 JAR 文件的结构。
打开 JAR 文件后,你会看到一个名为 META-INF 的目录,这是 JAR 文件的元信息目录,其中包含了一些重要的配置文件,例如 MANIFEST.MF。这个文件是 JAR 文件的清单文件,记录了 JAR 文件的元数据信息,例如主类、版本号、依赖库等。在开发中,尤其是移动应用(如 ME 平台手机游戏)或运营商渠道发布时,这些配置文件会包含应用程序的关键信息,例如渠道标识、运营商配置等。
如果你在程序中无法正确加载资源文件,可能是因为类路径未正确配置。每个 JAR 文件实际上都是一个独立的程序路径,Java 程序需要通过 Classpath 来指定这些路径。要在 Java 程序中使用这些路径,必须通过配置 Classpath 来实现。具体配置方法可以通过命令行参数 -classpath 或环境变量 CLASSPATH 来指定资源文件的路径,确保程序能够正确加载所需的文件或资源。代码操作如下:
SET CLASSPATH=.;d:\mldndemo\mldn.jar
再次运行代码,运行成功
2.4建立测试类
建立一个测试类,直接导入 Message 类并调用方法:
package cn.mldn.test; public class TestMassage { public static void main(String[] args) { cn.mldn.util.Message meg = new cn.mldn.util.Message (); //实例化类对象 System.out.println(msg.getContent()); } }
随后就可以正常编译 TestMessage 类并且使用这个类:
编译程序类: javac -d. TestMessage.java
解释程序: java cn.mldn.test. TestMessage
注:如果现在的程序编译通过,但 CLASSPATH 发生改变,类无法加载到,则执行 TestMessage 类的时候将会出现如下的错误提示: “ Exception in thread”main
”java.long.NoClassDefFoundError:cn/mldn/util/Message
”. 出现这种错误只有一种情况: *jar 包没有配置正确。
注: JDK1.9 以前所有的历史版本之中实际上提供的是一个所有类的 *.jar 文件(rt.jar,tools.jar
),如果启动 Java 虚拟机,那么就需要加载这几十兆的类文件:但是很多时候不需要这么多包,所有在1.9以后提供模块化包,将原本很大的 Jar 文件变为若干个文件,根据需求加载所需模块(模块里面有包),可以实现启动速度变快的效果。
在整个 Java 中,模块名称都在 jdk-9.0.1 jmods
中,程序需要的模块会帮助自动加载,找到程序的说明也需通过模块来找。
在下图的标注的地方做拆分处理,
假设做模块操作,会发现有模块化。
JAR文件里支持了模块化的处理配置,通过它进行控制,但是在现在的开发中,模块化对我们的开发意义不大,有兴趣可自行研究,正常后面会强调分布式的情况,分布式情况下,程序加载是有限的,如果要做一些系统时,这种模块化是有帮助的。