优酷客户端搜索""CF全能外挂""第一个视频里面的歌曲叫做什么?at ther什么什么

热门搜索:
Copyright & 173. All rights reserved.public class A {}
cl2.jar只要一个类
public class Main {
public static void println(Class clazz) {
System.out.println("=====" + clazz.getName() + "=====");
System.out.println("1 " + clazz.getResource(""));
} catch (Exception e) {
System.out.println("1 error " + e.getMessage());
System.out.println("2 " + clazz.getResource("/"));
} catch (Exception e) {
System.out.println("2 error " + e.getMessage());
System.out.println("3 " + clazz.getClassLoader().getResource(""));
} catch (Exception e) {
System.out.println("3 error " + e.getMessage());
System.out.println("4 " + clazz.getResource("test.txt"));
public static void main(String[] args) {
println(Main.class);
println(Class.forName("test.A"));
} catch (ClassNotFoundException e) {
System.out.println("ClassNotFound " + e.getMessage());
} catch (Exception e) {
e.printStackTrace();
println(Class.forName("oracle.jdbc.driver.OracleDriver"));
} catch (ClassNotFoundException e) {
System.out.println("ClassNotFound" + e.getMessage());
} catch (Exception e) {
e.printStackTrace();
BatchFile code
@set CLASSPATH=.;%CLASSPATH%;cl1.jar;ojdbc14_g.jar;
@ECHO java -jar cl2.jar调用**************************************************
@java -jar cl2.jar
@ECHO 将cl2.jar添加到CLASSPATH中
@set CLASSPATH=.;%CLASSPATH%;cl2.jar;
@ECHO java test.Main调用**************************************************
@java test.Main
输出java -jar cl2.jar调用**************************************************=====test.Main=====1 null2 null3 null4 nullClassNotFound test.AClassNotFoundoracle.jdbc.driver.OracleDriver将cl2.jar添加到CLASSPATH中java test.Main调用**************************************************=====test.Main=====1 null2 file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/3 file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/4 jar:file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/cl1.jar!/test/test.txt=====test.A=====1 null2 file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/3 file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/4 jar:file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/cl1.jar!/test/test.txt=====oracle.jdbc.driver.OracleDriver=====1 jar:file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/ojdbc14_g.jar!/oracle/jdbc/driver/2 file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/3 file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/4 null不打jar包输出,eclipse测试的,没有在cmd中测试,但是在cmd下结果应该一致。=====test.Main=====1 file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/bin/test/2 file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/bin/3 file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/bin/4 jar:file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl1/cl1.jar!/test/test.txt=====test.A=====1 file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/bin/test/2 file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/bin/3 file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/bin/4 jar:file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl1/cl1.jar!/test/test.txt=====oracle.jdbc.driver.OracleDriver=====1 jar:file:/D:/SYJ.WORK/SYJ.LIB/driver/oracle-connector/ojdbc14_g.jar!/oracle/jdbc/driver/2 file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/bin/3 file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/bin/4 null
问:1.oracle的驱动ojdbc14_g.jar通过clazz.getResource("");可以打印出路径,但是cl1.jar却不能?2.打了jar以后对clazz.getResource("");一些情况下取不到了。
没人顶自己顶下,还忘各位新老朋友帮忙分析,分不是问题,来者皆有分,我的一向作风。
@@等待高手解答
这么快就沉了,再顶下,今天晚上网络出现点问题,错过了黄金时间,嗨,郁闷。
先帮顶一个
你知道getResource()返回的是java.net.URL吗?你知道这个url可能是file://也可能是jar://吗?你知道这个东西是根据classpath设置的路径进行搜索获得的吗?你知道java -jar会忽略系统classpath吗?
引用 6 楼 xyz20003 的回复:
你知道getResource()返回的是java.net.URL吗? 你知道这个url可能是file://也可能是jar://吗? 你知道这个东西是根据classpath设置的路径进行搜索获得的吗? 你知道java -jar会忽略系统classpath吗?
晕楼上的我想知道下面两个,你说的我都知道,汗,demo之所以这样写是为了比较。问:
1.oracle的驱动ojdbc14_g.jar通过clazz.getResource("");可以打印出路径,但是cl1.jar却不能?
2.打了jar以后对clazz.getResource("");一些情况下取不到了。
很久以前写这个的时候就发现这个问题了http://blog.csdn.net/sunyujia/archive//2027087.aspx博客的第一文也是这个问题http://blog.csdn.net/sunyujia/archive//1798328.aspx也尝试研究过类加载和反射了,07这个时候就研究了,当时不混csdn,但是不够深入。这个地方java源码有限很多在c++中实现。http://blog.csdn.net/sunyujia/archive//2316293.aspx前阵子在公司利用类加载做了应用隔离我的真实需求是无论在多么复杂的情况(复杂的类加载环境)下我需要知道当前类所在的jar文件。这个需求源于http://topic.csdn.net/u//c2fb1b90-4e21-46a9-a756-f.html但是现在我遇到的问题确实解决不了。
研究了很长时间的类加载了,哭死,到目前仍然不能了解java底层一丁点东西,还望高人指点。由同样的类加载器加载的两个不同类,clazz.getResource("");时一个就会有问题,我在一楼复现了这个问题,但没解决方案。java里面的源码不多,贴出来些方便大家
public URL getResource(String name) {
if (parent != null) {
url = parent.getResource(name);
url = getBootstrapResource(name);
if (url == null) {
url = findResource(name);
public URL findResource(final String name) {
* The same restriction to finding classes applies to resources
(URL) AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
return ucp.findResource(name, true);
return url != null ? ucp.checkURL(url) : null;
private static URL getBootstrapResource(String name) {
URLClassPath ucp = getBootstrapClassPath();
Resource res = ucp.getResource(name);
return res != null ? res.getURL() : null;
static URLClassPath getBootstrapClassPath() {
if (bootstrapClassPath == null) {
bootstrapClassPath = sun.misc.Launcher.getBootstrapClassPath();
return bootstrapClassP
引用 8 楼 sunyujia 的回复:
很久以前写这个的时候就发现这个问题了 http://blog.csdn.net/sunyujia/archive//2027087.aspx 博客的第一文也是这个问题 http://blog.csdn.net/sunyujia/archive//1798328.aspx 也尝试研究过类加载和反射了,07这个时候就研究了,当时不混csdn,但是不够深入。这个地方java源码有限很多在c++中实现。 http://blog.csdn.net/sunyujia/archive//2316293.aspx 前阵子在公司利用类加载做…
利用我改的P6spy在weblogic环境中bea的驱动,就无法利用clazz.getResource("");定位。我不明白驱动有什么特别的,我的p6spy驱动同样实现了jdbc接口,bea的驱动也一样实现了。但是就是无法利用clazz.getResource("");定位,通过这一点就知道这个和jdbc驱动无关,一定是oracle.jdbc.driver.OracleDriver在里面做了一件事在static{}里面或字段里面,但是我不知道是那个地方做了那件事,只能借助jar文件中的其他文件定位例如test.txt。但这不是根本解决途径因为在一个同态的环境我不能知道别人jar文件的包结构,即便可以穷举(目前我的需求可以穷举)但是这不是个好方法,我想知道为什么clazz.getResource("");有时候不行。话题扯远了,有高人能说明一楼的问题就行了。
你都是在 Eclipse 的 Export 下进行打包的吧。你用 Ant 或者 jar 工具进行打包,看看结果是不是这样呢?下面是我用 Ant 打包,之后运行那个 bat 的结果(注:我用的是 MySql 的 JDBC 驱动):
java -jar cl2.jar调用**************************************************
=====test.Main=====
1 jar:file:/D:/test/cl2.jar!/test/
=====com.mysql.jdbc.Driver=====
1 jar:file:/D:/test/mysql-connector-java-5.1.5-bin.jar!/com/mysql/jdbc/
=====com.bao.A=====
1 jar:file:/D:/test/cl1.jar!/com/bao/
4 jar:file:/D:/test/cl1.jar!/com/bao/test.txt
将cl2.jar添加到CLASSPATH中
java test.Main调用**************************************************
=====test.Main=====
1 jar:file:/D:/test/cl2.jar!/test/
2 file:/D:/test/
3 file:/D:/test/
=====com.mysql.jdbc.Driver=====
1 jar:file:/D:/test/mysql-connector-java-5.1.5-bin.jar!/com/mysql/jdbc/
2 file:/D:/test/
3 file:/D:/test/
=====com.bao.A=====
1 jar:file:/D:/test/cl1.jar!/com/bao/
2 file:/D:/test/
3 file:/D:/test/
4 jar:file:/D:/test/cl1.jar!/com/bao/test.txt
Eclipse 下运行的结果是:
D:\MyProg\newjava\cl2
=====test.Main=====
1 file:/D:/MyProg/newjava/cl2/bin/test/
2 file:/D:/MyProg/newjava/cl2/bin/
3 file:/D:/MyProg/newjava/cl2/bin/
D:\MyProg\newjava\cl2
=====com.mysql.jdbc.Driver=====
1 jar:file:/D:/MyProg/newjava/cl2/lib/mysql-connector-java-5.1.5-bin.jar!/com/mysql/jdbc/
2 file:/D:/MyProg/newjava/cl2/bin/
3 file:/D:/MyProg/newjava/cl2/bin/
D:\MyProg\newjava\cl2
=====com.bao.A=====
1 jar:file:/D:/MyProg/newjava/cl2/lib/cl1.jar!/com/bao/
2 file:/D:/MyProg/newjava/cl2/bin/
3 file:/D:/MyProg/newjava/cl2/bin/
4 jar:file:/D:/MyProg/newjava/cl2/lib/cl1.jar!/com/bao/test.txt
超出我的理解范围了
public static void main(String[] args) {
println(Main.class);
System.out.println("---------------------");
println(test.Main.class);运行了一下:打包jar:E:\workspace1\t11\bin&java -jar c12.jar=====test.Main=====1 jar:file:/E:/workspace1/t11/bin/c12.jar!/test/2 null3 null4 jar:file:/E:/workspace1/t11/bin/c12.jar!/test/test.txt---------------------=====test.Main=====1 jar:file:/E:/workspace1/t11/bin/c12.jar!/test/2 null3 null4 jar:file:/E:/workspace1/t11/bin/c12.jar!/test/test.txt=====test.A=====1 jar:file:/E:/workspace1/t11/bin/c12.jar!/test/2 null3 null4 jar:file:/E:/workspace1/t11/bin/c12.jar!/test/test.txtClassNotFound :oracle.jdbc.driver.OracleDrivereclipse :=====test.Main=====1 file:/E:/workspace1/t11/bin/test/2 file:/E:/workspace1/t11/bin/3 file:/E:/workspace1/t11/bin/4 file:/E:/workspace1/t11/bin/test/test.txt---------------------=====test.Main=====1 file:/E:/workspace1/t11/bin/test/2 file:/E:/workspace1/t11/bin/3 file:/E:/workspace1/t11/bin/4 file:/E:/workspace1/t11/bin/test/test.txt=====test.A=====1 file:/E:/workspace1/t11/bin/test/2 file:/E:/workspace1/t11/bin/3 file:/E:/workspace1/t11/bin/4 file:/E:/workspace1/t11/bin/test/test.txtClassNotFound :oracle.jdbc.driver.OracleDrivercmd下运行:E:\workspace1\t11\bin&java test.Main=====test.Main=====1 file:/E:/workspace1/t11/bin/test/2 file:/E:/workspace1/t11/bin/3 file:/E:/workspace1/t11/bin/4 file:/E:/workspace1/t11/bin/test/test.txt---------------------=====test.Main=====1 file:/E:/workspace1/t11/bin/test/2 file:/E:/workspace1/t11/bin/3 file:/E:/workspace1/t11/bin/4 file:/E:/workspace1/t11/bin/test/test.txt=====test.A=====1 file:/E:/workspace1/t11/bin/test/2 file:/E:/workspace1/t11/bin/3 file:/E:/workspace1/t11/bin/4 file:/E:/workspace1/t11/bin/test/test.txtClassNotFound :oracle.jdbc.driver.OracleDriver
我去看了看oralce的驱动除了MANIFEST.MF不同外有看了你所说的那个static代码块,贴出来给你看一下OracleDriver类中的:
m_driverAccess = new Properties();
m_driverAccess.put("thin-server", "oracle.jdbc.thinserver.ServerTTC7Protocol");
m_driverAccess.put("oci-server", "oracle.jdbc.ociserver.ServerOCIDBAccess");
m_driverAccess.put("thin", "oracle.jdbc.ttc7.TTC7Protocol");
m_driverAccess.put("oci8", "oracle.jdbc.oci8.OCIDBAccess");
m_driverAccess.put("oci", "oracle.jdbc.oci8.OCIDBAccess");
m_driverAccess.put("kprb", "oracle.jdbc.kprb.KprbDBAccess");
m_defaultDriver =
Timestamp timestamp = Timestamp.valueOf(" 00:00:00.0");
if(m_defaultDriver == null)
m_defaultDriver = new OracleDriver();
DriverManager.registerDriver(m_defaultDriver);
catch(RuntimeException runtimeexception) { }
catch(SQLException sqlexception) { }
}m_defaultDriver = new OracleDriver(); 他这里有new了一个对象
果然都是高手.纯学习.帮顶..............
关注下,研究研究!
是 Eclipse 打包的问题,凡是用 Eclipse 打的包,用 getResource("") 都得不到!原因也不知道是啥,用 WinHex 看看也看不出啥东西,哎,关于 Eclipse 打 jar 的方式已经超出了我能力的范围了。用 Ant 或者是 jar 打包的就能读取。我还发觉一个很奇怪的问题:用 javac、Ant、Eclipse 在同一台机器上,同一个 JDK 编译同一个 java 文件,他们所产生的 class 文件大小竟然都不一样!
不可能吧?老大,ant和eclipse都是调用javac去编译的吧?呵呵~eclipse倒是有可能用那个新版本的自带jdt(猜的),ant可绝对是javac.exe吧?不知道apache自己也写了一个编译器。如果大小不一致,怀疑是有的jdk5,有的是jdk4,使用-version来编译的问题。getResource()其实就是一个类加载的问题,搞清楚什么情况下去哪里鼓捣classpath就好啵?一般都是按照你的classpath,系统classpath这样的顺序进行查找。但是java -jar挺特殊的,会拒绝系统classpath和java -cp这样的选项,而是优先使用META-INF/MANIFEST.MF里的build-classes(好像是这个名字)。
咳咳~开始讲课啦:这个问题,其实要追溯到getResource()的用法,小同志们,你们要知道,这个方法啊,肯定是有实际用处的,不是摆在那里玩滴。你说出来null感觉咋怎么奇怪呢?等你知道它是用来做什么的,就知道了,那时候你就该说,不返回null那才是奇怪呢。
先看看getResource()这个方法的定义public URL getResource(String name)它是根据一个name,获得一个URL,那就有问题了,这个URL获得来到底是为了做什么的?先别往下看,你先想想这个url拿来以后是要做什么的?======================================================url这个东西是拿来读的。read。就是要从这个url获得数据的。resource的意思是资源,方法的实际意义是,我通过一个name,获得一个资源的实际地址,然后才可以读取这个资源数据。借用一下楼主的测试数据啊。=====test.Main=====1 null2 file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/3 file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/4 jar:file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/cl1.jar!/test/test.txt
1是null,说明找不到对应的资源2是file:/D:/SYJ.WORK/SYJ.WORKSPACE/ws1/cl2/,可以看出来,这是一个本地文件的目录3同24,jar:file:/,没见过这种的同志不要急,我稍微给你提示一点儿。jar的意思是xxx.jar文件。file:/也是本地。等于这个东西是从本地的jar文件中读取的一个文件。!感叹号后边是这个文件在jar文件中的位置。
好,现在稍微聊聊这个getResource()大概是咋运作的。你说,就一个name,他怎么知道去哪里找这个资源呢?而且还会自动去目录下,和jar里找,你说他很聪明吗?其实不聪明。呵呵~它是根据java执行时候设置的classpath查找的。其实就是一个遍历。所谓遍历,就是挨个去找哦。你设置了100个classpath它就去找一百次。直到找到第一个匹配的资源位置。所以很傻吧?再借用楼主的数据一下哈:@java -jar cl2.jar这样,等于忽略系统配置的classpath,直接以c12.jar为classpath,再加上MF里的那些东西开始搜索。@ECHO 将cl2.jar添加到CLASSPATH中@set CLASSPATH=.;%CLASSPATH%;cl2.@ECHO java test.Main调用**************************************************@java test.Main这样是把c1.jar放到classpath中,明显优先级会比前面的"."和%classpath%低。这样的classpath顺序就是影响类的加载顺序,也就对getResource()产生影响。
因为我懒得去具体一个一个测试了,所以大家尽量领会精神,如果写出错来了,一定要狠狠拍我。有了classpath,再看getResource()是怎么去classpath里找的比如System.out.println("1 " + clazz.getResource(""));意思,就是从先找到clazz所在的包,然后返回这个包,里的名字是""的资源。同志,同志,注意啦。要是文件系统,""还可以翻译成当前包的目录。要是jar文件。你这个东西""返回是啥资源。jar里又不能当目录用。当然就是null了。这还有啥问题?搞明白了这个就简单了。下面的因为可以找到classpath的file:目录,所以当然就返回目录了。
引用 8 楼 sunyujia 的回复:
我的真实需求是无论在多么复杂的情况(复杂的类加载环境)下我需要知道当前类所在的jar文件。
LZ 的探索精神值得嘉许! ^_^就你提的这个问题,我个人的观点,恐怕是难以满足的。毕竟从理论上讲,一个 Class 并不“一定”来源于某个 jar。当然,绝大多数 Class 还是来源于某个 jar 的,对于这种情况,可以试着用 getResource() 的方法探测其所在的 jar 包。不过我不明白为什么要用 getResource("") 的方式呢?为什么不用 getResource("/somepackage/SomeClass.class") 的方式呢?比如 String.class.getResource("") 返回为 null, 而 String.class.getResource("/java/lang/String.class") 返回的就是 rt.jar,应该能满足你的要求。
getResource()实际就两种情况绝对路径和相对路径。刚才咱们玩的是相对路径。相对这个class当前包来查找的。也可以玩绝对的。getResource("/你个猪头啊.txt");这个基本就没啥问题了。多了一个“/”,就去classpath对应的顶级目录找“/你个猪头啊.txt”。唉,太简单了。
那个,因为java加载类的机制问题。你要想确切知道自己的类在哪个jar里。根本就是不可能的。java提供的这个getResource()还有配对的getResourceAsStream()可以让你在classpath下放一个东西,然后用这俩方法获得数据。不需要具体知道在jar里,还是在file目录下。我倒觉得,你想知道确切jar的想法,和java设计思路不一样哦。
我的真实需求是无论在多么复杂的情况(复杂的类加载环境)下我需要知道当前类所在的jar文件。
这个需求源于
http://topic.csdn.net/u//c2fb1b90-4e21-46a9-a756-f.html
但是现在我遇到的问题确实解决不了。楼主,我也极度想知道这个问题的解答答案,UP上去
引用 19 楼 xyz20003 的回复:
不可能吧?老大,ant和eclipse都是调用javac去编译的吧?呵呵~ eclipse倒是有可能用那个新版本的自带jdt(猜的),ant可绝对是javac.exe吧?不知道apache自己也写了一个编译器。 如果大小不一致,怀疑是有的jdk5,有的是jdk4,使用-version来编译的问题。
真的,不骗你的哦,我昨天测试过很多次。而且用 Eclipse Export 出的 jar,在程序中用 getResource("") 根本就得不到,用 Ant 和 jar 打的就能得到。
我把用 Ant 打包,用那个 bat 运行的结果我放在了 11 楼上,getResource("") 都能得到东西。14 楼也把结果贴出来的,估计他是用 jar 打包的,getResouce("") 也能得到东西。因此,怀疑是 Eclipse 打包的格式问题。不过好像就是用 getResouce("") 得不到之外,其他功能和用其他工具打包的没有什么区别(至少我还没有发现)。
我下班回家后再做验证,现在午休过来看看,在此感谢所有回帖的人,我昨天上午用Eclipse 打的包,昨天晚上用fatjar打的包。今天回家用ant试试。
用过这个,this.getClass().getClassLoader().getResource("")
引用 25 楼 xyz20003 的回复:
getResource()实际就两种情况 绝对路径和相对路径。 刚才咱们玩的是相对路径。相对这个class当前包来查找的。 也可以玩绝对的。getResource("/你个猪头啊.txt"); 这个基本就没啥问题了。多了一个“/”,就去classpath对应的顶级目录找“/你个猪头啊.txt”。 唉,太简单了。
我在10楼已经说的很清除了,请看清题意,另外根据一个特定的文件找的方法我也说了,请看清,我要问题的是getResource(""); 是“”我想知道具体的原因。另外请你换下你的举例文件名,谢谢!对别人的尊重也是对自己的尊重。
另外你好像没有看清问题的本质,我想火龙果已经发现这里的问题了。
引用 23 楼 xyz20003 的回复:
因为我懒得去具体一个一个测试了,所以大家尽量领会精神,如果写出错来了,一定要狠狠拍我。 有了classpath,再看getResource()是怎么去classpath里找的 比如System.out.println("1 " + clazz.getResource("")); 意思,就是从先找到clazz所在的包,然后返回这个包,里的名字是""的资源。 同志,同志,注意啦。 要是文件系统,""还可以翻译成当前包的目录。 要是jar文件。你这个东西""返回是啥资源。jar里又不…
为什么oracle的驱动jar包(还有其他一些jar包)可以???另外请讲些深入的东西,你讲的东西了解类加载的人都知道。并不能解决本题,一个程序员每天做的事就是了解需求,所以请你再次阅读本人写的比较次的需求文档。另外请谅解在下的直言不讳。
引用 24 楼 maquan 的回复:
引用 8 楼 sunyujia 的回复:我的真实需求是无论在多么复杂的情况(复杂的类加载环境)下我需要知道当前类所在的jar文件。
LZ 的探索精神值得嘉许! ^_^ 就你提的这个问题,我个人的观点,恐怕是难以满足的。毕竟从理论上讲,一个 Class 并不“一定”来源于某个 jar。 当然,绝大多数 Class 还是来源于某个 jar 的,对于这种情况,可以试着用 getResource() 的方法探测其所在的 jar 包。不过我不明白为什么要用 g…
我的需求前提就是class在jar中,十分感谢你提供的信息。你的方法我确实没有尝试过。到点上班了,再次感谢各位!
恩恩,我也正想搞明白这个问题!学习了。
xyz20003 的现场教学还是满生动的哈,只是后来一段例子程序有些不雅
:P在他的大段演讲中,我找到了最核心的一段,就是:
要是文件系统,""还可以翻译成当前包的目录。
要是jar文件。你这个东西""返回是啥资源。jar里又不能当目录用。当然就是null了。这还有啥问题? 这正是 getResource("") 有时返回 null,有时能返回 file:... 的根本原因。具体说,当某个 ClassLoader 在自己的“认知范围”内有“文件夹”,就可以返回一个 URL 来表示那个文件夹;而如果一个 ClassLoader 的所有“认知范围”都是 jar 包的话,它就没有办法返回一个有意义的 URL 来代表 "",所以就只好返回 null 了。至于 LZ 实际测试中曾经得到的 jar:file:/D:/SYJ.WORK/SYJ.LIB/driver/oracle-connector/ojdbc14_g.jar!/oracle/jdbc/driver/我看没有什么更好的解释,也许只能认为是那个 ClassLoader 的 BUG 吧……哦,等等,也不一定,也许是 jar 包本身的区别。一般来说,jar 包(其实就是个 ZIP 文件)中只有 file 可以作为 entry。但如果一个 folder 也作为 entry 被添加到 jar 包里的话……hehe
想到了就做!刚刚做了一个试验,证实了上一贴的猜测,确实是 jar 包本身的问题:folder 也可以作为 entry 存在,而是否有这样的 entry 就直接影响了 getResource("") 的结果。至于如何把 folder 加到 jar 中去,看你用什么做打包工具了,我用的是 Eclipse 的 Export/JAR file 功能,里面直接就有这个选项。如果想看生成的 jar 包里是否有 folder 形式的 entry,可以用下面这个命令:
jar -tvf test.jar至此,LZ 的问题应该算是有个完美的解释了吧
maquan 正解很少在社区见到你,这次帮了我大忙了。先佩服一下你的猜想能力,真是具备超好的职业素养,牛!
引用 28 楼 bao110908 的回复:
引用 19 楼 xyz20003 的回复:不可能吧?老大,ant和eclipse都是调用javac去编译的吧?呵呵~
eclipse倒是有可能用那个新版本的自带jdt(猜的),ant可绝对是javac.exe吧?不知道apache自己也写了一个编译器。
如果大小不一致,怀疑是有的jdk5,有的是jdk4,使用-version来编译的问题。
真的,不骗你的哦,我昨天测试过很多次。 而且用 Eclipse Export 出的 jar,在程序中用 getResource("") 根本就得不到,…
原来火龙果兄昨天晚上就开始动手帮助我了,我还以为你没收到我的sos呢,谢过了,你的想法对解决这个问题起到到很大的帮助。谢谢!
引用 6 楼 xyz20003 的回复:
你知道getResource()返回的是java.net.URL吗? 你知道这个url可能是file://也可能是jar://吗? 你知道这个东西是根据classpath设置的路径进行搜索获得的吗? 你知道java -jar会忽略系统classpath吗?
或许你很牛,是某公司高级技术人才,但是我想说的是,无论什么时候都不要瞧不起人,你的开场白就很另人反感,每个人都有自己的专长,如果你瞧不起一个人那你就无法从别人身上学到东西,停止不前很快就会被别人瞧不起了。我没别的意思,倡导和谐社会吧。我会给你分的。不知道你现在明白题意没有,希望你回答问题一针见血,这也是门学问。
帖子保留一段时间以帮助同样遇到此问题的人,这个问题很多人问到,我在百度里面搜过但是没有正解。楼上各位都是不缺分的人,应该不会在意晚结贴吧。不会太久没人关注了就结了。
引用 38 楼 maquan 的回复:
想到了就做!刚刚做了一个试验,证实了上一贴的猜测,确实是 jar 包本身的问题:folder 也可以作为 entry 存在,而是否有这样的 entry 就直接影响了 getResource("") 的结果。至于如何把 folder 加到 jar 中去,看你用什么做打包工具了,我用的是 Eclipse 的 Export/JAR file 功能,里面直接就有这个选项。如果想看生成的 jar 包里是否有 folder 形式的 entry,可以用下面这个命令:jar -tvf test.jar至此,…
呵呵,你说的很好,同时也验证了果子在群里说的 jar包的问题,而我的认为是 mf 的问题,呵呵,这帖子应该加精,让其他人也看看我还想说两句题外话,人长一张嘴,就要说人话,别总是喷刺儿,扎到别人也容易扎到自己的嘴。
经尝试用winzip打的包默认已经包含folder 形式的 entry
呵呵,我说怎么用 Eclipse 打出来的包,跟其他的不一样呢?原来,Eclipse 的 Export JAR 竟然把 Add directory entries 默认是未选中的,汗死~~不加入目录 entry 的功能在 jar 参数中并没有,可见 Eclipse 的 Export JAR功能比较强大一些,呵呵,学习了。。。┴┬┴┬/ ̄\_/ ̄\┬┴┬┴▏  ▏▔▔▔▔\┴┬┴/\ /      ﹨┬┴∕       /   )┴┬▏       ! ●  ▏┬┴▏           ▔█ 火龙果学习喽~┴◢██◣      /\__/┬█████◣       /┴█████████████◣
进一步验证该理论
public class ZipTest {
public static void main(String[] args) throws Exception {
ZipFile zip = new ZipFile(
"D:\\SYJ.WORK\\SYJ.WORKSPACE\\ws1\\cl2\\cl1.jar");
Enumeration entries = zip.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry) entries.nextElement();
System.out.println(entry.getName());
不加的情况META-INF/MANIFEST.MFtest/A.classtest/test.txt加了folder的情况META-INF/MANIFEST.MFtest/test/A.classtest/test.txt
可能很多人误会了,我觉得 xyz20003 并不像是傲慢的人。我一直觉得论坛这种文字交流很容易产生类似的误会。每个人有自己的风格,有人就是说话随便一点、风趣一点、调侃一点。同样的话,如果当面说,你知道他的语气,能看见他的表情,觉得很自然,可是落到纸面上,写成文字,读出来,就变味了。xyz20003 的开场白可能语气有些冲,后来的例子里又用了个不雅的文件名,其实,退一步讲,如果是办公室的同事跟你说这些,恐怕感觉上就没有这么刺激了。纵观本贴,xyz20003 是第一个试图开始实质性讨论的,后来的大段演讲也不像是抄现成的,可以说,他为本贴是很花了心思的。而且,从他的大段演讲里,我们也可以大致看得出来他的谈话风格。讲话的人多一些戒慎,听的人多一些宽容,和谐之道嘛,hehe
顶楼上哈哈,有啥说啥,比较直爽
引用 46 楼 bao110908 的回复:
呵呵,我说怎么用 Eclipse 打出来的包,跟其他的不一样呢? 原来,Eclipse 的 Export JAR 竟然把 Add directory entries 默认是未选中的,汗死~~ 不加入目录 entry 的功能在 jar 参数中并没有,可见 Eclipse 的 Export JAR 功能比较强大一些,呵呵,学习了。。。
直觉上,jar.exe 不至于缺少这种功能。试验了一下,发现其实是用法的问题。比如,我的文件系统如下:
+--Test1.class
+--Test2.class那么,如果我用这个命令,得到的 jar 里就是 含有 folder 的:...&jar cvf test.jar -C bin .标明清单(manifest)[color=#FF0000]增加:test/(读入= 0) (写出= 0)(存储了 0%)增加:test/Test1.class(读入= 769) (写出= 431)(压缩了 43%)增加:test/Test2.class(读入= 913) (写出= 526)(压缩了 42%)[/color]而如果我用下面这个命令,得到的 jar 里就是不包含 folder 的:...&jar cvf test.jar -C bin test/Test1.class -C bin test/Test2.class标明清单(manifest)增加:test/Test1.class(读入= 769) (写出= 431)(压缩了 43%)增加:test/Test2.class(读入= 913) (写出= 526)(压缩了 42%)
呵呵,学到不少东西,
而如果我用下面这个命令,得到的 jar 里就是不包含 folder 的:
...&jar cvf test.jar -C bin test/Test1.class -C bin test/Test2.class
标明清单(manifest)
增加:test/Test1.class(读入= 769) (写出= 431)(压缩了 43%)
增加:test/Test2.class(读入= 913) (写出= 526)(压缩了 42%)——————————————————————————————————得一个一个地添加,呵呵~
再来学习一下,顺便帮顶~
没有研究过楼主的问题,只知道实现具体的程序
继续学习...
引用 16 楼 caoyinghui1986 的回复:
果然都是高手. 纯学习. 帮顶..............
再来学习一下,顺便帮顶~
真是佩服各位的钻研精神学习了
查找带有给定名称的资源。查找与给定类相关的资源的规则是通过定义类的 class loader 实现的。此方法委托给此对象的类加载器。如果此对象通过引导类加载器加载,则此方法将委托给 ClassLoader.getSystemResource(java.lang.String)。
来晚了,先帮忙顶帖!
有收获,顶下不过我觉得xyz20003没有什么不好的意思,语气轻松,带点调侃而已,
很遗憾,我没看懂……偶会好好学习的!
to:maquan
对于你解释的xyz20003的人品,我一向是对事不对人,对人不对事。我不喜欢某种说话方式,可能我的话有些过
呵呵..我是见到牛人了.我对里面的牛人不发表任何看法.学习ing..帮顶.好贴呀...
再学习..我试着拿LZ的代码在机上运行.可是出来下面的结果
=====Test.Main=====
1 file:/G:/alking/test/build/classes/Test/
2 file:/G:/alking/test/build/classes/
3 file:/G:/alking/test/build/classes/
Exception in thread "main" java.lang.NoClassDefFoundError: test/A (wrong name: Test/A)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at Test.Main.main(Main.java:40)
Java Result: 1
呵呵..我用的是netbeans测试的...
在我本机上的测试结果:
java -jar cl2.jar调用**************************************************
[color=#FF6600]Failed to load Main-Class manifest attribute from
cl2.jar[/color]
将cl2.jar添加到CLASSPATH中
java csdn.clazz.cl2.Main调用**************************************************
=====wxxr.csdn.clazz.cl2.Main=====
1 jar:file:/G:/clazz/cl2.jar!/wxxr/csdn/clazz/cl2/
2 file:/G:/clazz/
3 file:/G:/clazz/
=====wxxr.csdn.clazz.cl1.A=====
1 jar:file:/G:/clazz/cl1.jar!/wxxr/csdn/clazz/cl1/
2 file:/G:/clazz/
3 file:/G:/clazz/
4 jar:file:/G:/clazz/cl1.jar!/wxxr/csdn/clazz/cl1/test.txt
=====org.gjt.mm.mysql.Driver=====
1 jar:file:/G:/clazz/mysql-connector-java-3.1.13-bin.jar!/org/gjt/mm/mysql/
2 file:/G:/clazz/
3 file:/G:/clazz/
G:\clazz&pause
标签不能嵌套使用……Failed to load Main-Class manifest attribute fromcl2.jar这句是什么意思呢?
刚才看到我的包名错了..呵呵..现在的结果
=====Test.Main=====
1 file:/G:/alking/test/build/classes/Test/
2 file:/G:/alking/test/build/classes/
3 file:/G:/alking/test/build/classes/
=====Test.A=====
1 file:/G:/alking/test/build/classes/Test/
2 file:/G:/alking/test/build/classes/
3 file:/G:/alking/test/build/classes/
ClassNotFoundoracle.jdbc.driver.OracleDriver
好贴,顶下!
caoyinghui1986 升星了,恭喜,恭喜!
哎,没看懂!希望有人可以为本贴做个总结,解决打包成jar文件的问题。用eclipse测试一个聊天程序通过了,打包之后就出现了一系列问题,现在是不知怎办好?看到有人说,打包进jar包里的文件,如txt格式的,就不能够对该文件进行写入操作了,不知道是不是这个的原因,导致打包之后的jar文件出现异常!

我要回帖

更多关于 优酷网电视剧 的文章

 

随机推荐