zoukankan      html  css  js  c++  java
  • 理解java调试的工作目录 working directory

    原文链接
    使用idea或者eclipse进行调试的时候会有Working directory配置:

    我们创建工程,IDE会自动创建一个工程目录,假设工程名称为:TestProject,那么在会创建一个目录名为 TestProject,同时我们选择src作为源码文件夹,bin作为输出路径,这样就构成了一个基本的java application工程:

      +TestProject 
        -src 
        -bin 
    

    这个时候我们创建的代码将写入src目录,输出的class文件将存在于bin目录。
    这时候我们在src目录下创建一个类,就叫做TestClass,里面有一个main方法如下:

    public static void main(String[] args){  
        System.out.println(new File("test.txt").exist());  
    } 

    同时在src和bin目录下创建一个空的文件test.txt。什么都不要做,保存工程,打开资源管理器,我们来查看TestProject/bin目录,下面会存在两个文件:TestClass.class和test.txt。

    此时我们设想,程序的内容就是检查test.txt文件是否存在,按照现在的目录规划,我们认为,在控制台上将打出“true”,ok,我们回到eclipse中,运行TestClass这个类。控制台输出了:false!

    为什么我们得到了并非我们预期的结果呢?先别着急,我们打开windows的命令行界面(或者linux的shell都ok),将目录切换到 workspace/TestProject/bin目录下,执行如下命令java TestClass,看看出现什么结果?true!对,就是true。

    如果把test.txt放到TestProject目录下呢,在eclipse中运行TestClass这个类,结果输出是true

    为啥同样的程序会有不同的结果呢?这个答案很简单,就出在了java.exe本身的一个参数-cp(classpath)上!

    eclipse默认的classpath包括三个部分:
    1、jdk的bin目录;
    2、工程引用的所有其他jar包路径
    3、工程根路径(对,不是bin路径)

    那么我们就可以理解来,在classpath的根路径中并不存在这个test.txt文件,用相对路径描述,这个文件实际存在于 src/test.txt和bin/test.txt。那么这个时候就有疑问了,如果我们打包发布工程,是不是jar包中就会有bin这个目录呢?幸运的 是,eclipse考虑好了这个问题。通过eclipse的导出jar能力,bin目录会作为jar的根目录,而不是bin的上层的工程目录,这样类的包 路径就是正确的,同时,工程目录下的资源文件、配置文件等也被拷贝到这里,也就是相当于把工程目录下的这些文件拷贝到来bin目录后再打包,这样文件的相 对路径也就符合默认的classpath了。

    eclipse实际是提供来一种策略来实现源代码文件和配置资源文件的单独管理能力,利用classpath兜了个圈子,这种做法有些晦涩,但是不失为软件工程的一个启发。

     

  • 相关阅读:
    37 什么时候使用内部临时表
    2 Hadoop集群安装部署准备
    36 为什么临时表可以重名
    maven内置属性
    ProGuard 最全混淆规则说明
    stylus的用法
    vscode 插件 配置
    关于overflow:hidden
    vue-devtools/安装vue-devtools
    对Java中使用两个大括号进行初始化的理解
  • 原文地址:https://www.cnblogs.com/daxiong225/p/12979557.html
Copyright © 2011-2022 走看看