`
加菲学Java
  • 浏览: 132564 次
  • 性别: 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,不熟悉的时候,的确会把人整疯

相关推荐

    在eclipse中使用ant灵活构建web应用.docx

    通过本文,我们将详细介绍如何在Eclipse IDE环境下利用Ant来构建Web应用程序,并探索这一过程中的关键步骤与技巧。 #### 二、Ant简介 Ant是一个基于Java的构建工具,它的主要特点包括但不限于: 1. **平台无关性**...

    Java路径问题最终解决方案.doc

    Java路径问题一直是开发者在处理文件操作时经常遇到的挑战,主要涉及到如何正确地定位和访问文件资源。在Java中,路径分为绝对路径和相对路径,这两种路径又有不同的表现形式。 一、URI形式的绝对资源路径 例如:...

    EditPlus配置运行java.txt配置运行java.txt

    - 在使用EditPlus配置运行Java程序时,建议使用标准的Java类库路径,避免出现不必要的类加载问题。 - 如果遇到编译或运行错误,可以检查编译参数和类路径设置是否正确。 #### 六、总结 通过上述步骤,我们已经成功...

    使用ANT远程发布Web项目

    1. **拷贝Catalina-ant.jar到Eclipse自带的Ant lib下**:假设Eclipse安装在`D:\eclipse`目录下,则将`catalina-ant.jar`复制到`D:\eclipse\plugins\org.apache.ant_1.7.1.v20100518-1145\lib`目录下。 2. **将...

    Java路径问题最终解决方案之一.

    ### Java路径问题最终解决方案之一 #### 一、引言与背景 在进行Java开发时,文件...综上所述,通过理解和应用上述推荐的最佳实践及获取路径的方法,可以有效地解决Java路径问题,确保程序在不同环境下的稳定运行。

    Java路径问题最终解决方案之一.txt

    本文将深入探讨Java中的路径问题,并提供一个有效的解决方案,该方案旨在简化路径处理过程,使得开发者能够更加灵活地管理和访问不同环境下的资源。 #### 二、Java路径类型 Java中使用的路径主要分为两大类:绝对...

    java文件路径操作详细[归类].pdf

    4. **相对于当前用户目录的相对路径**:基于`System.getProperty("user.dir")`返回的路径,这在不同环境(如J2SE、J2EE服务器)下可能不同,应避免使用。 在实际应用中,推荐使用**相对于classpath的相对路径**,...

    java项目相对路径与绝对路径问题分析

    1. 相对于classpath的相对路径:如在`file:/D:/java/eclipse32/workspace/jbpmtest3/bin/`这个classpath路径下的相对路径,这意味着你需要结合classpath的基路径来解析资源的实际位置。 2. 相对于当前用户目录的相对...

    关于java和web工程项目中各种路径的获取总结借鉴.pdf

    这里`System.getProperty("user.dir")`返回的是当前Java进程的工作目录,这个工作目录通常是项目编译后存放的位置。对于Web项目而言,这个路径可能会根据不同的Web服务器有所不同。例如,在Tomcat中,它可能是相对于...

    总结一下java获取路径几种途径

    - **相对于当前用户目录的相对路径**:基于`System.getProperty("user.dir")`返回的路径,但不推荐使用,因为它缺乏统一规范且在不同环境下可能有所不同。 ### 3. 最佳实践:使用相对于classpath的相对路径 为了...

    java项目中的各种路径详解[参考].pdf

    4. 相对于当前用户目录的相对路径,由`System.getProperty("user.dir")`获取,但不建议在项目中直接使用,因为其可能因环境不同而变化。 处理路径问题时,推荐使用绝对路径,尤其是在服务器环境中,以确保代码的可...

    好用的代码生成源码

    在eclipse中运行 配置classpath,将generator/lib中的rapid-generator.jar及其它数据库驱动加入classpath 修改generator.xml的数据库连接属性及其它属性 以application的方式运行GeneratorMain类,要生成不同的table,...

    myeclipse中配置weblogic开发环境[参考].pdf

    这不仅能够提升Java EE项目的开发效率,还能够更好地管理和监控应用程序的运行状态。开发者可以根据具体需求调整上述配置参数,以达到最佳的性能表现。此外,在实际操作过程中可能会遇到各种问题,例如兼容性问题、...

    毕向东java笔记(一)1

    Java程序可以在不同的操作系统上运行,主要依赖于Java虚拟机(JVM)。JVM负责解释执行Java字节码,而不同的操作系统会有对应版本的JVM,这样就实现了Java的“一次编写,到处运行”的特性。 ### 四、Java开发工具包...

    Java Resource路径整理总结

    正确地使用 Resource 路径可以确保程序的正确运行和移植性,而错误的使用则可能导致程序崩溃或不可移植。 Java 中的相对路径 在 Java 中,并不存在标准的相对路径,各种相对路径的取资源方式都是基于某种规则转化...

Global site tag (gtag.js) - Google Analytics