文件目录结构
root src p1\Universe.java Sun.java p2\Star.java classes1 p1\Sun.class p1\Universe.class classes2 p2\Star.class
Universe.java和Sun.java同在p1包内,Star.java是在p2包内。
Universe定义如下,引用了同包的Sun类和异包的Star类。
package p1;
import p2.Star; // 引用了p2包的Star类
public class Universe {
public static void main(String[] args) {
Sun sun = new Sun(); // Sun类在p1包
Star star = new Star(); // Star类在p2包
System.out.println("Universe");
}
}
编译java文件
为了编译Universe,首先要分别编译Sun和Star类,以下命令均在root下输入,注意编译的目的地目录classes#必须存在。
1. 编译Sun类,并把class文件放在classes1目录下:
javac src\p1\Sun.java -d classes1
javac src\p2\Star.java -d classes2
javac -cp classes1;classes2 src\p1\Universe.java -d classes1
注意-cp给的是class文件所在包(p1, p2)的位置。Windows使用分号;分割,Linux使用冒号:分割。
如果class文件都放在同一个目录classes下,用一行命令完成上面三条命令:
javac src\p1\*.java src\p2\*.java -d classes
运行Universe:
java -cp classes1;classes2 p1.Universe
-cp路径中要包含Universe自己所在的位置和所使用的类所在的位置。-cp一定是用包的位置。main类要含包名(p1.Universe)。
打成jar包
jar cf universe.jar -C classes1 . -C classes2 .
c是create,f是file,jar文件名,包含的文件。这里用了-C dir . 是说把dir的内容放进jar包中,而不包含dir自己这个目录。
打包时如果要含manifest,则新建一个manifest.txt:
Main-Class: p1.Universe
注意要含包名。manifest最后一定要空一行。
jar cmf manifest.txt universe.jar -C classes1 . -C classes2 .
m是manifest。
不想新建manifest文件的话:
jar cfe universe.jar p1.Universe -C classes1 . -C classes2 .
在manifest中添加classpath,这样在运行时就不用指定-cp了:
Class-Path: Star.jar
在manifest中添加版本信息:
Name: java/util/
Specification-Title: Java Utility Classes
Specification-Version: 1.2
Specification-Vendor: Example Tech, Inc.
Implementation-Title: java.util
Implementation-Version: build57
Implementation-Vendor: Example Tech, Inc.
包密封(sealing),保证在包中使用的类都是在jar包中的:
Name: com/package/
Sealed: true
显示jar包内容:
jar tf universe.jar
jar xf universe.jar
运行jar包:
java -jar universe.jar
java -cp universe.jar p1.Universe
java -cp universe.jar;classes2 p1.Universe