Eclipse和DOS下运行程序的差异(主要涉及user.dir和classpath的问题)

遇到过很多人,甚至工作了几年的人,经常搞不清classpath,写了一个小程序, Eclipse能运行的程序,在DOS下就经常运行不了了,一般都是报这样的异常:java.lang.ClassNotFoundException。群里一旦有人问起,一帮人看都不看,一般都由以下几种说法:

1. 设置了环境变量没? 这种几率还真小, 安装了jdk基本上毫无疑问都会设置环境变量.

2. java文件的问题.  这个完全就是在胡扯了

3. 先把java文件编译一下. 这个都在eclipse能运行了. 已经都编译好了,无需再多此一举。

4. classpath路径有问题.  这个还真要稍微注意一下. 如果是jdk5.0及以后的版本, 那么classpath是完全可以不用设置的.

现在大部分人应该都不会再使用jdk1.4或者更老的版本了吧. 所以这个概率也很小.

5. 把环境变量重新设置一下. 这个???

6. 这个问题太多了,百度去吧.  我想这么说的人估计自己也搞不清楚。很多人都习惯了Eclipse,怎么在DOS下编译和运行还真不熟悉.


首先说明一下, 上面的程序是带有包名的, 很好解决, 只要进入到项目的bin目录下, 运行java 报名.类名 即可.

下面的程序稍微有点区别.也涉及到相对路径的问题.  项目结构如下:


IDEAndDosTest.java的代码如下(不要去揪程序的规范):

 

public static void main(String[] args) throws IOException {
	FileInputStream in = new FileInputStream("src/iotest/test.txt"); 
	int data;
	while((data = in.read()) != -1) {
		System.out.print(data + " ");
	}
	in.close();
}

 

  很简单, 就是读取一个文件, 打印字节.

        在Eclipse下运行当然是没有任何问题的.


在DOS下运行,进入到的目录是bin. 这时候运行发现, 报异常了:

 

 

Exception in thread "main" java.io.FileNotFoundException: src\iotest\test.txt (
系统找不到指定的路径。)
 

 

异常也很明显, 文件路径不对, 没错, 路径当然不对了. 既然现在在bin目录下, 那么肯定相对应bin目录了. 


这时需要搞清楚的就是两个系统属性"user.dir"和"java.class.path".

GetClassPathAndUserDir类的代码很简单:

System.out.println(System.getProperty("user.dir"));
System.out.println(System.getProperty("java.class.path"));
 

在Eclipse下运行, 结果是:

user.dir = 磁盘路径\Test
java.class.path = 磁盘路径\Test\bin
 

 

在DOS下运行(目录是bin), 结果是:

user.dir = 磁盘路径\Test\bin
java.class.path = . //  其实就是磁盘路径\Test\bin
 

从以上的结果其实已经可以看出结果了。问题主要集中在"user.dir".


其实解决上面的问题也很简单. 换种方式, DOS下进入项目的目录, 也就是现在在Test目录下. 运行

 

java -cp bin iotest.IDEAndDosTest

 

OK. 没有任何问题.


其实这个时候user.dir已经发生了变化.  其实GetClassPathAndUserDir这个类在不同的目录下运行结果是有些差异的

比如,现在在Test目录下运行,结果是:

 

user.dir = 磁盘路径\Test
java.class.path = bin

 

来个更好玩的, 直接在E盘下 运行,结果是:

 

user.dir = E:\
java.classpath = E:\Java\workspace\framework_workspace\Test\bin

 

可以发现java.classpath是不变的, 而user.dir是不断变化的. 

不过要是在E盘下运行IDEAndDosTest,一样还是会报java.io.FileNotFoundException

        从上面的结果也可以看出了"user.dir", 可以简单的说就是当前用户的目录.


把IDEAndDosTest.java稍作修改:

 

FileInputStream in = new FileInputStream("iotest/test.txt");

 

