`
nocohol
  • 浏览: 49846 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

命令行式下java package的编译与运行

    博客分类:
  • J2SE
阅读更多
转载:http://blog.csdn.net/hittata/archive/2009/06/01/4231276.aspx

命令行式下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文件前带上其绝对的路径名。
分享到:
评论
2 楼 hnlgzml 2011-11-26  
这个文章总结得很好,对于初学者来说如果能如果能逐个试验,相信收获会很多,对java javac的理解也深入了,下面给出我的理解:
javac和java的classpath参数的含义是不一样的,javac中其含义是指定引入类的位置(jar包所在目录或class所在位置去掉包路径后的目录),和java源文件的路径没有关系;而java命令此参数不仅可以指定类目录还能指定class文件的目录。

拿楼主的第一个例子来试验:
A.java的位置为c:\
B.java的位置为c:\test\edu\ustc

CMD在D:\目录时,运行javac -classpath "c:\test" c:\A.java可以编译A.java(同时也编译了B.java),但是运行javac -classpath "c:\;c:\test" A.java时提示找到不A.java。因此正楼主所说,编译文件时需要指定java文件的绝对路径(原因就在于javac的classpath不能用来指定java文件的路径)。
CMD在D:\目录时,运行java -classpath "c:\;c:\test" A正常,运行java -classpath "c:\test" c:\A出现错误
别外,如果A有自己的包路径,则需要运行javac -classpath "c:\;c:\test" edu.main.A
1 楼 hnlgzml 2011-11-26  
这个文章总结得很好,对于初学者来说如果能如果能逐个试验,相信收获会很多,对java javac的理解也深入了,下面给出我的理解:
javac和java的classpath参数的含义是不一样的,javac中其含义是指定引入类的位置(jar包所在目录或class所在位置去掉包路径后的目录),和java源文件的路径没有关系;而java命令此参数不仅可以指定类目录还能指定class文件的目录。

拿楼主的第一个例子来试验:
A.java的位置为c:\
B.java的位置为c:\test\edu\ustc

CMD在D:\目录时,运行javac -classpath "c:\test" c:\A.java可以编译A.java(同时也编译了B.java),但是能不能将A.java的目录位置加到classpath中呢?即运行javac -classpath "c:\;c:\test" A.java,结果提示找到不A.java。因此正楼主所说,编译文件时需要指定java文件的绝对路径(原因就在于classpath不能指定java文件的路径参数)。
而执行是运行javac -classpath "c:\;c:\test" A才可以,不能运行java -classpath "c:\test" c:\A,如果A有自己的包路径,则需要运行javac -classpath "c:\;c:\test" edu.main.A

相关推荐

    命令行编译和运行java类

    在日常的软件开发过程中,开发者经常会遇到需要在命令行环境下编译和运行Java程序的情况。本文将详细介绍如何在DOS(Disk Operating System)环境下,通过命令行工具编译和运行Java程序。 #### 创建目录结构 在...

    dos命令测试java jar文件 命令行下运行JUnit测试 命令运行java

    这里我们主要探讨如何使用DOS命令来测试Java JAR文件,以及如何在命令行下运行JUnit测试。这是一项基础但至关重要的技能,因为通过命令行工具可以高效地自动化测试和调试代码。 首先,让我们了解Java JAR文件。JAR...

    java命令行编译全

    本文将深入探讨如何在命令行环境下编译和运行包含包结构的Java程序。 首先,Java中的包(package)是用来组织类的一种方式,它帮助避免命名冲突并提供更好的代码管理。例如,在给定的例子中,我们有两个类——`A....

    java的编译路径与运行路径

    当你直接用`javac`命令编译单个源文件时,例如`javac HelloWorld.java`,编译后的类文件(HelloWorld.class)将被创建在与源文件相同的目录下。如果源文件包含`package`声明,例如`package com.test;`,那么`javac`...

    java程序命令行下的执行

    通过上述分析,我们可以看出,在命令行下编译和运行Java程序时,需要注意以下几个关键点: - 确保源文件的位置与声明的包结构一致。 - 正确地使用 `javac` 和 `java` 命令,包括指定类路径等参数。 - 对于复杂的项目...

    命令行下jar打包及运行

    通过以上步骤,我们不仅学习了如何在命令行环境下编译Java源代码、创建JAR文件,而且还掌握了如何通过修改`Manifest`文件来让JAR文件能够直接运行。这种方法对于那些需要频繁构建和部署的应用来说非常实用,同时也...

    DOS命令运行和编译带有package包名的java程序

    在本文中,我们将深入探讨如何在DOS命令行环境下运行和编译带有包名的Java程序。这个过程涉及几个关键步骤,包括代码编写、编译和执行,以及对Java编程和DOS命令的理解。 首先,我们需要创建Java源代码文件。在...

    DOS环境下带有自定义包的java程序的编译与运行

    在DOS环境下编译和运行带有自定义包的Java程序是一项基础但重要的技能,尤其对于初学者来说。本文将详细讲解这个过程,并提供一些关键点和注意事项。 首先,理解Java的包(Package)机制至关重要。包是Java的一种...

    关于含有包的java类编译

    在Java编程中,"包"(Package)是一种组织和管理类的方式,它使得代码更加有条理,并且能够避免命名冲突。本篇文章将详细介绍如何编译含有包的Java类,...通过以上步骤,你就可以成功地编译和运行含有包的Java类了。

    java教程之java程序编译运行图解(java程序运行)

    ### Java程序编译与运行 Java是一种跨平台的编程语言,其源代码文件后缀为.java。一个Java程序要运行,需要经历编译和运行两个基本步骤。首先,Java源代码会被编译成Java字节码,这是一种中间表示,可以在任何安装...

    最新版java反编译eclipse插件

    jad.exe是JAD(Java Decompiler)的命令行工具,它能够将字节码反编译为接近原始的Java源代码。JAD是一个开源项目,它的目标是提供一个高效的反编译解决方案,以便开发者可以查看和理解非公开的或丢失源代码的类库。...

    Java JDK 配置;Java全编译

    ### Java JDK配置与全编译详解 #### 一、引言 对于初学者而言,Java的初次接触往往伴随着不少挑战,尤其是配置环境和编译运行第一个程序的过程中遇到的各种错误信息,常常令人感到困惑甚至沮丧。本文旨在通过详细的...

    java反编译工具,Eclipse反编译插件

    Java的源代码被编译成字节码,这是一种中间语言,可以在任何支持Java虚拟机(JVM)的平台上运行。然而,字节码并不直接对应于源代码,因此无法直接阅读。这就需要反编译工具,如JAD (Java Decompiler)、FernFlower、...

    用命令编译运行包java源代码.docx

    ### 使用命令行编译与运行Java源代码 #### 一、环境配置与基本概念 在开始之前,我们首先需要了解一些基本的概念以及如何配置环境。 **1. Java环境配置** 确保已经安装Java Development Kit(JDK),并设置好`...

    windows命令行中java和javac、javap使用详解(java编译命令)

    总结来说,要利用Windows命令行正确地编译、运行和反编译Java类文件,需要了解命令行的基本操作,正确安装和配置JDK,以及熟悉javac、java和javap这三个命令的具体选项和使用场景。通过这样的过程,我们可以更深入地...

    Java深入历险(CH_05.package_与import_机制)

    1. **环境配置**:在使用命令行编译和运行Java程序之前,需要确保环境变量设置正确。例如,通过设置`path`环境变量指向`JDK`的`bin`目录,使得`javac`和`java`命令可以在命令行中直接调用。 2. **编译过程**:当...

    java 反编译 工具包

    由于Java的字节码是中间表示,因此反编译的结果可能不会完全与原始源代码相同,特别是在方法体内部的优化和匿名类的情况下。但通常情况下,反编译结果可以提供足够的信息理解代码逻辑。 5. **反编译工具的使用场景*...

    javaSE的import要点和packet下类的编译和运行.doc

    1. **编译**:在命令行环境下,如果`Test.java`的头部有`package`声明(例如`package com.day6;`),我们需要使用`javac`命令指定目标目录。编译命令如下: ``` javac -d . Test.java ``` `-d .`参数表示将生成...

    eclipse打开java类编译后的class文件所在目录

    当我们编写并运行Java程序时,Eclipse会自动编译源代码(.java文件)为字节码(.class文件)。这些.class文件是Java虚拟机(JVM)执行的二进制代码,它们被存储在特定的目录结构中。了解如何在Eclipse中找到这些编译...

Global site tag (gtag.js) - Google Analytics