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当作目录,但是你不能在mypackage\first里执行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:\Project\first> 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:\亚洲\Building001\Resident001.java
  package 亚洲.Building001;
  public class Resident001
  {
     .....//省略
  }
  
 运行:1) C:\亚洲\Building001>javac *.java
      2) C:\任何目录\>java 亚洲.Building001.Resident001

2。设classpath=C:\亚洲;
  
  Java文件:C:\亚洲\Building001\Resident001.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:\亚洲\Building001\Resident001.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

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

时间: 2024-12-19 13:52:15

JAVA classpath jar问题[zz]的相关文章

java 执行 jar 包中的 main 方法

通过 OneJar 或 Maven 打包后 jar 文件,用命令:java -jar ****.jar执行后总是运行指定的主方法,如果 jar 中有多个 main 方法,那么如何运行指定的 main 方法呢?用下面的命令试试看: java -classpath ****.jar ****.****.className [args] “****.****”表示“包名”:“className”表示“类名”:“[args]”表示传入的参数: 直接运行 MANIFEST.MF 中指定的 main 方法:

java -classpath or -cp 的设置和解释

classpath is a parameter-set either on the command-line, or through an environment variable-that tells the Java Virtual Machine or the Java compiler where to look for user-defined classes and packages. Overview and architecture Similar to the classic

java javac jar mvn

javac -Djava.ext.dirs=./lib -d classes Test.java 注:./lib为包含lib目录下面的所有jar包,-d是生成的class文件目录,Test.java即为测试代码. 类似的,java -Djava.ext.dirs=./lib Test   也可以用-cp=classpath jar -tvf *.jar 查看jar包目录结构 mvn仓库设置,一般是~/.m2/settings.xml,或者是/etc/maven/settings.xml <set

java和jar命令

-jar参数运行应用时classpath的设置方法 你是否在使用java -jar参数运行打包好的jar应用程序的时候发现应用程序无法找到classpath下设置好的第三方类库的内容?无论怎么设置classpath参数都无济于事,总是会报ClassNotFound的错误? 当用java -jar yourJarExe.jar来运行一个经过打包的应用程序的时候,你会发现如何设置-classpath参数应用程序都找不到相应的第三方类,报ClassNotFound错误.实际上这是由于当使用-jar参数

Java生成jar包\打包\Export

本文介绍一下如何通过Eclipse将自己的项目打包成jar 1.项目上右键单击 Export 2.选择 Java - JAR file - [next >] 3.进入jar包的配置界面,在这里勾选你想导出的jar所包含的文件 Export generated class files and resources导出时包含class文件和其他资源资源 Export all output folders for checked projects导出时包含项目的所有文件夹 Export Java sou

命令行java -classpath 的使用

最近用Neatbeans 6.9.1做开发,发现在Neatbeans环境中运行没问题,但在命令行中不能正常运行,百度了一下原来需要加上classpath命令,但发现仍不能 正常运行,最终经过我的多次试验,原来使用classpath时覆盖了原来的classpath,直接导致找不到原有的主类. /*该类打包成JavaLibrary1.jar,我用Netbeans直接生成的jar文件*/ /* * To change this template, choose Tools | Templates *

jar命令打包与java执行jar包

JAR命令详解 jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C 目录] 文件名 - 其中 {ctxu} 是 jar 命令的子命令,每次 jar 命令只能包含 ctxu 中的一个,它们分别表示: -c 创建新的 JAR 文件包 -t 列出 JAR 文件包的内容列表 -x 展开 JAR 文件包的指定文件或者所有文件 -u 更新已存在的 JAR 文件包 (添加文件到 JAR 文件包中) [vfm0M] 中的选项可以任选,也可以不选,它们是 jar 命令的选项参

关于Java引用jar是否支持通配符

Java引用jar执行命令: java -cp .:mysql-connector-java-5.1.24.jar:jdom-1.1.jar JavaCpTest 说明: -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号";" 分隔,linux上是分号":"分隔.不支持通配符,需要列出所有jar包,用一点"."代表当前路径. 关于jar是否支持通配符,网上答

Java对Jar文件的操作[转]

原文地址:http://www.cnblogs.com/mailingfeng/archive/2012/04/24/2122160.html 一些文件路径补充知识: URI uri = new URI("file:/D:/workspace-home/JavaDemo/conf/"); File dirFile = new File(uri);  String dirPath = System.getProperty("user.dir") + "\\c