对新手来讲,一个Java工程内部的多个文件夹经常会让大家困惑。更可恶的是莫名其妙的路径问题,在Eclipse编写Java程序中,出现频率最高的错误很可能就是路径问题。

这些问题原因其实都是一个,就是关于Java工程内的文件结构理解不清,虽然我也不是老手,但有一些经验,拿来和大家分享:

eclipse的基本工程目录叫做workspace,每个运行时的eclipse实例只能对应一个workspace,也就是说,workspace是当前工作的根目录。我们在workspace中可以随意创建各种java相关的工程,普通的java应用,java web应用,web service应用等,我们仅拿普通的java application来说明。

通常我们创建一个java
application工程,会创建一个工程目录,假设工程名称为:TestProject,那么在当前的workspace里讲创建一个目录名为TestProject,同时我们选择src作为源码文件夹,bin作为输出路径,这样就构成了一个基本的java
application工程。,在workspace中存在如下文件夹:

+workspace
  +TestProject
    -src
    -bin

这个时候我们创建的代码将写入src目录,输出的class文件将存在于bin目录。

(对于新手来说,区分src目录和bin目录很重要,通常情况下,src目录只存放源代码,而所有工程相关的其他输出文件都会存放在bin目录下,最为重
要的是:用Eclipse进行打包时根目录就是bin,用jar包调用工程的时候默认的路径也要以bin为准,到bin的层级数目就是最终的数目,因此可
以说bin是最为重要的目录,而不是src)

这时候我们在src目录下创建一个类,就叫做TestClass,里面有一个main方法如下:

Java代码
  1. public static void main(String[] args){
  2. System.out.println(new File("test.txt").exist());
  3. }

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

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

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

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

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

那么我们就可以理解来,在classpath的根路径中并不存在这个test.txt文件,用相对路径描述,这个文件实际存在于src/test.txt
和bin/test.txt。也就是说,classpath默认的路径是workspace-testproject下,而不是workspace-
testproject-bin下,所以才找不到这个文件。这是经常出现的问题!

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

从上面可以总结出来:Eclipse直接运行时,是以工程的根目录作为基准目录。而打包成jar运行时,则是以bin目录作为基准目录。这两者相差了一级目录,如果理解的不好,可能会导致错误。希望大家注意!

最新文章

  1. C# 调用Excel 出现服务器出现意外情况. (异常来自 HRESULT:0x80010105 (RPC_E_SERVERFAULT)
  2. spider_getModelInformation
  3. RecyclerView局部刷新那点事
  4. iOS iPad开发之UIPopoverController的使用
  5. [转]PROC简单使用用例--VC连接ORACLE
  6. Ubuntu的默认root密码
  7. Java学习日记-6 继承
  8. 解决Qt5 Creator无法切换输入法(fcitx),不能录入汉字问题
  9. Golden Pyramid
  10. vmware9安装centos和Mac经验总结
  11. CreateWindow的出错解决
  12. 关于NSString和NSMutableString的相关用法和基本介绍
  13. Yii2设计模式——简单工厂模式
  14. Pandorabox(Openwrt) 双宽带(WAN) 叠加网络实战
  15. WIN7搭建ASP站点
  16. 1013 C. Photo of The Sky
  17. [转] Java接口_interface_implements
  18. Netty入门教程——认识Netty
  19. docker之安装和管理mongodb
  20. Chrome 鼠标左键-新标签打开

热门文章

  1. vue components & `@import css` bug
  2. 湘潭邀请赛 2018 E From Tree to Graph
  3. OAuth2.0 用户验证授权标准 理解
  4. 公路建设 (highway.c/cpp/pas)
  5. Linux/unix inode
  6. SublimeText3自动补全python提示
  7. ARM嵌入式开发中的GCC内联汇编__asm__
  8. C++虚函数表解析(基础篇)
  9. 【原创】Linux环境下的图形系统和AMD R600显卡编程(7)——AMD显卡的软件中断
  10. js生成一周内的日期+周几