准备源码
// Animal.java
public abstract class Animal{
public void eat(){
System.out.println("Animal eating");
}
}
// Dog.java
public class Dog extends Animal{
public void bark(){
System.out.println("Dog barking");
}
}
// Cat.java
public class Cat extends Animal{
public void meow(){
System.out.println("Cat meowing");
}
}
// Helloworld.java
import java.util.*;
public class Helloworld{
public static void main(String[] args){
new Helloworld().go();
}
public void go(){
ArrayList<Animal> animals = new ArrayList<Animal>();
animals.add(new Dog());
animals.add(new Cat());
animals.add(new Dog());
takeAnimals(animals);
ArrayList<Dog> dogs = new ArrayList<Dog>();
dogs.add(new Dog());
dogs.add(new Dog());
dogs.add(new Dog());
takeAnimals(dogs);
}
public void takeAnimals(ArrayList<? extends Animal> animals){
for(Animal animal:animals){
animal.eat();
}
}
}
编译
java -d ../classes *.java
,要求编译器将编译得到的文件输出至 classes目录。
运行
在classes目录下执行javac Helloworld
,运行程序。
创建JAR
JAR(Java ARchive),创建JAR包,分两步。
- 在classes目录下创建
manifest.txt
。
manifest文件告诉Java虚拟机,哪个类中含有main()
这个方法。
Main-Class: Helloworld
注意哈,Main-Class:
与Helloworld
之间有一个空格,Helloword
之后需要换行。
jar -cvmf manifest.txt Helloworld.jar *.class
,执行jar命令来创建带有所有类文件及manifest的JAR。
我们不妨来看看生成的Helloworld.jar
里到底有什么。
jar -tf Helloworld.jar
,tf(Table File),条列出JAR中的内容。
咦,里面并不包含manifest.txt
,但META-INF(META-INFormation)目录里有一个MANIFEST.MF
文件。
jar -xf Helloworld.jar
,xf(eXtract File),将JAR内容解压至当前目录,来看看MANIFEST.MF
里面有啥。
可以看到,虽然manifest.txt
文件本身没有被带入JAR中,但其内容(哪个类中包含 main()
这个方法)放进了真正的manifest,也就是MANI-INF/MANIFEST.MF
里。
执行JAR
java -jar Helloworld.jar
,执行JAR包。
Java虚拟机能够从JAR中载入类,并调用类中的main()
方法。
为防止类名称冲突,把类包进包;
为防止包命名冲突,则反向使用域名作包名,比如域名是cctv.com
,则包名为com.cctv
。
把类包进包
准备源码
// Helloworld.java
package com.cctv;
public class Helloworld{
public static void main(String[] args){
System.out.println("This is a demo");
}
}
编译
javac -d ..classes com/cctv/*.java
,要求编译器将编译得到的文件输出至classes目录。
执行
在classes目录下,执行java com.cctv.Helloworld
,运行程序。
创建JAR
创建JAR,分两步。
- 第一步:在classes目录下创建
manifest.txt
manifest文件告诉Java虚拟机哪个类中含有main()
这个方法。
Main-Class: com.cctv.Helloworld
- 第二步:
jar -cvmf manifest.txt Helloworld.jar com
,执行jar命令来生成带有所有类及manifest的JAR。