这个时候在DOS下(bin目录), 运行时没有任何的, 在Eclipse运行会报 java.io.FileNotFoundException

不过只要我们稍作修改就能让其运行正常:


做如下的修改运行也就完全没问题了.


既然这两种方式都这么麻烦, 那有没有什么好的替换方式呢 ?当然有了:

 

InputStream in = IDETest.class.getResourceAsStream("test.txt");	// 当前类的同目录下

 

 或者

 

InputStream in = IDEAndDosTest.class.getClassLoader().getResourceAsStream("iotest/test.txt"); // classpath目录
 

 

现在不管你怎么运行, 都没有问题了(当然了你要指定好classpath)

其实也可以看出了如果要用绝对路径, 千万别涉及到"user.dir"的问题, 最好相对于你的classpath而言。

Langchain分割方式 【代码】Langchain分割方式。 阅读详情

相关推荐

计算机补码两位乘法移位补0还是1,补码两位乘.doc

补码两位乘沈阳航空航天大学课 程 设 计 报 告课程设计名称:计算机组成原理课程设计课程设计题目:COP2000实现补码两位乘法院(系):计算机学院专 业:计算机科学与技术(嵌入式系统方向)班 级学 号:2009040101181姓 名:张驰指导教师:杨华完成日期:2012年1月14日目 录第1章 总体设计方案11.1设计原理11.2设计思路11.3设计环境2第2章...

weixin_34471838的博客 968

原来user.dir竟然会影响classpath的值

我百思不得其解,只能翻JDK的源码看看AppClassLoader怎么加载它的URL。起因:使用脚本启动,脚本设置了classpath的路径为当前路径。但是从tomcat日志打印来看,扫描的不仅仅是当前路径,而是主目录下所有的文件夹都被扫描。classpath的值就变成了user.dir的值。从上方的代码可以看到pathToURLs(path)是把"."转化为路径的关键代码。那么接下看看这个方法干了啥吧。这就解释了为什么classpath设置了“.”而APPClassLoader的url却变成了主目录。

hgswsdn的博客 522

BurpSuite+安卓模拟器双保险:避开真机抓包限制的完整配置指南

本文详细介绍了如何通过BurpSuite与安卓模拟器(如雷电、夜神)协同工作,绕过真机抓包限制的完整配置指南。从环境准备、网络拓扑配置到证书部署和流量分析,提供了一套高效的解决方案,帮助安全测试人员稳定捕获手机数据包,提升测试效率。

Apple的专栏 439

JAVA入门总结回顾

然后经过编译生成.class文件(jvm只能识别.class文件并执行),转换为计算机能够执行的机器语言。最后是执行,生成对应的结果。3.JDK,JRE之间的关系:JDK是JAVA的开发工具包,JRE是JAVA的的运行环境。JRE中包含JVM,即JAVA的虚拟机运行环境。2.检查jdk是否安装成功:在cmd中输入java -version或者java或者javac。6. idea中删除module要先进行remove在进行删除(在文件夹中删除)才能彻底删除。4..java和.class文件的关系和区别。

程小白的博客 657

从零到一:手把手教你构建自定义ReaxFF力场参数

本文手把手教你从零构建自定义ReaxFF力场参数,详解反应力场的动态键序机制与参数化逻辑。通过LAMMPS实战演示,涵盖训练数据准备、参数优化算法选择及性能优化技巧,助力研究人员精准模拟化学反应过程。适用于材料科学、催化研究等领域,特别适合已掌握分子动力学基础的进阶用户提升力场开发能力。

weixin_28365523的博客 1060

【目标跟踪】多目标跟踪的评价工具motmetrics怎么使用?

多目标跟踪,通过motmetrics测试评价对应的视频。

聿默的博客 5369

classpath file user.dir

