廖雪峰Java2面向对象编程-5包和classpath-4classpath和jar

1.classpath

1.1classpath定义

  • classpath是一个环境变量
  • classpath指示JVM如何搜索class
  • classpath设置的搜索路径与操作系统相关
    * window使用分号分割的,Mac、Linux使用冒号分割的
    • C:\work\project1\bin;C:\shared;"D:\My Document\project2\bin"
    • /usr/shared:/usr/local/bin:/home/csj/bin

1.2classpath用途

假设classpath是 .;C:\work\project1\bin;C:\shared
jvm在加载com.feiyangedu.Main这个类时,依次查找:
当前目录\com\feiyangedu\Hello.class
C:\work\project1\bin\com\feiyangedu\Hello.class
C:\shared\com\feiyangedu\Hello.class

  • 在某个路径下找到了,就不再继续搜索
  • 如果没有找到,报错

1.3classpath的设定方法

  • 直接在系统变量中设置classpath环境变量(不推荐)
  • 在启动JVM时设置classpath变量(推荐)
java -classpath C:\work\bin;C:\shared com.feiyangedu.Hello
java -cp C:\work\bin;C:\shared com.feiyangedu.Hello
  • 没有设置环境变量,也没有设置-cp参数,默认当前目录为classpath
  • 在eclipse中运行Java程序,eclipse自动传入的-cp参数是当前工程的bin目录和引入的.jar

2.jar包

2.1jar包的组成

  • jar包是zip格式的压缩文件,包含若干.class文件
  • jar包相当于目录
  • classpath可以包含jar文件: C:\work\bin\all.jar
  • com.feiyangedu.Hello类将在classpath给予的目录中搜索com/feiyangedu/Hello.class
  • 使用jar包可以避免大量的目录和.class文件

2.2jar包的创建

  • 使用jdk自带的jar命令
  • 使用构建工具如maven等
  • 直接压缩

2.3jar包的其他功能

2.4jdk的class

  • jvm运行时会自动加载jdk自带的class
  • jdk自带的class被打包在rt.jar
  • 不需要在classpath中引用rt.jar

3.实例

Hello.java

package com.feiyang;
public class Hello {
    private final String name;
    public Hello(String name){
        this.name = name;
    }
    public String hello(){
        return "Hello, " + name + "!";
    }
}

Main.java

package com.feiyang;
public class Main {
    public static void main(String[] args){
        Hello h = new Hello("World");
        System.out.println(h.hello());
    }
}

3.1指定运行文件

运行Main文件,生成class文件。将class所在目录压缩为jar包
以IDEA为例,class文件在其项目路径下的target/classes里

cd target/classes/
zip -q -r test.jar *
java -cp test.jar com.feiyang.Main

3.2直接运行jar包

新建META-INF/MANIFEST.MF文件,重新执行main文件,在classes目录下会生成META_INF文件,将classes下的所有文件打包

Manifest-Version: 1.0
Main-Class: com.feiyang.Main
X-Copyright: blablabla
X-Build-Version: 1.0
zip -q -r main.jar *
java -jar main.jar 

4.总结:

  • JVM通过环境变量classpath决定搜索class的路径和顺序
  • 不推荐设置系统环境变量classpath,始终建议通过-cp命令传入
  • jar包相当于目录,可以包含很多class文件,方便下载和使用
  • META-INF/MANIFEST.MF可以提供jar包的信息,如Main.Class
  • 不需要在classpath中引用包含Java核心类的rt.jar

猜你喜欢

转载自www.cnblogs.com/csj2018/p/10285341.html