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


    1.classpath

    1.1classpath定义

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

    1.2classpath用途

    假设classpath是 .;C:workproject1in;C:shared
    jvm在加载com.feiyangedu.Main这个类时,依次查找:
    当前目录comfeiyangeduHello.class
    C:workproject1incomfeiyangeduHello.class
    C:sharedcomfeiyangeduHello.class

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

    1.3classpath的设定方法

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

    2.jar包

    2.1jar包的组成

    • jar包是zip格式的压缩文件,包含若干.class文件
    • jar包相当于目录
    • classpath可以包含jar文件: C:workinall.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下的所有文件打包 ```#xml Manifest-Version: 1.0 Main-Class: com.feiyang.Main X-Copyright: blablabla X-Build-Version: 1.0 ``` ```#shell zip -q -r main.jar * java -jar main.jar
    <img src="https://img2018.cnblogs.com/blog/1418970/201901/1418970-20190118190321398-60545465.png" width="500" />
    
    #    4.总结:
    *    JVM通过环境变量classpath决定搜索class的路径和顺序
    *    不推荐设置系统环境变量classpath,始终建议通过-cp命令传入
    *    jar包相当于目录,可以包含很多class文件,方便下载和使用
    *    META-INF/MANIFEST.MF可以提供jar包的信息,如Main.Class
    *    不需要在classpath中引用包含Java核心类的rt.jar
  • 相关阅读:
    mysql -- 备忘
    Linux基础命令---压缩与打包
    nginx rewrite
    重启php-fpm
    Mysql:输出到文件
    IOS 自定义Layer(图层)
    IOS CALayer基本使用 (图层)
    IOS 拖拽事件(手势识别)
    IOS 旋转+缩放(手势识别)
    IOS 长按+轻扫(手势识别)
  • 原文地址:https://www.cnblogs.com/csj2018/p/10285341.html
Copyright © 2020-2023  润新知