云梦南飞's profile云梦南飞PhotosBlogLists Tools Help
Photo 1 of 19

云梦南飞

Location
Interests

云梦南飞

High
July 02

命令行式下java package的编译与运行(转载)

这几天遇到了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文件所在的目录下,可以不指定
          路径,但是要设置classpath让编译器的make工具找到其他import的类
     (2)运行的时候要指出包路径(java edu.main.A),并且一定要在class文件名前带上完整的包名
         (edu.main.A),而且该包所在的文件夹(即edu所在的文件夹)一定要在classpath中,这样才
          能找到对应的class文件(在包所在的文件夹目录下运行cmd程序或者将该目录加入到classpath
          中均可)。
     (3)在命令行模式下非直接编译的java,编译器使用make工具根据java文件中的import信息间接找
          到引用的java文件,所以一定要注意文件的配置,以及相互之间的位置关系。当然也可以通过
          设置classpath提供给make工具,但是如果文件比较多而且相互之间的引用关系比较复杂的话会
          比较麻烦。
     (4)classpath只能供make工具以及运行class文件时使用,在直接编译的时候不使用classpath信
          息,必须在要编译的java文件前带上其绝对的路径名。
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hittata/archive/2009/06/01/4231276.aspx
April 19

无题

以前总觉得自己是个很坚强的人,看电影时很少落泪
不知道从什么时候起,发现眼泪越来越浅
现在一点点敏感细腻的镜头的都会让我泪眼哗哗
 
有时候一个人坐在那里,想着想着就会泪眼朦胧
是因为太苦了吗
我想不是的
是因为太甜了吗
我想也不是的
生活总不会是那么极端的苦与甜
 
那眼泪就是因为我开始会感触生活了吧
 
 
March 09

新作的珠帘

Mardi Gras 的时候弄了好多珠子,满满的装了一大篮子,昨天觉得好玩,就打算用珠子来做个门帘,没想到效果还真不错。
 

 
 
February 19

不期望就没有失望

生活原来真的不是这么容易,这个世界谁都不能让人无条件的依靠,除了父母。
原本以为可以找一个温暖,让人依靠的地方,就算日子不富裕,互相扶持,互相信任,互相关心,也能过的开心
也许是我有太多的期望,所以就有了如此多的失望与伤心
 
 
 
 
 
November 18

油条做法

某人说想念国内的油条+豆浆,很久没有吃过油条了,于是我have a try
去WalMart 买了baking  soda, 倒腾了很久,结果炸出来的油条像一根根棍子一样,sigh~~~
上网一搜原来只放baking soda还不行,必须用baking powder,再买再试,呵呵

P7160015_JPG_thumb

 
 
 
P7160019_JPG_thumb
 
 
Lists