iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java中classpath讲解及使用方式
  • 213
分享到

Java中classpath讲解及使用方式

2024-04-02 19:04:59 213人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

笔者之前对于classpath都没有什么深入的研究,之前的项目打包jar包都是按照网上的教程自己照着葫芦画瓢。但是因为最近碰到一些关于这方面的知识,因此索性觉得要好好补充一下这方面的

笔者之前对于classpath都没有什么深入的研究,之前的项目打包jar包都是按照网上的教程自己照着葫芦画瓢。但是因为最近碰到一些关于这方面的知识,因此索性觉得要好好补充一下这方面的知识。下面的文章主要是翻译自oralce官网关于设置classpath的说明Setting the class path,并对其中一些地方进行了部分的补充说明,方便读者理解。

概要

classpath是Java运行时环境搜索类和其他资源文件(比如jar\zip等资源)的路径。可以通过jdk工具(比如javac命令、java命令)后面的-classpath 参数设置classpath(这个可以通过装有java环境的dos窗口下输入sdktool的命令来查看可以输入的参数选项,见下图)

或通过设置CLASSPATH环境变量。该 -classpath选项是首选项,因为您可以为每个应用程序单独设置,而不会影响其他应用程序,而无需其他应用程序修改其值。

下面是这两种方式的说明示例:

  • (1)通过jdk的命令行来为每个application设置

这个设置主要是为每个application设置,并不会影响别的程序的classpath以及环境变量的classpath,他只在当前窗口生效。

C:> sdkTool -classpath classpath1 ;classpath2 …

  • (2)设置classpath环境变量,这个是全局设置,对所有的应用程序生效

C:> set CLASSPATH=classpath1 ;classpath2 …

sdkTool

一个命令行工具,例如java, javac,javadoc,或apt。有关列表,请参阅JDK工具。

classpath1 ;classpath2

.jar,.zip或.class文件的classpath。每个classpath应以文件名或目录结尾,针对不同的情况,设置classpath的格式方法如下:

  • (1)对于包含.class文件的.jar或.zip文件,classpath以.zip或.jar文件的名称结尾。

下面是示例,笔者自己将一个工程打包成jar包,同时指定这个jar包下的某个class文件运行。结果如下:

