• JAVA classpath jar问题[zz]


    classpath问题可以说是所有初学者头疼的问题,偶也一样。

    1) classpath的作用:
      它的作用就事让java找到你所要执行,或你拥有的类。

    2) classpath的设置:
      设置classpath,一般可以在2个地方进行,

      一是系统环境,如Windows98 中autoexec.bat文件中,每次开机自动设置。
                     Windows2000 中系统设置,加入classpath项 等等。
      二是在执行时,如java -classpath C:Project;%classpath% myclass
                   这样就就在原本的classpath中加入了C:Project这个目录。

    3) 用途(怎么用):
      这也许是最大的问题,偶慢慢说。

      classpath有点类似path,但不完全是。
      一般我们在一个类中声明包名:如
           package mypackage.first;
          import java.io.*;
          public class myfirst { ....}
      
      那么就是把myfirst这个类放进mypackage里的first里面。大家可以把mypackage和first当作目录,但是你不能在mypackagefirst里执行java myfirst 。因为这样java会认为你是在找默认目录(即classpath)里找myfirst类,而不是mypackage.first里面的myfirst类。什么意思呢?
      这是因为java只会在classpath中找有关java的东西,不会理会path。只有这样才能跨平台。
      classpath中加个.(点)表示当前目录,即在当前目录寻找java的类,不理会其他目录。
      (注意:java本身的类,如java.io.*;java awt.*;等等会自动包括进去,不用指定)

      大家也许认为这很麻烦,但这非常有用,如果你要管理你的文件时。比如说我有10个EJB的client,分别对应不同的EJB,那么你可以把这10个client分别放入各自的EJB包中,以免混乱。如:
       myejb.helloworld.client;
      myejb.firstEJB.client; 等等。

    举个例子:
       classpath=C:Project;D:;
      你在C:Project里有first,helloworld目录,里面相应有各自的client文件(已编译)。
       给出first目录的client.java作例:
      package first;
      import java.io.*;
      public class client
      {
        public static void main(String args[])
        {
           System.out.println("first.client invoked!!");
        }
      }
      编译:在 C:Projectfirst> javac *.java
      那么你就可以在任何DOS目录执行java first.client ,这都会启动这个client,而不会启动helloworld里的,或其他的。
      
      如果你在classpath中加了.(点), 如classpath=.;D:;
      那么你必须要在C:Project>里面执行上述语句,因为这表示在D:和当前目录寻找,否则java会报错 ClassNoFoundException 。这点要注意。

      我想这也差不多了,虽然短了点,但是精就行了,有问题跟贴。

    谢谢你读完这篇文章。

    这里,我举一个例子让读者更容易理解classpath的作用。

    假设有100座楼房,从Building001到Build100依次编号,
    并且每一座楼房都有100个住户,也从Resident001到Resident100依次编号。
    这100座楼,可以在亚洲,也可以在欧洲。

    那么,这里的区域,就是DOS目录(就是你存放package的地方)。
         这里的楼房,就有点类似于package。
        这里的住户,就是你所建立的类(class)。
    如,第55号楼39号住户, 那么就可以表示为:
    package Building55;
    public class Resident39
    {
     ...//省略 实现代码
    }
    目录方面:
    C:
    |------亚洲(区域的作用,也可作为package作用)
    |       |----Building001(package的作用)
    |       |        |-----Resident001.....到Resident100(A)
    |       |        
    |       |----Building002
    |       |        |-----Resident001.....到Resident100
    |       |
    |       |----Building003
    |       |        |-----Resident001.....到Resident100
    |       |
    |       |----Building...
    |       |        |-----Resident..........
    |       |
    |       |----Building050
    |                |-----Resident001.....到Resident100
    |
    |------欧洲(区域的作用,也可作为package作用)
            |----Building051(package的作用)
                      |-----Resident001.....到Resident100(B)
            |----Building052
                      |-----Resident001.....到Resident100
            |----Building053
                      |-----Resident001.....到Resident100
            |----Building...
                      |-----Resident..........
            |----Building100
                      |-----Resident001.....到Resident100

    这里的A,可以有多种表示方法:   推荐方法(1)

    1。设classpath=C:;
      
      Java文件:C:亚洲Building001Resident001.java
      package 亚洲.Building001;
      public class Resident001
      {
         .....//省略
      }
      
     运行:1) C:亚洲Building001>javac *.java
          2) C:任何目录>java 亚洲.Building001.Resident001

    2。设classpath=C:亚洲;
      
      Java文件:C:亚洲Building001Resident001.java
      package Building001;//不是 “亚洲.Building001” 了
      public class Resident001
      {
         .....//省略
       }
     运行:1) C:亚洲Building001>javac *.java
          2) C:任何目录>java Building001.Resident001
     注:这样设置的话,有可能会引发包名冲突。
        如:
             classpath=C:亚洲;C:欧洲;
            欧洲也有同样的Building001.Resident001的话。

    3。设classpath=C:亚洲Building001;
      
      Java文件:C:亚洲Building001Resident001.java

      //没有package 声明语句。
      public class Resident001
      {
         .....//省略
       }
     运行:1) C:亚洲Building001>javac *.java
          2) C:任何目录>java Building001.Resident001
     注:这样会与(2)有相同的问题,就是包名冲突。

    三种方法都介绍完了。下来有令一个问题。


    就是访问包。
    其实很简单的。就像访问住户一样。
    需要知道 洲际板块,建筑编号(package的声明)。
    需要去哪个住户,就从哪个建筑去/或者先去某板块(呵呵)。。。
    而不能直接去某个住户。
    如:
    C:
    |------亚洲(区域的作用,也可作为package作用)
    |       |----Building001(package的作用)
    |       |        |-----Resident001.....到Resident100(A)
    |       |        
    |       |----Building002
    |       |        |-----Resident001.....到Resident100
    ....
    (A)的表示是:
    package 亚洲.Building001;
    public class Resident100
    {
      ....//省略
    }
    那么:在classpath设置正确的情况下,你需要执行 
        C:任意目录>java 亚洲.Building001.Resident100
    而不是
        C:亚洲Building001>java Resident100
      或
        C:亚洲>java Building001.Resident100

    总结一下:就是 要和包声明的等级一样。不能省略,也不能添加。

  • 相关阅读:
    Quartz实现动态定时任务
    Springboot跨域和SpringCloud跨域
    java8 LocalDate 判断一年中的标准周末和工作日
    [WIP]iOS/macOS开发中常见的宏解释
    [WIP] Objective-C Runtime调试
    [WIP] iOS课程作业
    macOS 允许任何来源的应用
    Win10系统下移动、复制、删除文件需要管理员权限的解决方法
    flutter MediaQuery获取屏幕宽度高度密度通知栏高度等屏幕信息
    Flutter 获取状态栏高度、appBar高度 和 手机屏幕宽高
  • 原文地址:https://www.cnblogs.com/york-hust/p/3984047.html
Copyright © 2020-2023  润新知