`
加菲学Java
  • 浏览: 131125 次
  • 性别: Icon_minigender_1
  • 来自: 扬州
社区版块
存档分类
最新评论

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而言。

  • 大小: 3.5 KB
  • 大小: 19.8 KB
1
4
分享到:
评论
2 楼 wendal 2012-10-22  
扫盲贴,不错!!!
1 楼 white_crucifix 2012-10-22  
直接在终端javac和java,不熟悉的时候,的确会把人整疯

相关推荐

    IKVM.GNU.Classpath

    用于处理PDF,或将PDF转换为jpg图片格式时用到的dll

    Eclipse中文教程.pdf

    Eclipse – 整合开发工具(基础篇) Jacky Lee 2005/03/01 教程特点: 1、图文并茂的详细介绍了eclipse的使用方法 2、虽然是pdf,但是非影音版,所有相当清晰 3、含文档结构目录,可以方便的跳转到对应章节 4、允许...

    eclipse下的.classpath文件和.project文件

    NULL 博文链接:https://wangbing9577.iteye.com/blog/2175197

    Eclipse从入门到精通.rar

    目录 0.环境说明.................7.3 程序代码导览和读取(Code navigation and reading)...................... 274 7.4 Java 视图(Java views) 278 7.5 除错(Debugging)...... 280 7.6 各种(Various)........ 283

    eclipse工程中.classpath文件的含义

    本文详细叙述了.classpath中各种属性的含义

    org.eclipse.jdt.core_3.5.2.v_981_R35x

    解决Eclipse中使用drool时报Caused by: java.lang.RuntimeException: The Eclipse JDT Core jar is not in the classpath的问题。 详细错误: org.drools.RuntimeDroolsException: Unable to load dialect 'org....

    hadoop-eclipse-plugin-1.1.2.jar

    ${hadoop.root}/build/ivy/lib/Hadoop/common/commons-cli-${commons-cli.version}.jar" todir="${build.dir}/lib" verbose="true"/> 改成 ${hadoop.root}/hadoop-core-${version}.jar" tofile="${build.dir}/lib/...

    hadoop1.1.2 eclipse 插件

    ${hadoop.root}/build/ivy/lib/Hadoop/common/commons-cli-${commons-cli.version}.jar" todir="${build.dir}/lib" verbose="true"/> ${hadoop.root}/build/hadoop-core-${version}.jar" tofile="${build.dir}/lib/...

    gradle-android-eclipse:一个Gradle插件,可以生成Eclipse项目文件(.project和.classpath),从而可以将Eclipse IDE用于Android项目

    一个Gradle插件,可以生成Eclipse项目文件(.project和.classpath),从而可以将Eclipse IDE用于Android项目。 该生成器可与新的。 基于。 它能做什么 通过执行以下操作,此插件可以连接到,以使其适用于Android...

    DOS命令使用方法(超全).

    DOS命令使用方法(超全). xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee ...

    .classpath

    .classpath

    Java解析语法树(AST)使用JDT相关库

    包括以下包:jdt-3.2.1-r321_v20060823.jar、 jdt-3.3.0-v20070607-1300.jar、jdt-3.4.2_r894.jar、jdt-compiler.jar、org.eclipse.datatools.enablement.jdt.classpath_1.0.1.v201107221501.jar、org.eclipse.jdt....

    eclipse中文使用手册

    目录 0.环境说明...........................................................3.6.2类别路径变量(Classpath varia........86 3.6.3程序代码格式制作器(Code Form...86 3.6.4程序代码产生(Code generation........88

    Eclipse下PeerSim仿真

    Eclipse下PeerSim仿真(2010-07-24 14:21:16) 转载▼ 标签: 杂谈 Eclipse下PeerSim仿真 时间: 2010.06.25 23:00:00 标签: PeerSim ,Eclipse ...******************** Eclipse下PeerSim仿真 ******************** ...

    hadoop-eclipse-plugin-2.7.0.jar

    1. update the following jar filename(htrace-core-3.1.0-incubating.jar) and add servlet-api-2.5.jar file to classpath. 2.Tested with eclipse-jee-luna-SR2-win32-x86_64.

    testng-test-classpath-property-issue-1:一个简单的项目来演示 testng.test.classpath 属性问题

    此存储库仅用于演示testng.test.classpath属性问题。 问题 以下是中testng.test.classpath的解释。 如果设置了此属性,TestNG 将使用它来查找您的测试类而不是类路径。 如果您在 XML 文件中使用包标记并且类路径中...

    org.eclipse.swt.win32-4.2版本

    翻了n多资料,所什么.so/.dll没有放到正确的路径下啊,又是windows/linux的区别啊,然并卵,前面使用的org.eclipse.swt.win32-3.1版本,换成现在这个4.2版本(我一顿好找),完美跑起,真是蛋疼,另外有些人classpath和java....

    com.sysdeo.eclipse.tomcat_3.2.1

    Eclipse里的tomcat插件 This plugin does not contain Tomcat. (Download and install Tomcat before using it) Download tomcatPluginV??.zip Unzip it in <eclipse_home>/plugins Plugin activation for ...

Global site tag (gtag.js) - Google Analytics