classpath: web: classpath是指 WEB-INF文件夹下的classes目录 classes含义: 1.存放各种资源配置文件 eg.init.properties log4j.properties struts.xml 2.存放模板文件         eg.actionerror.ftl 3.存放class文件       对应的是项目开发时的src目录编译文件

liangyue1994的专栏 801

PC 端微信页面拆分及 JavaFx 使用

一、前言 对于一个知识点的学习过程来说,往往使用自己熟悉的工具或方式才更易于上手。因为所有同类型的知识点在抛出复杂的流程拨云见日后,所能得到的几乎都是同样的设计思想和实现理论。 在 Java 语言桌面版开发中,直至目前共提供了三套 UI 开发方式;Awt、Swing、JavaFx,以及一些扩展组件 SWT 等。在这三套 UI 组件中,JavaFx 是最新也是最为好用的,因为他提供了丰富的功能,以及...

bugstack虫洞栈 3615

java加载资源路径以及ClassPath的关系

http://www.blogjava.net/flysky19/articles/93492.html

googlevsbing的专栏 1272

SAP成本核算的核心逻辑

SAP成本核算采用"计划-归集-分析"闭环管理,以CO模块为核心,集成PP、MM等模块。核算前需配置标准成本控制范围、成本中心等主数据。标准成本通过BOM和工艺路线计算(CK11N),采购和生产过程记录实际成本差异。制造费用通过成本中心归集,作业成本按实际耗用量分配。完工产品按标准成本入库,月末通过KO88结算工单差异,物料分类账(CKMLCP)还原实际成本。整个流程实现FI与CO数据同步,确保账务一致。关键事务码包括CK11N(成本估算)、MIGO(物料移动)、CO11N(报工)等。

金牌架构师 542

SAP-ABAP:SAP HANA性能神器FDA:是极速查询的引擎,也是CPU过载的元凶

在SAP S/4HANA的世界里,有一个被ABAP开发者们既爱又怕的特性——Fast Data Access(FDA),它能将性能提升百倍,也能让CPU瞬间飙升。本文将带您全面解剖这一核心机制。

baidu_35680696的博客 849

工作中使用到的单词(软件开发)

1.エイリアス   alias 别名 powershell使用 get-help 命令时,会得到与此命令 相关(别名)的命令 2.プロキシ proxy 代 理 3.プロモート   promote 促进,提升   开发的系统新功能上线发布,有时会使用到这个词,比如 STプロモート 还有使用リリース这个词的。比如STリリース。个人认为两者含义相同。 4.見逃し み................................................................

sun0322 6万+

SAP 生产订单工序删除状态撤回简介

2、我们在前台对于生产订单的状态一个是在生产订单抬头中的状态,另外一个是针对上面一直在测试的是工序的状态,这个两个状态是前台可见的状态,实际生产订单还有一个组件物料的状态,这个状态是不可见的一个状态。生产订单中的0010工序中对应的组件的栏位被标识,表示有物料分配到了0010的工序中,正常情况下0010的工序被分配了工序是不应该被删除的。将已领料的工序删除掉,导致异常的发生。当物料已领料会,用户仍然把已分配的物料的工序删除掉,导致后续业务操作过程中产生异常,如下图中所示,0010的工序被打上了删除标识。

我小时候很黑的博客 1946

java生成文件的默认保存路径与System.getProperty(“user.dir“)

前言 new File("test.file").createNewFile(); 保存到哪里去了?开发中,会经常遇到这个问题。生成的文件,默认保存到user.dir路径下了。 解释 user.dir是jvm系统属性,通过System.property可以获取系统属性值 user.dir与user.home user.dir:用户的当前工作目录,在linux下与pwd相同

wangjun5159的专栏 3万+

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java生成文件的默认保存路径与System.getProperty("user.dir")

前言 new File("test.file").createNewFile(); 保存到哪里去了?开发中,会经常遇到这个问题。生成的文件,默认保存到user.dir路径下了。 解释 user.dir是jvm的系统属性,我们知道System.property可以获取jvm系统属性值,所以System.property("user.dir")路径就是文件的默认保存路径。

