这一章主要介绍:
- 如何把写好的程序交给客户?
- 如何组织、包装与部署Java程序?
13.1 Java的部署
- Java程序是由一组类所组成。那就是开发过程的输出。
- 现在该把程序塑造成可部署给外人使用的形式。
部署分类:
- 本机部署
- 整个程序都在用户的计算机上以独立、可携的GUI执行,并以可执行的Jar来部署。
- 远程部署
- 整个应用程序都在服务器端执行,客户端通过非Java的形式,可能是浏览器的装置来存取。
- 两者间的组合
- 应用程序被分散为用户本地系统运行的客户端,连接到执行应用程序服务的服务器部分。
13.2 JAR
组织类:
-
带有一堆源代码和类文件的目录是非常混乱的,需要让源代码和编译出的文件分开,也就是说确保编译过的类文件不会放在源代码的目录中。
-
关键在于结合
-d
这个编译选项和目录组织的结构。-
项目目录
-
source,源代码
(.java)
存储在该目录下 -
classes,编译时动点手脚让输出
(.class)
产生在classes目录。 -
-d
,实际上是directory -
#编译程序 cd Myproject/source javac -d ../classes MyApp.java #执行程序 cd Myproject/classes java MyApp
-
-
把程序包进JAR:
- JAR就是Java ARchive。
- 这种文件是个
pkzip
格式的文件,它能让一组类文件包装起来,所以交付时只需要一个JAR文件。 - JAR,是指集合起来的文件;jar是用来管理文件的工具。
- 需要创建出可执行的JAR,代表着用户不需要把文件抽出来就能运行。
- 程序可以在类文件保存在JAR的情况下执行。
- 秘诀在于创建出
manifest
文件,它带有JAR信息,告诉虚拟机哪个类含有main()方法。
创建可执行的JAR步骤:
-
确定所有的类文件都在classes目录下
-
创建manifest.txt来描述哪个类带有main()方法
-
Main-Class:MyApp //要有换行
-
该文件放在classes目录下
-
-
执行
jar
工具来创建带有所有类以及manifest
的JAR文件。-
cd MiniProject/classes jar -cvmf manifest.txt app1.jar *.class #或者 jar -cvmf manifest.txt app1.jar MyApp.class
-
-
JAR里面没有源文件
-
执行JAR:
-
大部分完全在本机的Java应用程序都是以可执行的JAR来部署的;
-
Java虚拟机能够从JAR中载入类,并调用该类的main()方法;事实上整个应用程序都可以包在JAR中,一旦main()方法开始执行,JVM不会在乎类从哪来,只要能找到就行。其中一个来源就是classpath指定位置的所有JAR文件。如果看到某个JAR,则Java虚拟机会在需要类时查询次JAR。
-
cd MyProject/classes java -jar app1.jar #-jar标识告诉虚拟机所给的是个JAR
13.3 包
用包主要是防止类名称的冲突。
同时也要防止包命名冲突。——反向使用domain的包名称。
-
com.headfirstjava.projects.Chart
把类包进包中:
-
选择包名称;
-
在类中加入包指令;
-
package com.headfirstjava;
-
每个原始文件智能有一个包指令。
-
-
设定相对应的目录结构。但同时也要把相应源文件放在相对应目录下。
编译包和执行包:
-
当类包在包中,编译和执行都要有技巧,主要问题来自于编译器和Java虚拟机都得要能够找到你的类以及所用到的其他类。
-
#编译 cd MyProject/source javac -d ../classes com/headfirstjava/PackageExercise.java # -d ../classes是要求编译器将输出放到class目录下正确的包位置
-
#执行 cd MyProject/source java com.headfirstjava.PackageExercise
-
必须得指定完整的包名称,Java虚拟机会看得懂并找到当前目录下的com目录,其下应该有headfirst目录,那里应该能找到class,class在其他位置都无法运行。
-
-d
的好处:- 可以把编译结果输出到别的地方;
- 可以把类依照包的组织放到正确的目录上;
- 假设源代码目录结构设定好,但还没有设定相对应的输出目录结构。-d也会让编译器在遇到目录结构尚未建立时主动帮做出来。
以包来创建可执行的JAR:
-
确定所有的类文件都放在class目录下正确相对应的包结构中;
-
创建出manifest.txt文件来描述哪个类带有main(),以及确认有使用完整的类名称;
-
Main-class: com.headfirstjava.PackageExercise
-
然后把manifest文件放在classes目录下。
-
-
执行jar工具来创建带有目录结构与manifest的JAR文件。
-
cd MyProject/classes jar -cvmf manifest.txt packEx.jar com
-
只要指定com目录就行,其下的整个包的类都会被包进JAR中。
-
-
条列和解压的jar命令
-
将JAR内容列出
-
jar -tf packEx.jar
-
-
将JAR内容解开
-
cd Skyler jar -xf packEx.jar
-
-
-
manifest文件所在:
- jar工具会自动地创建
META-INF
目录,以及MANIFEST.MF
文件; manifest.txt
不会被带进JAR中,它的内容会放进真正的manifest
中。
- jar工具会自动地创建