`
nocohol
  • 浏览: 49184 次
  • 性别: 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

相关推荐

    scala-to-java:将Scala代码转换为Java代码的命令行工具

    从StdIn读取scala代码,并将其反编译的Java版本写入StdOut。 用法 确保您已安装Java 1.8和Maven 检出项目 在项目目录中调用mvn clean package 。 在目标目录中scala-to-java.jar将创建scala-to-java.jar 使用java...

    android反编译(dex2jar.zip)

    4. 用附件的dex2jar,在Windows命令行下运行 dex2jar classes.dex 5. 生成classes.dex.dex2jar.jar,这个就是转换后的JAR文件了 6. 执行jd-gui,找到刚才生成的JAR文件,打开之。 7. 偷偷乐吧,90%以上的Java源代码...

    java实现商城后台管理系统+H5端+小程序端+api后端接口(vue、java、springboot、mysql)

    功能 小商城功能 首页 专题列表、专题详情 ...java -Dfile.encoding=UTF-8 -jar litemall-all/target/litemall-all-0.1.0-exec.jar 启动管理后台前端 打开命令行,输入以下命令 npm install -g c

    云计算技术实验报告三运行Hadoop MapReduce程序

    按照步骤完成命令行方式下Hadoop MR程序的编辑,编译,运行过程。 1)编辑java文件 可以采用任意的文本工具编辑Java代码 2)编译javac (1)设置CLASSPATH (2)编译java文件 (3)打jar包 4)执行 bin/hadoop jar ...

    java-uuid-validation-benchmark:Java 中的微基准 UUID 验证正则表达式

    仅运行名称与“ Pregen ”匹配的基准测试(区分大小写): java -jar target/benchmarks.jar "Pregen" -t 4 -f 2 -i 10 -wi 5 列出与模式匹配的所有基准测试: java -jar target/benchmarks.jar "Pregen" -l ...

    java 混淆工具,不可逆 jocky 也许是最好的了

    我们知道,Java是一种跨平台的编程语言,其源码(.java文件)被编译成与平台无关的字节码(.class文件),然后在运行期动态链接。这样,编译后的类文件中将包含有符号表,从而使得Java程序很容易被反编译。相信每一个...

    android的编译和运行过程深入分析

    可以先通过搭建好的Eclipse开发环境创建一个未编译的Android工程,记的一定要将Eclipse中Project菜单下的Build Automatically选项前面的对勾去掉后再去创建工程。创建好未编译的工程后,在命令行中输入如下命令: d:...

    jocky 混肴编译rar包(ant和插件俩个版本)

    我们知道,Java是一种跨平台的编程语言,其源码(.java文件)被编译成与平台无关的字节码(.class文件),然后在运行期动态链接。这样,编译后的类文件中将包含有符号表,从而使得Java程序很容易被反编译。相信每一个...

    app+java+源码-Spring-Application-Context-Generator:从Java类的源代码生成SpringXML应

    从命令行运行它: java -jar appcontext.jar --source=path/to/src --package=com.example.foo --package=com.example.bar 它创建: 每个公共类的元素 每个公共字段和公共设置方法的元素。 元素的列表,如果(1)...

    pericles-java-handlers:用于管理命令行进程的 Handler 服务的 Java 实现

    要创建 webapp 运行: $ mvn package这会将 Web 应用程序编译并打包为.war ,它可以部署到任何 Web 服务器,例如 Tomcat。 它还构建了一个 jar 来以独立模式启动应用程序: $ java -cp "target/JavaHandler/WEB-INF...

    Java 2实用教程(第三版)实验指导与习题解答

    Java 2实用教程(第三版)实验指导与习题解答 清华大学出版社 (编著 耿祥义 张跃平) 实验模版代码 建议使用文档结构图 (选择Word菜单→视图→文档结构图) 上机实践1 初识Java 4 实验1 一个简单的应用程序 ...

    name-parser-cli:GBIF 科学名称解析器库的 Java 命令行界面

    GBIF 科学名称解析器库的 Java 命令行界面 #NameParser 实现创建了一个名为 Impl 的包,其中将有一个类将使用 nameparser 库并将从传递的参数创建所需的 json 输出。 #Developers 安装 jdk 1.7.0 安装 Maven ...

    SproutLife:Conway的人生游戏的进化版

    您可以使用Java 1.8编译和运行Sprout Life 可执行文件SproutLife.jar或源代码。 通过在桌面上打开文件或使用以下命令行来运行SproutLife.jar : java -jar -Xmx2g SproutLife.jar 编译并运行: 并按照 mvn ...

    guess-number-java

    Clone本项目,在命令行执行 mvn test 能成功运行并测试通过 使用IntelliJ IDEA将本项目作为一个新的Maven项目导入并成功编译 使用 mvn test 命令可以运行全部测试 使用 mvn clean package 命令可以清理、编译并打包...

    guess_number_java

    Clone本项目,在命令行执行 mvn test 能成功运行并测试通过 使用IntelliJ IDEA将本项目作为一个新的Maven项目导入并成功编译 使用 mvn test 命令可以运行全部测试 使用 mvn clean package 命令可以清理、编译并打包...

    assignment_1_oose:OOSE的第一次任务,野兔和猎犬

    Todo演示Web应用该存储库包含一个小的Todo列表Web... 如果您想编译并从命令行运行,则假设您已安装Maven命令行: mvn packagejava -jar target/todoapp1-1.0-SNAPSHOT.jar 现在,只需将浏览器指向即可使用该应用程序。

    WekaUsingScavenger

    #Weka和清道夫 Weka的weka.experiment.CrossValidationResultProducer的版本,它使用清除剂。 每个折叠将并行执行,并且结果...###从命令行运行 对于以下命令,类路径应包含dist / <version> / <version> .jar和lib /

    bat笔试题java-fits:文件信息工具集

    蝙蝠笔试题java 适合 系统要求 FITS 是一个 Java 程序,需要 Java 1.8 或更高版本。 要找出您的 Java 版本,请在命令行窗口中键入 java -version。 建立适合 从 1.3.0 版开始,FITS 是使用 . 构建工件是 fits-.jar ...

    java_guess_number:TDD猜测的Java数量

    Clone本项目,在命令行执行 mvn test 能成功运行并测试通过 使用IntelliJ IDEA将本项目作为一个新的Maven项目导入并成功编译 使用 mvn test 命令可以运行全部测试 使用 mvn clean package 命令可以清理、编译并打包...

Global site tag (gtag.js) - Google Analytics