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
总结一下:就是 要和包声明的等级一样。不能省略,也不能添加。
JAVA classpath jar问题[zz]的更多相关文章
- java 执行 jar 包中的 main 方法
java 执行 jar 包中的 main 方法 通过 OneJar 或 Maven 打包后 jar 文件,用命令: java -jar ****.jar执行后总是运行指定的主方法,如果 jar 中有多 ...
- 在cmd里,java运行jar包中指定Class的命令
java -classpath ****.jar ****.****.className
- java 执行jar包里面一个类class文件
一.环境: 1. linux 2. 有两个java类,A.java和B.java,都在同一个目录下 二.源码: A.java package com.abc; public class A { ...
- java classpath import package 机制 @Java的ClassPath, Package和Jar
java classpath import package 机制 從一個簡單的例子談談package與import機制 基本原則:為什麼需要將Java文件和類文件切實安置到其所歸屬之Package ...
- java classpath getResource getResourceAsStream
1.classpath 用于指定java运行时,jvm寻找class文件以及jar文件的存储目录.jvm依据classpath中出现的jar文件以及目录,依次寻找,直到找到指定class文件. 例:j ...
- java打jar包,引用其他.jar文件
大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个jar包的程序入口. 具体的方法是修改jar包内目录META-INF下的MANIF ...
- java classpath批量设置shell脚本
java classpath批量设置shell脚本 注意:linux bash jar文件之间的分隔符是':' export JAR_HOME=path to directory which ...
- java classpath深入详解(转)
http://developer.51cto.com/art/200509/2786.htm 设置类路径 结构 可通过对 JDK 工具使用 -classpath 选项(首选方法)或设置 CLASSPA ...
- JAVA classpath, 纠正我一直以来错误的认知
如何调在CLI中使用java tool(JDK中的java命令)调用一个打包在jar中的类,我想大多数人都能给出笼统的方案: java -classpath xxxxx com.test.classA ...
随机推荐
- 如何处理Android中的防缓冲区溢出技术
[51CTO专稿]本文将具体介绍Android中的防缓冲区溢出技术的来龙去脉. 1.什么是ASLR? ASLR(Address space layout randomization)是一种针对缓冲区溢 ...
- Aerospike系列:7:数据分布详解
1:Aerospike数据库是Shared-Nothing架构,集群中的每个节点都是相同的,不会出现单点故障. Aerospike有智能分区算法,即把用户输入的key在内部根据RIPEMD-160算法 ...
- Java多线程的悲观锁与乐观锁
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6561376.html 一:悲观锁 悲观锁,就是不管是否发生多线程冲突,只要存在这种可能,就每次访问都加锁,加 ...
- Flash Actionscript AS3 渐变透明 mask遮罩
把图片变成渐变透明(左图是效果图,右图是原图) var a:Sprite = new Sprite(); a.graphics.beginGradientFill(GradientType.LI ...
- Android开发经典笔试面试题汇总(持续更新中)
1.我们都知道Handler是线程与Activity通信的桥梁,假设线程处理不当.你的机器就会变得非常慢,那么线程销毁的方法是:(A) A. onDestroy() B. onClear() C. o ...
- Android网络编程(一)HTTP协议原理
相关文章 Android网络编程(一)HTTP协议原理 Android网络编程(二)HttpClient与HttpURLConnection Android网络编程(三)Volley使用方法全解析 A ...
- UI Automation的两个成熟的框架(QTP 和Selenium)
自己在google code中开源了自己一直以来做的两个自动化的框架,一个是针对QTP的一个是针对Selenium的,显而易见,一个是商业的UI automation工具,一个是开源的自动化工具. 只 ...
- 浅谈Spring的PropertyPlaceholderConfigurer
大型项目中,我们往往会对我们的系统的配置信息进行统一管理,一般做法是将配置信息配置与一个cfg.properties的文件中,然后在我们系统初始化的时候,系统自动读取cfg.properties配置文 ...
- 创建第一个servlet程序--HelloServlet
这篇文章是用来纪念我第一次创建一个Servlet程序,步骤我会写得详细点,也可以参考一下,后续我会将SpringMVC 跟ssh的搭建分别更新(ps:不忙的话我会更新) 工具:java jdk 1.6 ...
- 在执行context.getContentResolver.query()方法时出现错误。
1. 在执行context.getContentResolver.query()方法时出现错误. 07-15 18:46:13.470: E/AndroidRuntime(13624): FATAL ...