Java程序在运行的时候具体是如何确定.class文件位置的呢?

转载 2016年11月24日 14:40:59

【摘自:Java编程思想】

来看看Java解释器的运行过程吧:首先,找出环境变量CLASSPATH(可以通过操作系统来设置)。CLASSPATH包含一个或多个目录,用作查找.class文件的根目录。从根目录开始,解释器获取包名称并将每个句点替换成反斜杠,以从CLASSPATH根中产生一个路径(例如,package fruit.Apple就变成为fruit/Apple或fruit/Apple或其他,这将取决于操作系统)。得到的路径会与CLASSPATH中的各个不同的根目录路径相连接以获得一个完整的目录路径,解释器就在这些目录中查找与你所需要的类名称相同的.class文件。(此外,解释器还会去查找某些涉及Java解释器所在位置的标准目录。)

为了理解这一点,以域名Food.net为例。把它的顺序倒过来,并且全部转换为小写,net.food就成了我们创建类的一个独一无二的名称空间。如果我们决定再创建一个名为fruit的类库,我们可以将该名称进一步细分,于是得到一个包名如下:

package net.food.fruit;

现在,这个包名称就可以用作下面Apple这个文件的名称空间保护伞了:

package net.food.fruit;
    
    public class Apple
    {
    	public Apple()
		{
		System.out.println("net.food.fruit.Apple");
		}
    }

这个文件可能被置于计算机系统中的如下目录中:

C:/DOC/JavaT/net/food/fruit

之所以要放在这个目录下面是因为前面提到的,便于系统通过CLASSPATH环境变量来找到这个文件。沿着此路径往回看就能看到包名net.food.fruit,但是路径的前半部分怎么办呢?交给环境变量CLASSPATH吧,我们可以在计算机中将环境变量CLASSPATH设置如下:

CHASSPATH=.;D:/JAVA/LIB;C:/DOC/JavaT

CLASSPATH可以包含多个可供选择的查询路径。每个路径都用分号隔开,可以看到,上面这个CLASSPATH环境值的第三个路径就是我们前面文件的根目录。如前所述,Java解释器将首先找到这个根目录C:/DOC/JavaT,然后将其与包名net.food.fruit相连接,连接的时候将包名中的句点转换成斜杠,就得到完整的class文件路径C:/DOC/JavaT/net/food/fruit。

需要补充说明的一点,这里CLASSPATH环境变量关照的是package中的class文件,如果关照的是JAR包中的class文件,则会有一点变化,即,必须在CLASSPATH环境变量路径中将JAR文件的实际名称写清楚,而不仅仅是指明JAR包所在位置目录。可以想象,因为JAR包所在目录位置上可能存在很多别的JAR包,而我们需要使用的那个class文件只会存在于其中一个JAR包里面,因此可以这样理解,这里JAR包实际上也充当了一级文件目录的角色,因此要在CLASSPATH环境变量中写清楚JAR包文件名。例如如果Apple文件存在于名为fruit.jar的JAR文件中,则CLASSPATH应写作:

CLASSPATH=.;D:/JAVA/LIB;C:/DOC/JavaT/net/food/fruit.jar

一旦路径得以正确建立,下面的文件就可以放于任何目录之下:

import net.food.fruit.*;

public class LibTest
{
	public static void main(String[] args)
	{
		Apple a=new Apple();
	}
}
当编译器碰到fruit库的import语句时,就开始在CLASSPATH所指定的目录中查找,查找过程中分别将CLASSPATH中设定的各项根目录与包名转换来的子目录net/food/fruit相连接,在连接后的完整目录中查找已编译的文件(即class文件)找出名称相符者(对Apple而言就是Apple.class)。找到了这个文件即匹配到了Apple类。

Apache基金会如何运行开源项目

-
  • 1970年01月01日 08:00

eclipse编译的class文件在哪里

在eclipse中查找编译后的class
  • qq_30072293
  • qq_30072293
  • 2017-11-08 11:38:14
  • 4116

获取Java程序运行的路径 | 获取当前jar包的路径

经过试验,不管是否是 Jar 包,不管是否是 Tomcat 部署,以下三个方法均可实现。   package test;   public class MyPath {     public...
  • baidu_18607183
  • baidu_18607183
  • 2016-07-12 16:35:03
  • 4173

【Java 路径】运行可执行jar包获取相关路径

一、获取可执行jar包所在目录(1)方法一:使用System.getProperty("java.class.path")获取classpath的路径,若没有其他依赖,在cmd下运行该可执行jar包,...
  • u013177446
  • u013177446
  • 2017-01-07 11:55:40
  • 5755

Java学习之java命令如何查找Classes

使用Java很多年了,虽然对如何搜索classes有一定的认识,但精通却不敢妄说。尤其是最近在使用getResourceAsStream加载属性文件时,遇到了不大不小的几个问题,当然遇到的问题与不熟悉...
  • sky_walker85
  • sky_walker85
  • 2014-08-12 17:20:44
  • 2236

如何找到Web项目编译好的class文件

原网页 http://blog.java1234.com/blog/articles/60.html 在某些情况,我们需要获取部分Eclipse里的项目编译好的class文件。 这里我举个...
  • qq_21511001
  • qq_21511001
  • 2017-04-05 14:25:37
  • 2566

Eclipse中的Java工程中没有class文件以及看不到class文件的处理办法

这篇博客总结一下关于Eclipse的java项目中没有class文件以及有class文件却看不见的解决方法,这些方法自然有它的局限性,希望读者能根据自己的实际情况来做出选择。看不到class文件 这...
  • Mlong54
  • Mlong54
  • 2017-09-19 15:28:45
  • 1690

Java 获取当前文件.class 的相对或绝对路径

package com.xudaolong.Utils; import java.io.File;/** * Created by xudaolong on 16/7/12. */ public ...
  • u012404490
  • u012404490
  • 2016-09-13 17:16:51
  • 1035

关于eclipse编译过后的class文件路径

最近项目遇到一个问题,就是如果测试服务器不在内网我们无法用svn来更新项目,只好用最笨的方法把每次更新后的代码复制粘贴到服务器端。 别的文件直接复制到workspace没问题,但是java文件要经...
  • qiao94831
  • qiao94831
  • 2017-02-08 09:44:48
  • 3564

java 获取当前路径

java获取当前项目路径: object.class.getResource()方法获得当前生成的class的绝对路径(此方法在jar包中无效,因为他获得的是生成的class的路径,返回的内...
  • hpf911
  • hpf911
  • 2010-08-31 11:13:00
  • 43103
收藏助手
不良信息举报
您举报文章:Java程序在运行的时候具体是如何确定.class文件位置的呢?
举报原因:
原因补充:

(最多只允许输入30个字)