遇到过很多人,甚至工作了几年的人,经常搞不清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
分享到:
相关推荐
通过本文,我们将详细介绍如何在Eclipse IDE环境下利用Ant来构建Web应用程序,并探索这一过程中的关键步骤与技巧。 #### 二、Ant简介 Ant是一个基于Java的构建工具,它的主要特点包括但不限于: 1. **平台无关性**...
Java路径问题一直是开发者在处理文件操作时经常遇到的挑战,主要涉及到如何正确地定位和访问文件资源。在Java中,路径分为绝对路径和相对路径,这两种路径又有不同的表现形式。 一、URI形式的绝对资源路径 例如:...
- 在使用EditPlus配置运行Java程序时,建议使用标准的Java类库路径,避免出现不必要的类加载问题。 - 如果遇到编译或运行错误,可以检查编译参数和类路径设置是否正确。 #### 六、总结 通过上述步骤,我们已经成功...
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路径类型 Java中使用的路径主要分为两大类:绝对...
4. **相对于当前用户目录的相对路径**:基于`System.getProperty("user.dir")`返回的路径,这在不同环境(如J2SE、J2EE服务器)下可能不同,应避免使用。 在实际应用中,推荐使用**相对于classpath的相对路径**,...
1. 相对于classpath的相对路径:如在`file:/D:/java/eclipse32/workspace/jbpmtest3/bin/`这个classpath路径下的相对路径,这意味着你需要结合classpath的基路径来解析资源的实际位置。 2. 相对于当前用户目录的相对...
这里`System.getProperty("user.dir")`返回的是当前Java进程的工作目录,这个工作目录通常是项目编译后存放的位置。对于Web项目而言,这个路径可能会根据不同的Web服务器有所不同。例如,在Tomcat中,它可能是相对于...
- **相对于当前用户目录的相对路径**:基于`System.getProperty("user.dir")`返回的路径,但不推荐使用,因为它缺乏统一规范且在不同环境下可能有所不同。 ### 3. 最佳实践:使用相对于classpath的相对路径 为了...
4. 相对于当前用户目录的相对路径,由`System.getProperty("user.dir")`获取,但不建议在项目中直接使用,因为其可能因环境不同而变化。 处理路径问题时,推荐使用绝对路径,尤其是在服务器环境中,以确保代码的可...
在eclipse中运行 配置classpath,将generator/lib中的rapid-generator.jar及其它数据库驱动加入classpath 修改generator.xml的数据库连接属性及其它属性 以application的方式运行GeneratorMain类,要生成不同的table,...
这不仅能够提升Java EE项目的开发效率,还能够更好地管理和监控应用程序的运行状态。开发者可以根据具体需求调整上述配置参数,以达到最佳的性能表现。此外,在实际操作过程中可能会遇到各种问题,例如兼容性问题、...
Java程序可以在不同的操作系统上运行,主要依赖于Java虚拟机(JVM)。JVM负责解释执行Java字节码,而不同的操作系统会有对应版本的JVM,这样就实现了Java的“一次编写,到处运行”的特性。 ### 四、Java开发工具包...
正确地使用 Resource 路径可以确保程序的正确运行和移植性,而错误的使用则可能导致程序崩溃或不可移植。 Java 中的相对路径 在 Java 中,并不存在标准的相对路径,各种相对路径的取资源方式都是基于某种规则转化...