对clazz.getResource("")的困惑,请朋友们解惑,谢谢!

sunyujia 2008-05-20 09:54:55
节约时间,开门见山,不啰嗦了,看代码:
有两个jar包(必须打jar包来分析)
cl1.jar只要一个类外加一个没用内容的test.txt文件位于test包下

package test;
public class A {}

cl2.jar只要一个类

package test;

public class Main {
public static void println(Class clazz) {
System.out.println("=====" + clazz.getName() + "=====");
try {
System.out.println("1 " + clazz.getResource(""));
} catch (Exception e) {
System.out.println("1 error " + e.getMessage());
}
try {
System.out.println("2 " + clazz.getResource("/"));
} catch (Exception e) {
System.out.println("2 error " + e.getMessage());
}
try {
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);
try {
println(Class.forName("test.A"));
} catch (ClassNotFoundException e) {
System.out.println("ClassNotFound " + e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
try {
println(Class.forName("oracle.jdbc.driver.OracleDriver"));
} catch (ClassNotFoundException e) {
System.out.println("ClassNotFound" + e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
}
}


批处理
[code=BatchFile]
@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
pause
[/code]
输出
java -jar cl2.jar调用**************************************************
=====test.Main=====
1 null
2 null
3 null
4 null
ClassNotFound test.A
ClassNotFoundoracle.jdbc.driver.OracleDriver
将cl2.jar添加到CLASSPATH中
java test.Main调用**************************************************
=====test.Main=====
1 null
2 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 null
2 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

...全文
1991 76 打赏 收藏 转发到动态 举报
写回复
用AI写文章
76 条回复
切换为时间正序
请发表友善的回复…
发表回复
lazy_zc 2011-10-28
  • 打赏
  • 举报
回复
嗨,新人学习了!

有个问题想请教一下,我web项目需要获取jar中的一个文件,现有API的参数是File对象,我查了下没查到如何获取File对象,好像只能通过getResourceAsStream直接读取流,有没有办法能获得File对象呢(学习了半天如何从jar中获取相对路径,结果getFile()报错,真是郁闷那)
如果不行,只好改API了

谢谢
soulaxin 2011-06-06
  • 打赏
  • 举报
回复
哎,没看懂!希望有人可以为本贴做个总结,解决打包成jar文件的问题。
用eclipse测试一个聊天程序通过了,打包之后就出现了一系列问题,现在是不知怎办好?

看到有人说,打包进jar包里的文件,如txt格式的,就不能够对该文件进行写入操作了,不知道是不是这个的原因,导致打包之后的jar文件出现异常!
x_y_qing 2008-05-23
  • 打赏
  • 举报
回复
刚才看到我的包名错了..呵呵..现在的结果
=====Test.Main=====
1 file:/G:/alking/test/build/classes/Test/
2 file:/G:/alking/test/build/classes/
3 file:/G:/alking/test/build/classes/
4 null
=====Test.A=====
1 file:/G:/alking/test/build/classes/Test/
2 file:/G:/alking/test/build/classes/
3 file:/G:/alking/test/build/classes/
4 null
ClassNotFoundoracle.jdbc.driver.OracleDriver
lisl2003 2008-05-23
  • 打赏
  • 举报
回复
标签不能嵌套使用……
Failed to load Main-Class manifest attribute from
cl2.jar

这句是什么意思呢?
lisl2003 2008-05-23
  • 打赏
  • 举报
回复
在我本机上的测试结果:

java -jar cl2.jar调用**************************************************
Failed to load Main-Class manifest attribute from
cl2.jar

将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/
4 null
=====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/
4 null

G:\clazz>pause

hnjd314053754 2008-05-23
  • 打赏
  • 举报
回复
关注一下
x_y_qing 2008-05-23
  • 打赏
  • 举报
回复
再学习..我试着拿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/
4 null
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测试的...
x_y_qing 2008-05-23
  • 打赏
  • 举报
回复
呵呵..我是见到牛人了.我对里面的牛人不发表任何看法.学习ing..帮顶.好贴呀...
kokobox 2008-05-23
  • 打赏
  • 举报
回复
to:maquan

对于你解释的xyz20003的人品,我一向是对事不对人,对人不对事。我不喜欢某种说话方式,可能我的话有些过
lisl2003 2008-05-23
  • 打赏
  • 举报
回复
很遗憾,我没看懂……

偶会好好学习的!
qing14 2008-05-23
  • 打赏
  • 举报
回复
有收获,顶下
不过我觉得xyz20003没有什么不好的意思,语气轻松,带点调侃而已,
lisl2003 2008-05-23
  • 打赏
  • 举报
回复
来晚了,先帮忙顶帖!
night__cat 2008-05-23
  • 打赏
  • 举报
回复
查找带有给定名称的资源。查找与给定类相关的资源的规则是通过定义类的 class loader 实现的。此方法委托给此对象的类加载器。如果此对象通过引导类加载器加载,则此方法将委托给 ClassLoader.getSystemResource(java.lang.String)。
jdlsfl 2008-05-23
  • 打赏
  • 举报
回复
真是佩服各位的钻研精神
学习了
eagle_2008 2008-05-23
  • 打赏
  • 举报
回复
up
ThirdDimension 2008-05-23
  • 打赏
  • 举报
回复


再来学习一下,顺便帮顶~
sunyujia 2008-05-23
  • 打赏
  • 举报
回复
caoyinghui1986 升星了,恭喜,恭喜!
gabriel80 2008-05-23
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 caoyinghui1986 的回复:]
果然都是高手.
纯学习.
帮顶..............
[/Quote]
Shine_Panda 2008-05-23
  • 打赏
  • 举报
回复
继续学习...
qq278095755 2008-05-23
  • 打赏
  • 举报
回复
先学习...
加载更多回复(56)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