以前学过一点java,注重的只是语言本身的东西,对于像path,classpath等没有太注意,只是简单的学会使用。最近在看Lucene,于是再一次接触到java,发现以前对classpath的理解实在浅薄。今天再次学习classpath,有一些体会。记录如下.
假设在c:\work下写了一个HelloWorld.java,而且已经编译成了HelloWorld.class,在不切换路径的情况下,直接可以执行java HelloWorld来载入HelloWorld.class。
如果切换到C:\下面或是其他路径,那么该如何载入HelloWorld.class并执行呢?
首先要明白java这个命令行是干什么的?执行java,其实就是启动jvm,后面跟着类的名称,表示由jvm载入该类的.class并执行。
我们知道,在操作系统下使用命令行的时候,OS会根据path中的路径信息,试图找到可执行的文件(在windows下面就是。exe、bat文件)。
那么jvm是什么呢?jvm是java程序唯一识别的操作系统,对jvm来说,可执行文件就是扩展名为.class的文件。当要在jvm中执行某个它的可执行文件(.class)时,jvm会依据classpath中的路径信息来寻找。
作个简单的比照,可以很清楚的对照path和classpath:
OS依据path中的路径信息来寻找可执行指令;
JVM(java虚拟机)依据CLASSPATH中的路径信息来寻找可执行指令(.class文件)。
回到我们最先提出的问题,那我们现在可以得到解决的办法了。
java -cp c:\work HelloWorld
以上我们明白了classpath的基本作用。
输入javac我们可以看到其中的参数选项
-classpath <路径> 指定查找用户类文件和注释处理程序的位置
-cp <路径> 指定查找用户类文件和注释处理程序的位置
我们就是用-cp或者是-class来指定我们要找的文件。
我写了一个java文件,其中需要用到lucene-core-2.4.1.jar这个包,但是我并没有把这个包放到classpath中。于是在编译的时候我是这样做的:
javac -cp D:\java\lucene\lucene-2.4.1\lucene-2.4.1\lucene-core-2.4.1.jar Indexer.java
这样编译时没有什么问题的!
执行
java Indexer
结果却出错了:
当然这个问题我很快就意识到了,是没有把需要的包加进来(不只是编译的时候需要classpath,执行的时候同样需要).于是我把它加了进来:
java -cp D:\java\lucene\lucene-2.4.1\lucene-2.4.1\lucene-core-2.4.1.jar Indexer
但是结果仍然是错的。
我们比较一下就会发现,这2个异常是不一样的。第一个是没有找到包里面的文件。而第二个则是没有找到Indexer文件。
这个错误和我们最先出现的错误是一样的。于是我们可以采取引入到classpath的办法解决。意思就是说:
java -cp c:\;D:\java\lucene\lucene-2.4.1\lucene-2.4.1\lucene-core-2.4.1.jar Indexer
这样就把问题给解决了!
- 大小: 77.9 KB
- 大小: 82.8 KB
- 大小: 25.8 KB
分享到:
相关推荐
对于初学者而言,理解 Java 中的 `classpath` 概念可能会感到有些困难。很多时候,程序在某个环境下可以正常运行,但换到另一个环境时却出现了问题,这往往与 `classpath` 设置不当有关。本文将详细介绍 `classpath`...
本文将详细介绍几个常用的环境变量:`JAVA_HOME`、`Path`、`CLASSPATH`、`CATALINA_HOME`以及`ANT_HOME`,帮助读者更好地理解这些概念并进行相应的配置。 #### 1. `JAVA_HOME` `JAVA_HOME`环境变量主要用于指定...
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ``` 4. 使更改生效: ``` source /etc/profile ``` 最后,我们来看Tomcat的配置。Tomcat是一个流行的开源Java应用服务器,用于部署和运行Java...
5. **文件集(Filesets)**:用于指定一组文件或目录,Ant提供了多种方式来定义文件集,如`<fileset>`,`<dirset>`,`<classpath>`等。 6. **路径(Path)**:定义类路径或者文件路径,可以包含多个文件或目录,常用于...
7. onDestroy():当Activity即将被系统彻底销毁时调用,可能是用户手动关闭或系统资源回收。这是清理资源和执行清理工作的地方。 在研究Activity生命周期时,源码分析是非常重要的一环。开发者可以通过查看Android...
对于初学者来说,掌握这些步骤将有助于更好地理解和运用JMeter进行性能测试。需要注意的是,随着版本更新,部分细节可能会有所变化,请参考官方文档获取最新信息。希望本文能帮助大家顺利入门JMeter,开启性能测试之...
4. Date和Time API重构:Java 8对日期和时间API进行了彻底的改进,提供了`java.time`包,取代了原有的`java.util.Date`和`java.util.Calendar`,使得日期和时间的操作更加直观和灵活。 5. Nashorn JavaScript引擎:...
- 编辑系统环境变量中的`CLASSPATH`和`PATH`,移除所有指向Oracle路径的条目。 4. **删除Oracle文件夹**: - 定位到`C:\Program Files\Oracle`(默认位置),如果存在则删除整个Oracle文件夹。 - 同样,也要删除...
2. 使用`URLDecoder.decode(str, "UTF-8")`进行解码,但这种方法对某些特殊字符(如"+")处理不彻底,因为URL编码不是完全使用URLEncoder.encode进行的。 3. 通过`TestURL().class.getResource("").toURI().getPath...
3. **CLASSPATH**:虽然JDK1.8之后,默认情况下,Classpath已经不需要显式设置了,但如果需要指定特定的类库,可以将其设置为相关jar文件或目录的路径。 配置完成后,可以通过在命令行输入`java -version`和`javac ...
在IT行业中,Java是一...对于初学者来说,理解并掌握这些步骤是迈向Java开发的第一步。在实际工作中,还需要根据具体项目需求,学习更多的技术和工具,例如Spring框架、MyBatis、Docker等,以提升开发效率和项目质量。
#### 一、理解Oracle卸载流程 在进行Oracle卸载之前,我们需要了解整个卸载过程涉及的主要步骤: 1. **停止所有Oracle服务**:确保没有Oracle服务正在运行。 2. **通过控制面板卸载Oracle产品**:使用标准程序卸载...
本文将详细解析从给定文件中提取的关键步骤,帮助理解如何全面地从计算机中卸载Oracle数据库。 ### 一、停用Oracle服务 首先,必须确保所有Oracle相关服务都已停止。这一步是至关重要的,因为如果服务仍在运行,...
9. **系统配置**:对于新手来说,理解安装软件后需要进行的系统配置和环境变量设置是非常重要的,这关系到软件能否正常工作。本文作者的经历就是一个很好的例子,说明了这一点。 总的来说,搭建J2EE开发环境涉及多...
- **Date和Time API改进**:Java 8对日期和时间API进行了彻底改造,引入了`java.time`包,提供了更加灵活和强大的日期时间操作。 - **Optional类**:用于处理可能为空的对象,减少空指针异常,提高了代码的健壮性...
4. 删除环境变量:从系统环境变量中移除Oracle相关的CLASSPATH和PATH设置。 5. 清理桌面快捷方式和启动项:删除与Oracle相关的桌面图标和启动组项目。 6. 删除Oracle安装目录:如C:\Oracle及其所有子目录。 7. 删除...
下面将对这些步骤进行详细解析,帮助用户理解和执行。 1. **停止Oracle服务**:在开始任何卸载过程之前,确保所有的Oracle服务已经被停止。这可以通过在Windows的服务管理器中找到Oracle相关的服务并停止它们来实现...
4. **Date和Time API的改进**:JDK8对日期和时间API进行了彻底的重构,提供了更强大且易于使用的`java.time`包,替代了过时的`java.util.Date`和`java.util.Calendar`。 5. **默认方法**:接口中可以定义带有实现的...
4. **日期和时间API的改进**:Java 8彻底改革了日期和时间的处理,引入了新的`java.time`包,包含`LocalDate`、`LocalTime`、`LocalDateTime`和`ZonedDateTime`等类,提供更强大且易于使用的日期和时间操作。...