原文链接
使用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兜了个圈子,这种做法有些晦涩,但是不失为软件工程的一个启发。

 

理解java调试的工作目录 working directory的更多相关文章

  1. 《深入理解JAVA虚拟机》笔记1

    java程序运行时的内存空间,按照虚拟机规范有下面几项: )程序计数器 指示下条命令执行地址.当然是线程私有,不然线程怎么能并行的起来. 不重要,占内存很小,忽略不计. )方法区 这个名字很让我迷惑. ...

  2. 深入理解Java虚拟机(第2版) 笔记目录

    本篇为读深入理解Java虚拟机(第2版)一书的笔记目录. Java 运行期数据区 Java 垃圾回收算法 Java 内存分配策略 Java 类文件结构 Java 加载.链接.初始化 Java 类加载器

  3. java如何获取项目的工作目录

    package maptoxml; public class Tfff { public static void main(String[] args) { System.out.println(&q ...

  4. 深入理解Java虚拟机博客参考目录

    参考博客:注明请注明出处 深入理解Java虚拟机读书笔记之:第5章 Java虚拟机(Java虚拟机内部结构图,很重要) 深入理解Java虚拟机读书笔记之:第6章 Java class文件: <深 ...

  5. Java 实例 - 查看当前工作目录

    package guyu.day0820; /** * @Author: Fred * @Date: 2020/8/20 14:25 */ public class Demo03 { public s ...

  6. [转]深入理解Java 8 Lambda(类库篇——Streams API,Collectors和并行)

    以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...

  7. 深入理解Java虚拟机--下

    深入理解Java虚拟机--下 参考:https://www.zybuluo.com/jewes/note/57352 第10章 早期(编译期)优化 10.1 概述 Java语言的"编译期&q ...

  8. 深入理解Java类加载器(1):Java类加载原理解析

    1 基本信息 每个开发人员对Java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载.Java的类加载机制是技术体系中比较核心的 ...

  9. 深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)

    目录 1.类文件结构 1.1 Class类文件结构 1.2 魔数与Class文件的版本 1.3 常量池 1.4 访问标志 1.5 类索引.父索引与接口索引集合 1.6 字段表集合 1.7 方法集合 1 ...

随机推荐

  1. 详解递归(基础篇)———函数栈、阶乘、Fibonacci数列

    一.递归的基本概念 递归函数:在定义的时候,自己调用了自己的函数. 注意:递归函数定义的时候一定要明确结束这个函数的条件! 二.函数栈 栈:一种数据结构,它仅允许栈顶进,栈顶出,先进后出,后进先出.我 ...

  2. Spark—local模式环境搭建

    Spark--local模式环境搭建 一.Spark运行模式介绍 1.本地模式(loca模式):spark单机运行,一般用户测试和开发使用 2.Standalone模式:构建一个主从结构(Master ...

  3. Kubernetes全栈架构师(基本概念)--学习笔记

    目录 为什么要用Kubernetes? K8s控制节点-Master概念 K8s计算节点-Node概念 什么是Pod? 为什么要引入Pod? 创建一个Pod 零宕机发布应用必备知识:Pod三种探针 零 ...

  4. 二本,拿腾讯,阿里 offer 了

    我的春招 Hello,首先自我介绍一下,我是一所普普通通的二本院校的大三学生,坐标江苏. 今年三月份拿到了腾讯实习的offer,人生中第一次面试是腾讯,部门是 TEG 的云架构,并且顺利签约,说实话内 ...

  5. POJ3667 Hotel 题解

    和最大子段和的思路是一样的,可以记 \(lmax,rmax,dat\) 分别表示从当前区间最靠左/右的最大连续空子段和当前区间的最大连续空子段. 需要用延迟标记,每次遇到开房操作先ask,如果能找到就 ...

  6. python解析excel

    import xlrd, base64excel_obj = xlrd.open_workbook(file_contents=base64.decodestring(filename)).#打开要解 ...

  7. Deepin 20.2.2 /UOS 20.2 添加ppa源

    由于 工作需要,需要通过PPA安装一些优质的软件包,但是 Deepin 默认不支持PPA源 解决方法 由于Deepin/Uos系统默认是没有安装PPA的那么我们得先安装PPA来支持"add- ...

  8. Ubuntu Server连接Wi-Fi

    本文将介绍Ubuntu Server如何通过命令行使用wpa_supplicant连接Wi-Fi 环境 Ubuntu Server 20.04(64位) wpasupplicant 配置 1. 安装 ...

  9. GoogleTest死亡测试的跨平台BUG

    最近工作用到了GoogleTest来作单元测试,但是死亡测试的ASSERT_DEATH语句一直跑不通. GoogleTest会启动子进程来运行代码,并捕捉子进程的错误消息,这就是所谓的"死亡 ...

  10. React Hooks的理解

    一.是什么 Hook 是 React 16.8 的新增特性.它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性 至于为什么引入hook,官方给出的动机是解决长时间使 ...