我主要负责转载优秀的技术博文 7615

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

java 类路径classpath配置总结;java自定义配置文件读取

背景 java应用,不管是web还是jar程序,读取配置文件始终是绕不过去的。 一开始没那么多弯弯绕绕,反正什么配置文件,完全打包就完事,读取也是相对路径,IDE能跑,部署到服务器也不会有问题。 然后,如果要提升部署的质量,满足运维的要求,那就没那么简单了。比如我们可能面临: 1、部署到Tomcat?springboot的jar进程部署? 2、配置文件需要从jar里面拉出来,方便部署时修改配置 主题 本文的主题就是配置文件的读取 首先直接上例子(几种常用读取路径的区别) public

亲测,只为展现最完美的有效! 6307

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

DOS与IDEA

DOS命令 简单命令 cls(clear screen):清屏 dir(directory)显示目录 cd:进入目录 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜

weixin_47251999的博客 379

java打印classpath路径

System.out.println(System.getProperty("java.class.path"));//系统的classpaht路径 System.out.println(System.getProperty("user.dir"));//用户的当前路径

subuser的专栏 2万+

简述path与classpath的区别及其意义

本机是win10 打开环境配置看看 存在CLASSPATH和Path两个东西 path是什么东西 比如 我们打开cmd 输入一个命令java 然后系统就会去找这个名字叫 java 可执行文件 那么,java这个文件在哪里? 系统就会在path里面去,看看那些路径有没有这个java执行文件 下图是path里面的配置路径 上图等价于下图 (这里JAVA_HO...

weixin_40171603的博客 2万+

java中默认的保存路径是_java生成文件的默认保存路径与System.getProperty(user.dir)

前言new File("test.file").createNewFile(); 保存到哪里去了?开发中,会经常遇到这个问题。生成的文件,默认保存到user.dir路径下了。解释user.dir是jvm的系统属性,我们知道System.property可以获取jvm系统属性值,所以System.property("user.dir")路径就是文件的默认保存路径。user.dir与user.home...

weixin_33603405的博客 2673

Java或web中解决所有路径问题

Java中使用的路径,分为两种:绝对路径和相对路径。归根结底,Java本质上只能使用绝对路径来寻找资源。所有的相对路径寻找资源的方法,都不过是一些便利方法。不过是API在底层帮助我们构建了绝对路径,从而找到资源的! <br />  在开发Web方面的应用时, 经常需要获取 服务器中当前WebRoot的物理路径<br />  如果是Servlet , Action , Controller, 或则Filter , Listener , 拦截器等相关类时, 我们只需要获得ServletContext, 然后通

孙彦辉的专栏 834

Java资源路径各种情况总结(classpath)

Java获取资源(getResource的方式)的搜寻顺序是:首先是Bootstrap加载的jar包,然后是扩展加载的jar包,最后是我们自己配置的classpath。这个具体步骤就不详细说明了,如有需要请参考查找Classes的官方文档。在实际项目中前两个步骤一般我们不太关心。更多的是需要配置和查找资源文件,如果了解一些关于classpath的知识,就能更准确的找到资源文件。   这...

xiaosunzhu的专栏 624

关于JAVA项目中CLASSPATH路径详解

在dos下编译java程序,就要用到classpath这个概念,尤其是在没有设置环境变量的时候。classpath就是存放.class等编译后文件的路径。 javac:如果当前你要编译的java文件中引用了其它的类(比如说:继承),但该引用类的.class文件不在当前目录下,这种情况下就需要在javac命令后面加上-classpath参数,通过使用以下三种类型的方法 来指导编译器在编译的时候去指

cheney521的专栏 11万+
上一篇: MySQL for Java的SQL注入测试
下一篇: URLClassLoader中指定目录和jar的问题
yklovejava
博客等级 码龄14年 0粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值