zoukankan      html  css  js  c++  java
  • 谈谈Java的classpath

    Java之ClassPath


    大家刚开始写Java代码的时候,如果使用Eclipse作为IDE,同时需要引用其他的类库,一般会有如下操作

    1. 在工程中新建lib目录
    2. 将jar包复制到lib目录下
    3. 右键单击选中jar,点击Bulid Path,之后点击Add to Bulid Path
    4. 最终我们可以在Referenced Libraries中看到我们添加的jar包

    jar

    ClassPath

    其实上述的操作都和ClassPath有关,那究竟什么是ClassPathClassPath的作用是什么?

    1. 什么是ClassPath

    CLASSPATH 包含了一个或多个目录,它们作为一种特殊的“根”使用,从这里展开对.class文件的搜索。从那个根开始,解释器会寻找包名,并将每个点号(句点)替换成一个斜杠,从而生成从CLASSPATH 根开始的一个路径名(所以package foo.bar.baz会变成fooaraz或者foo/bar/baz;具体是正斜杠还是反斜杠由操作系统决定)。随后将它们连接到一起,成为CLASSPATH 内的各个条目(入口)。以后搜索.class文件时,就可从这些地方开始查找与准备创建的类名对应的名字。

    ClassPath,中文叫做类路径,就是存放编译好的.class的路径。当你需要引用或者使用的类,不再当前目录下的时候,就需要将这些类添加到ClassPath中。


    当我们第一次写JavaHelloWorld的时候,我们新建HelloWorld.java文件,并输入以下内容

    public class HelloWorld {
    
        public static void main(String[] args) {
            System.out.println("Hello World");
        }
    
    }
    

    在命令行中输入以下命令,就可以在控制台看见输出Hello World

    javac HelloWorld.java
    java HelloWorld
    

    但是你如果想在在程序中引用Jar包,该怎么做?
    下面的例子中在,我们想在HelloWorld中引用Gson的jar包

    import com.google.gson.Gson;
    
    public class HelloWorld {
    
        public static void main(String[] args) {
            Gson gson = new Gson();
            System.out.println("Hello World");
        }
    
    }
    

    首先将肯定需要将jar包复制到当前路径下,之后我们直接运行javac javac HelloWorld.java,但是运行报错,说明之前的做法已经行不通了

    bug

    我们改成输入,就可以重新打印输出Hello World

    javac -cp .gson-2.8.0.jar HelloWorld.java
    java -cp .gson-2.8.0.jar; HelloWorld
    

    或者

    javac -classpath .gson-2.8.0.jar; HelloWorld.java
    java -classpath .gson-2.8.0.jar; HelloWorld
    

    从上讲,可见ClassPath可以用来指定我们的导入的Jar包的信息。

    2. Eclipse工具中ClassPath

    当然,在IDE工具不用这么麻烦,只需要点几个按钮就可以了。
    在Eclipse中,比如我们将gson包导入的ClassPath中,编译器会在工程目录下的.classpath文件中添加我们导入的jar包信息,之后在编译运行的时候,自动添加这些信息。对比上面的收到编译运行,IDE工具为我们做了非常多事情,来提高我们的效率。

    jar

    3. Web工程下的ClassPath

    在Eclipse中,没有使用Maven的情况下,新建Dynamic Web Project,使用Spring框架,一般我们会在Web.xml做出如下配置

    <!-- 配置启动 Spring IOC 容器的 Listener -->
    	<!-- needed for ContextLoaderListener -->
    	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>classpath:applicationContext.xml</param-value>
    	</context-param>
    
    	<!-- Bootstraps the root web application context before servlet initialization -->
    	<listener>
    		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    	</listener>
    	
    	<servlet>
    		<servlet-name>springDispatcherServlet</servlet-name>
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    		<init-param>
    			<param-name>contextConfigLocation</param-name>
    			<param-value>classpath:springmvc.xml</param-value>
    		</init-param>
    		<load-on-startup>1</load-on-startup>
    	</servlet>
    
    	<servlet-mapping>
    		<servlet-name>springDispatcherServlet</servlet-name>
    		<url-pattern>/</url-pattern>
    	</servlet-mapping>
    

    我们就会看到classpath:applicationContext.xmlclasspath:springmvc.xml里面出现了classpath,有人就会有疑问,放在src目录的配置文件用classpath:怎么可以读取到

    我们将Dynamic Web Project导出成war包,并将后缀修改成rar并解压。我们可以发现放在src目录下的配置文件和生成的.class文件均存放在WEB-INFclasses目录下。所以我们就可以在在classpath中读取到配置文件

    作者:LDZZDL

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    call、apply、bind函数的理解以及手写。
    父div里两个子div(inline-block),为什么两个子div中间会有小缝隙,如何解决?
    手写柯里化
    arguments的理解
    New
    BFC
    useCallBack和useMemo的用法
    观察者模式和发布订阅模式
    grid布局
    Android常见输入法的包名和主类名
  • 原文地址:https://www.cnblogs.com/LDZZDL/p/9081594.html
Copyright © 2011-2022 走看看