`
googya
  • 浏览: 143380 次
  • 性别: Icon_minigender_1
  • 来自: 汉川
社区版块
存档分类
最新评论

彻底理解classpath

    博客分类:
  • JVM
阅读更多
    以前学过一点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
2
0
分享到:
评论
1 楼 googya 2010-01-09  
我们可以搞点更加复杂的东西!假如在C盘下面的java程序还带有包。文件如下:
package www;
public class Message{
	String xxx;
	public Message(String zifuchuan){
		this.xxx=zifuchuan;
	}

	public void pp(){
		System.out.println(this.xxx);
	}
}

package www;
public  class Hello{
	public static void main(String[] args){
		Message mms=new Message("love you");
		mms.pp();
	}
}

当然在编译的时候,我们可以这样
javac -d . Message.java
javac -d . Hello.jave

编译完成之后,我们执行
java www.Hello就可以
当在其他地方运行这些文件的时候,我们必须引入classpath,这样才可以运行程序。比如我们再D:盘运行的时候,需用这样的命令:
java -cp c:\ www.Hello
才可以得到想要的结果!

相关推荐

    java Classpath全解

    对于初学者而言,理解 Java 中的 `classpath` 概念可能会感到有些困难。很多时候,程序在某个环境下可以正常运行,但换到另一个环境时却出现了问题,这往往与 `classpath` 设置不当有关。本文将详细介绍 `classpath`...

    2分钟彻底搞清-各种环境变量

    本文将详细介绍几个常用的环境变量:`JAVA_HOME`、`Path`、`CLASSPATH`、`CATALINA_HOME`以及`ANT_HOME`,帮助读者更好地理解这些概念并进行相应的配置。 #### 1. `JAVA_HOME` `JAVA_HOME`环境变量主要用于指定...

    CentOs7 mysql安装彻底卸载 jdk tomcat配置

    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ``` 4. 使更改生效: ``` source /etc/profile ``` 最后,我们来看Tomcat的配置。Tomcat是一个流行的开源Java应用服务器,用于部署和运行Java...

    ant工具使用.zip

    5. **文件集(Filesets)**:用于指定一组文件或目录,Ant提供了多种方式来定义文件集,如`&lt;fileset&gt;`,`&lt;dirset&gt;`,`&lt;classpath&gt;`等。 6. **路径(Path)**:定义类路径或者文件路径,可以包含多个文件或目录,常用于...

    Android Activity 生命周期(lifecycle)的研究

    7. onDestroy():当Activity即将被系统彻底销毁时调用,可能是用户手动关闭或系统资源回收。这是清理资源和执行清理工作的地方。 在研究Activity生命周期时,源码分析是非常重要的一环。开发者可以通过查看Android...

    Jmeter-环境安装和部署

    对于初学者来说,掌握这些步骤将有助于更好地理解和运用JMeter进行性能测试。需要注意的是,随着版本更新,部分细节可能会有所变化,请参考官方文档获取最新信息。希望本文能帮助大家顺利入门JMeter,开启性能测试之...

    jdk-8u144-windows-x64.zip

    4. Date和Time API重构:Java 8对日期和时间API进行了彻底的改进,提供了`java.time`包,取代了原有的`java.util.Date`和`java.util.Calendar`,使得日期和时间的操作更加直观和灵活。 5. Nashorn JavaScript引擎:...

    完全卸载oracle11g

    - 编辑系统环境变量中的`CLASSPATH`和`PATH`,移除所有指向Oracle路径的条目。 4. **删除Oracle文件夹**: - 定位到`C:\Program Files\Oracle`(默认位置),如果存在则删除整个Oracle文件夹。 - 同样,也要删除...

    Java路径问题汇总[文].pdf

    2. 使用`URLDecoder.decode(str, "UTF-8")`进行解码,但这种方法对某些特殊字符(如"+")处理不彻底,因为URL编码不是完全使用URLEncoder.encode进行的。 3. 通过`TestURL().class.getResource("").toURI().getPath...

    JDK1.8和以及如何配置环境变量的文档一份

    3. **CLASSPATH**:虽然JDK1.8之后,默认情况下,Classpath已经不需要显式设置了,但如果需要指定特定的类库,可以将其设置为相关jar文件或目录的路径。 配置完成后,可以通过在命令行输入`java -version`和`javac ...

    jdk、tomcat、maven、svn开发配置文档,mysql卸载清除批处理等等

    在IT行业中,Java是一...对于初学者来说,理解并掌握这些步骤是迈向Java开发的第一步。在实际工作中,还需要根据具体项目需求,学习更多的技术和工具,例如Spring框架、MyBatis、Docker等,以提升开发效率和项目质量。

    oracle完全卸载并删除服务

    #### 一、理解Oracle卸载流程 在进行Oracle卸载之前,我们需要了解整个卸载过程涉及的主要步骤: 1. **停止所有Oracle服务**:确保没有Oracle服务正在运行。 2. **通过控制面板卸载Oracle产品**:使用标准程序卸载...

    oracle删除

    本文将详细解析从给定文件中提取的关键步骤,帮助理解如何全面地从计算机中卸载Oracle数据库。 ### 一、停用Oracle服务 首先,必须确保所有Oracle相关服务都已停止。这一步是至关重要的,因为如果服务仍在运行,...

    jdk1.8.0_181--.zip

    - **Date和Time API改进**:Java 8对日期和时间API进行了彻底改造,引入了`java.time`包,提供了更加灵活和强大的日期时间操作。 - **Optional类**:用于处理可能为空的对象,减少空指针异常,提高了代码的健壮性...

    超经典 解决windows下oracle11G安装卡壳.doc

    4. 删除环境变量:从系统环境变量中移除Oracle相关的CLASSPATH和PATH设置。 5. 清理桌面快捷方式和启动项:删除与Oracle相关的桌面图标和启动组项目。 6. 删除Oracle安装目录:如C:\Oracle及其所有子目录。 7. 删除...

    完全清楚oracle的方法

    下面将对这些步骤进行详细解析,帮助用户理解和执行。 1. **停止Oracle服务**:在开始任何卸载过程之前,确保所有的Oracle服务已经被停止。这可以通过在Windows的服务管理器中找到Oracle相关的服务并停止它们来实现...

    windows10,jdk8安装包

    4. **Date和Time API的改进**:JDK8对日期和时间API进行了彻底的重构,提供了更强大且易于使用的`java.time`包,替代了过时的`java.util.Date`和`java.util.Calendar`。 5. **默认方法**:接口中可以定义带有实现的...

    jdk1.8.zip

    4. **日期和时间API的改进**:Java 8彻底改革了日期和时间的处理,引入了新的`java.time`包,包含`LocalDate`、`LocalTime`、`LocalDateTime`和`ZonedDateTime`等类,提供更强大且易于使用的日期和时间操作。...

Global site tag (gtag.js) - Google Analytics