- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
命令行式下java?package的编译与运行??
2009-12-26 09:19:27|??分类:? HYPERLINK /jiangmc@yeah/blog/ \l m=0t=1c=fks_087070083095081071083081081095085084087070093086094075081 \o Java Java?|字号?订阅
这几天遇到了java的package问题(这种问题只是在cmd命令行模式下会遇到,如果用eclipse就不会有这种问题),把java中的package编译运行的问题总结一下,作为备忘。
??? 首先,如果你有两个类:
?? (1)A.java
??????? import edu.ustc.*;
??????? public class A{????????? public static void main(String[] args){??????????? B b = new B();??????????? b.print();????????? }??????? }
?? (2)B.java
??????? package edu.ustc;
??????? public class B{????????? public void print(){??????????? System.out.println(hello);????????? }?????? }
??? 由于java中有类似于make的功能,而且A中引用了B,所以不需要对B进行单独的编译,对A进行编译的时候会自动生成B的class文件,但是这里要注意组织A.java和B.java的文件位置。比如说,A.java放在F:\test目录下,那么B.java需要放在F:\test\edu\ustc目录下,只有这样才能找到B(根据B所在的包名从当前目录开始需找B)。
??? 接下来,再把问题变一下,如果A也在某一个包中,即把A.java变为:
??????? package edu.main;
??????? import edu.ustc.*;
??????? public class A{????????? public static void main(String[] args){??????????? B b = new B();??????????? b.print();????????? }??????? }
?? 会发生什么变化呢?根据上面得出的结论,编译器往往从当前目录下开始,根据类的package名称来搜索文件,所以我们应该把A.java放在F:\test\edu\main目录下,并在F:\test下运行javac A.java命令,这样就可以找到A.java文件了吧,可惜事与愿违,编译报错,找不到源文件!!!
??? 这是为什么呢?因为上面可以根据包名找B.java是使用了编译器自带的make功能,而这里我们直接编译A.java,没有这个功能,也就是说直接编译的时候不能根据包名找到相关的类,那我们该怎么办呢?
??? 其实解决方案很简单,既然编译器不能根据包名找到A类,那我们就把A类的绝对路径直接告诉编译器不就可以了吗?事实上就是这么做的,具体操作为:在命令行模式下进入F:\test目录,然后运行编译命令javac F:\test\edu\main\A.java,可以成功编译生成A.class文件。(注意:如果不在此目录下执行编译命令的话,就要将f:\test加入到当前的classpath中为make工具提供B.java的位置信息)
???? 接下来就要运行这个class文件了,运行仍然在F:\test目录下执行(注意:如果不在此目录下执行运行命令的话,一定要把F:\test加入到当前的classpath中),命令为:java?edu.main.A,很显然,这里就是根据输入的package名称找到对应的class文件,并检验找到的class文件的与输入的包名是否匹配(例如:如果你在edu目录下新建一个test目录,将A.class文件拷贝进去,输入java?edu.test.A 的话还是会报错:找不到class文件)。可能有人要问:为什么运行的时候又可以根据包名找到相应的class文件呢?因为运行的时候默认是从当前路径开始搜索的,如果当前路径找不到的话,就在系统的classpath中找,如果再找不到就会报错。
???? 由上面的分析我们可以得出:
???? (1)在命令行模式下编译java文件时,如果cmd不在该java文件所在的目录下,就要直接指定文件?的绝对路径(javac F:\test\edu\main\A.java),如果在java文件所在的目录下,可以不指定
文档评论(0)