下面是工程的目录,其中工程中引用了其他jar包,笔者在打包的时候,用Maven的assembly插件打包成了一个fat jar(想要了解具体打包方法,查看这两篇博文:

【Java】打包Jar包并用脚本执行

【Maven】Maven系列(二)——利用assembly插件打包

查看下面的classpath的值是怎么指定的。

  • (2)对于未命名包中的.class文件,classpath以包含.class文件的目录结束。比如一个a.class文件在d:path1\path2下,但是这个a.class没有package,那么如果想让JVM搜索到这个class文件,这时指定classpath的时候,可以使用d:path1\path2,因为classpath的默认路径是当前路径,因此在使用的时候,如果是在当前路径下打开dos窗口,classpath命令缺省,那么这个时候其效果与指定当前路径为classpath的效果等效。如下的示例:

test.java

public class test {
    public static void main(String[] args) {
        System.out.println("hello world!");
    }
}

这个类是没有package的。

下面是运行结果:

程序运行成功

  • (3)对于命名包中的.class文件,类路径以包含“root”包(完整包名称中的第一个包)的目录结束。

示例如下:

Equals.java在名为string的package下

package string;
public class Equals {
    public static void main(String[] args){
        String a=new String("test");
        String b=new String("test");
        System.out.println(a==b);
    }
}

那么对于这种情况,指定classpath的方式如下:

通过上面几条命令,可以看出来正确的命令行格式如下:

java -classpath package_rootpath package_name.class_name

多个路径条目以分号分隔。使用set命令,等号(=)周围的空格可以忽略。

默认classpath是当前目录。设置 CLASSPATH变量或使用 -classpath命令行选项将覆盖该默认值,因此,如果要在搜索路径中包含当前目录,则必须在新设置中包含“ . ”(关于路径的说明可以参考笔者的另一篇博文)。

既不是目录也不是归档(.zip或.jar文件)和*的classpath会被忽略。

描述

类路径告诉JDK工具和应用程序在哪里可以找到第三方和用户定义的类 - 即不是Java 扩展或Java平台的一部分的类。类路径需要找到你用javac编译器编译的任何类——其默认值是当前目录,以方便地找到这些类。

JDK,JVM和其他JDK工具通过按顺序搜索Java平台(bootstrap)类,任何扩展类和类路径来查找类。(有关搜索策略的详细信息,请参阅如何找到类。)大多数应用程序的类库都希望利用扩展机制。您只需要设置classpath,当您要加载的class满足下面的条件(a)不在当前目录或其任何子目录中的类时,(b)不在扩展机制指定的位置。

如果要从旧版本的JDK升级,启动设置可能包含CLASSPATH不再需要的设置。您应该删除任何不是特定于应用程序的设置,例如classes.zip。使用Java虚拟机的某些第三方应用程序可能会修改您的CLASSPATH环境变量以包含它们使用的库。这样的设置可以保持不变。

当您调用JVM或其他JDK工具或使用环境变量时,可以使用JDK工具’ -classpath选项来更改classpath。使用该选项优于设置环境变量,因为您可以为每个应用程序单独设置,而不会影响其他应用程序,而无需其他应用程序修改其值。

类可以存储在目录(文件夹)或归档文件(这里指的归档文件也就是那些jar包和zip包)中。Java平台类存储在 rt.jar。有关归档的更多详细信息以及有关类路径的工作原理的信息,请参阅本文档末尾附近的类路径和包名称。

重要说明:某些旧版本的JDK sofware 在默认的类路径中包含一个/classes条目。该目录存在供JDK软件使用,不应用于应用程序类。应用程序类应放在JDK等级目录之外。这样,安装新的JDK并不会强制您重新安装应用程序类。为了与旧版本兼容,使用/classes目录作为类库的应用程序 将以当前版本运行,但不保证将在以后的版本中运行。

使用JDK工具的-classpath选项

JDK工具java,jdb,javac和javah有一个-classpath选项,用于替换由classpath环境变量指定的路径 。这是改变classpath设置的推荐选项,因为每个应用程序都可以具有所需的classpath,而不会干扰任何其他应用程序。

运行时工具java也有一个 -cp选项。此选项是-classpath的缩写。

对于非常特殊的情况,java和 javac都有选项,可以让您更改用于查找自己的类库的路径。然而,绝大多数用户将永远不需要使用这些选项。

使用CLASSPATH环境变量

一般来说,您使用-classpath 命令行选项要像上一节介绍的那样。本节介绍如何设置CLASSPATH环境变量,或者清除以前安装中留下的设置。

设置CLASSPATH

在CLASSPATH环境变量修饰的组命令。格式为:

set CLASSPATH = path1 ; path2…

路径应以指定驱动器的字母开头,例如C:\。这样,如果您碰巧切换到其他驱动器,则仍然会找到class文件。(如果设置的路径是D:\,那么jvm就会去D盘下找这个class,而不是在C盘下)

清除CLASSPATH

如果您的CLASSPATH环境变量设置为不正确的值,或者您的启动文件或脚本设置不正确的路径,可以CLASSPATH 使用以下命令取消设置:

  C:> set CLASSPATH =

此命令仅在当前命令提示符窗口中取消CLASSPATH。您还应删除或修改启动设置,以确保CLASSPATH在将来的会话中拥有正确的设置。

更改启动设置

如果CLASSPATH变量在系统启动时设置,则要查找的位置取决于您的操作系统

对于windows 95和98,检查autoexec.bat的 set命令。

其他(Windows NT,Windows 2000,…) 的系统,CLASSPATH 环境变量可以使用控制面板中的系统实用程序来设定。

了解类路径通配符

类路径条目可包含基名通配符*,这被认为等同于指定在扩展目录下的所有文件的列表.jar或 .JAR。例如,类路径条目 foo/* 指的就是foo目录下的所有JAR文件。一个简单由*组成的类路径指的就是当前目录中所有jar文件的列表。

通配符*的classpath写法对于class文件来说不适用(意思就是通配符*适用的对象是jar而不是class)。要在单个目录中匹配类和JAR文件 foo,请使用foo;foo/*或 foo/*;foo。前者的顺序决定了foo文件目录下的类和资源加载在前,jar加载在后,后者反之亦然。

子目录不是递归搜索。例如, foo/*仅在查找JAR文件foo,而不包括foo/bar,foo/baz等子目录。

扩展类路径中枚举目录中的JAR文件的顺序未指定(The order in which the JAR files in a directory are enumerated in the expanded class path is not specified,这一句没看懂,读者如果有了解的,可以留言回复一下,谢谢!),并且可能因平台而异,甚至在同一台机器上也会随时变化。构建良好的应用程序不应取决于任何特定的顺序。如果需要特定的顺序,则JAR文件可以在类路径中显式枚举。

通配符的扩展这一过程是在调用程序的main方法之前,在类加载过程期间。每个包含通配符的输入类路径将被枚举为这个目录下的所有JAR文件路径。例如,如果目录foo包含 a.jar,b.jar和c.jar,然后将类路径foo/*扩展为 foo/a.jar;foo/b.jar;foo/c.jar,并且该字符串将是系统属性的值 java.class.path。

CLASSPATH环境变量和-classpath(或 -cp)的命令行选项没什么不同的。也就是说,通配符在所有情况下都是一样适用的。但是,类路径通配符在Class-Path jar-manifest头文件中并不符合要求(这一句话也不是很理解,希望读者指教!)。

了解类路径和包名称

Java类被组织成被映射到文件系统中的目录的包。但是,与文件系统不同,无论何时指定包名称,都可以指定整个 包名称,而不是它的一部分。例如,对于包名称 java.awt.Button是总是指定为 java.awt。

例如,假设您希望Java运行时可以找到Cool.class该类在utility.myapp包下。如果该目录的路径是 C:\java\MyClasses\utility\myapp,那么设置的classpath就应该包含C:\java\MyClasses。

要运行该应用程序,可以使用以下JVM命令:

C:> java -classpath C:\ java \ MyClasses utility.myapp.Cool

当应用程序运行时,JVM使用这个classpath设置来查找utility.myapp包中定义的任何其他类(也包括Cool类)。

请注意,命令中指定了整个包名称。如果是设置classpath为C:\java\MyClasses\utility并使用命令 java myapp.Cool,这种做法是不可能成功的。JVM找不到这个类。

(你可能想知道什么定义了一个类的包名称,答案是包名是类的一部分,不能修改,除了重新编译该类)。

注意:包指定机制的一个有趣的后果是,作为同一包的一部分的文件实际上可能存在于不同的目录中。每个类的包名称将相同,但是每个文件的路径可以从类路径中的不同目录开始。

文件夹和归档文件

当类存储在目录(文件夹)中时, 比如存储在c:\java\MyClasses\utility\myapp,那么classpath条目指向包含包名称的第一个元素的目录。也就是package的上一级目录(在这种情况下,classpath就是C:\java\MyClasses,因为包名是utility.myapp。)

但是当类存储在归档文件(.zip或.jar文件)中时,类路径条目是.zip或.jar文件的路径并包含.zip或.jar文件。例如,要使用.jar文件中的类库,命令将如下所示:

C:> java -classpath C:\ java \ MyClasses \ myclasses.jar utility.myapp.Cool

多重指定

要查找C:\java\MyClasses目录下的类以及C:\java\OtherClasses目录下的类,那么请将类路径设置为:

C:> java -classpath C:\ java \ MyClasses; C:\ java \ OtherClasses …

请注意,这两个路径以分号分隔。

指定顺序

多个classpath的顺序很重要。Java解释器将按照它们在classpath变量中出现的顺序来查找目录中的类。在上面的例子中,Java解释器将首先在C:\java\MyClasses目录下查找类。只有在该目录中找不到具有正确名称的类时,解释器才会在C:\java\OtherClasses 目录中查找。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Java中classpath讲解及使用方式

本文链接: https://www.lsjlt.com/news/161391.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中classpath讲解及使用方式
    笔者之前对于classpath都没有什么深入的研究,之前的项目打包jar包都是按照网上的教程自己照着葫芦画瓢。但是因为最近碰到一些关于这方面的知识,因此索性觉得要好好补充一下这方面的...
    99+
    2022-11-12
  • -classpath及路径如何正确的在Java项目中使用
    这期内容当中小编将会给大家带来有关-classpath及路径如何正确的在Java项目中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。javac -classpath的使用:javac:如果当前你要编译...
    99+
    2023-05-31
    java classpath 路径
  • Java之ThreadLocal使用常见和方式案例讲解
    目录1 两大使用场景-ThreadLocal的用途2 典型场景1:每个线程需要一个独享的对象3 典型场景2:当前用户信息需要被线程内所有方法共享4 ThreadLocal方法使用总结...
    99+
    2022-11-12
  • AndroidGlide常见使用方式讲解
    目录效果图依赖普通显示占位符显示圆角显示高斯模糊显示生命周期图床工具推荐效果图 依赖     implementation 'com.github.bu...
    99+
    2023-01-16
    Android Glide原理 Android Glide
  • java中Unsafe的使用讲解
    目录1.获取unsafe2.获取unsafe前段时间因为看JUC的源码,里面有大量关于unsafe的操作,所以就来看看了.写点笔记总结下(本文基于jdk1.8): unsafe可以帮...
    99+
    2022-11-12
  • JavaScript状态模式及适配器模式使用讲解
    目录一、状态模式1.基本实现2.状态模式的优缺点3.状态模式中的性能优化点二、适配器模式一、状态模式 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类 1.基本...
    99+
    2022-12-30
    JavaScript状态模式 JavaScript适配器模式
  • redux工作原理讲解及使用方法
    目录1. redux 是什么?2.redux的原理3. 如何使用 redux?(1).安装redux,创建redux文件夹,建立store.js(2).建立reducers.js(3...
    99+
    2022-11-12
  • Java中Lambda表达式使用及详解
    Java中Lambda表达式使用及详解 前言 一、Lambda表达式的简介 Lambda表达式(闭包):java8的新特性,lambda运行将函数作为一个方法的参数,也就是函数作为参数传递到方法中。使用lambda表达式可以让代码更加...
    99+
    2023-08-16
    java
  • JAVA中的for循环几种使用方法讲解
    目录一般写法1.遍历数组的传统方式2.遍历Collection对象的传统方式第二种写法3.遍历数组的简单方式4.遍历Collection的简单方式防止在循环体里修改循环变量5.禁止重...
    99+
    2022-11-12
  • Git工作流模式及命令的使用讲解
    目录Git的工作方式集中式工作流功能分支工作流Gitflow工作流维护分支工作流程Forking工作流Pull RequestGit的工作方式 分为集中式工作流、功能分支工作流、Gi...
    99+
    2022-11-13
  • SpringCloud中Eureka的配置及使用讲解
    目录创建基本项目、导包配置Eureka服务配置提供者(提供接口)配置消费者(调用接口) 之后我们配置主类Ribbon最后总结Eureka 采用 CS(Client/Serv...
    99+
    2023-01-17
    SpringCloud Eureka使用 SpringCloud Eureka配置 Eureka的配置和使用
  • 深入讲解下Rust模块使用方式
    目录前言模块声明&使用方法一:直接在根文件下声明 add.rs方法二:声明add文件夹,文件夹下包含 mod.rs方法三:add.rs和add文件夹同时存在同模块相邻文件引用...
    99+
    2022-11-13
  • java接口使用默认方法的讲解
    1、接口中默认方法的格式: public default返回值类型方法名(参数列表) { } 2、接口中默认方法的注意事项: 默认的方法不是抽象的方法,所以不重写。但是可以重写...
    99+
    2022-11-12
  • java调用python文件的几种方式【超细讲解!】
      java调用python的契机来自于一个项目需要用到算法,但是算法工程师们写的python,于是就有了java后端调用python脚本的需求,中间遇到了许多问题,特此记录整理了一次。 1、java调用python的方式有哪几种     ...
    99+
    2023-09-04
    java 开发语言 jvm
  • Java中System.currentTimeMillis()计算方式与时间单位转换讲解
    一、时间的单位转换 1秒=1000毫秒(ms) 1毫秒=1/1,000秒(s) 1秒=1,000,000 微秒(μs) 1微秒=1/1,000,000秒(s) 1秒=1,000,00...
    99+
    2022-11-12
  • Java 详细讲解线程的状态及部分常用方法
    可以通过 Thread.getState 方法获得线程的状态(线程一共有 6 种状态) NEW(新建)new:尚未启动 RUNNABLE(可运行状态)runnable:正在 JVM ...
    99+
    2022-11-13
  • Java深入讲解Object类常用方法的使用
    目录1.Object类的常用方法2.equals()方法3.toString方法4.getClass方法5.对象运算符instanceof实例Java代码java继承 1.Objec...
    99+
    2022-11-13
  • c#中task与thread的区别及使用讲解
    目录一.什么是thread二.什么是task三.创建一个task任务有两种模式1.使用factory创建会直接执行2.我们来看看task的生命周期3.下面演示几个控制task的方法4...
    99+
    2022-11-13
  • Java由浅入深全面讲解方法的使用
    目录一、方法的概念及其使用1.1、什么是方法1.2、方法的定义1.3、方法调用的执行过程1.4、实参和形参的关系(重要)二、方法的重载2.1、为什么需要方法重载2.2、方法重载的定义...
    99+
    2022-11-13
  • 实例讲解Android中SQLiteDatabase使用方法
    SQLite数据库是android系统内嵌的数据库,小巧强大,能够满足大多数SQL语句的处理工作,而SQLite数据库仅仅是个文件而已。虽然SQLite的有点很多,但并不是如同...
    99+
    2022-06-06
    方法 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作