原文链接
使用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. AgileTC linux部署

    简介 AgileTC是一套敏捷的测试用例管理平台,支持测试用例管理.执行计划管理.进度计算.多人实时协同等能力,方便测试人员对用例进行管理和沉淀.产品以脑图方式编辑可快速上手,用例关联需求形成流程闭环 ...

  2. Linux 安装exclipse

    1,在官网下载:https://www.eclipse.org/downloads/packages/ 2,前提:安装好jdk 3,使用命令解压:tar -zxvf eclipse_xxxxxx.ta ...

  3. [源码解析] 深度学习分布式训练框架 horovod (19) --- kubeflow MPI-operator

    [源码解析] 深度学习分布式训练框架 horovod (19) --- kubeflow MPI-operator 目录 [源码解析] 深度学习分布式训练框架 horovod (19) --- kub ...

  4. Oracle19c 如何用rman duplicate 克隆一个数据库。(Active方式)

    Oracle19c 如何用rman duplicate 克隆一个数据库. 首先克隆有两种方法,一种是Backup-Based,一种是Active方式.官网文档链接https://docs.oracle ...

  5. 【贪心】数列分段Section I luogu-1181

    题目描述 对于给定的一个长度为\(N\)的正整数数列\(A_i\),现要将其分成连续的若干段,并且每段和不超过\(M\)(可以等于\(M\)),问最少能将其分成多少段使得满足要求. 分析 简单思考一下 ...

  6. 鸿蒙轻内核定时器Swtmr:不受硬件和数量限制,满足用户需求

    摘要:本文通过分析鸿蒙轻内核定时器模块的源码,掌握定时器使用上的差异. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十四 软件定时器Swtmr>,作者:zhushy . 软件定时器(S ...

  7. VM安装kali操作系统

    工具:VMware Workstation 15 Pro(15.5.6 build-16341506),kali-linux-2020.2-installer-amd64.iso vm15下载链接:h ...

  8. golang可执行文件瘦身(缩小文件大小)

    起因 golang部署起来极其遍历,但有时候希望对可执行文件进行瘦身(缩小文件大小) 尝试 情况允许情况下,交叉编译为32位 删除不必要的符号表.调试信息 尝试用对应平台的upx打压缩壳 解决 经过多 ...

  9. 卷积的等变性(equivariant) / 不变性(invariant)

    不变性:输入x发生变换,但是F之后的输出不变 \(F(x)=F [\)transform\((x)]\) 池化:近似不变性,当图像发生微小变化,最大池化的输出不变,还是一个池化范围内的max 等变性: ...

  10. 题解CF757B

    题目 题意:在 \(s\) 数组中找出尽可能多的数使得他们的最大公约数 \(>1\) 既然最大公约数 \(>1\),\(s\) 数组的值域是 \(1 \le s_i \le 10^5\), ...