转载:
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文件前带上其绝对的路径名。
分享到:
相关推荐
从StdIn读取scala代码,并将其反编译的Java版本写入StdOut。 用法 确保您已安装Java 1.8和Maven 检出项目 在项目目录中调用mvn clean package 。 在目标目录中scala-to-java.jar将创建scala-to-java.jar 使用java...
4. 用附件的dex2jar,在Windows命令行下运行 dex2jar classes.dex 5. 生成classes.dex.dex2jar.jar,这个就是转换后的JAR文件了 6. 执行jd-gui,找到刚才生成的JAR文件,打开之。 7. 偷偷乐吧,90%以上的Java源代码...
功能 小商城功能 首页 专题列表、专题详情 ...java -Dfile.encoding=UTF-8 -jar litemall-all/target/litemall-all-0.1.0-exec.jar 启动管理后台前端 打开命令行,输入以下命令 npm install -g c
按照步骤完成命令行方式下Hadoop MR程序的编辑,编译,运行过程。 1)编辑java文件 可以采用任意的文本工具编辑Java代码 2)编译javac (1)设置CLASSPATH (2)编译java文件 (3)打jar包 4)执行 bin/hadoop jar ...
仅运行名称与“ Pregen ”匹配的基准测试(区分大小写): java -jar target/benchmarks.jar "Pregen" -t 4 -f 2 -i 10 -wi 5 列出与模式匹配的所有基准测试: java -jar target/benchmarks.jar "Pregen" -l ...
我们知道,Java是一种跨平台的编程语言,其源码(.java文件)被编译成与平台无关的字节码(.class文件),然后在运行期动态链接。这样,编译后的类文件中将包含有符号表,从而使得Java程序很容易被反编译。相信每一个...
可以先通过搭建好的Eclipse开发环境创建一个未编译的Android工程,记的一定要将Eclipse中Project菜单下的Build Automatically选项前面的对勾去掉后再去创建工程。创建好未编译的工程后,在命令行中输入如下命令: d:...
我们知道,Java是一种跨平台的编程语言,其源码(.java文件)被编译成与平台无关的字节码(.class文件),然后在运行期动态链接。这样,编译后的类文件中将包含有符号表,从而使得Java程序很容易被反编译。相信每一个...
从命令行运行它: java -jar appcontext.jar --source=path/to/src --package=com.example.foo --package=com.example.bar 它创建: 每个公共类的元素 每个公共字段和公共设置方法的元素。 元素的列表,如果(1)...
要创建 webapp 运行: $ mvn package这会将 Web 应用程序编译并打包为.war ,它可以部署到任何 Web 服务器,例如 Tomcat。 它还构建了一个 jar 来以独立模式启动应用程序: $ java -cp "target/JavaHandler/WEB-INF...
Java 2实用教程(第三版)实验指导与习题解答 清华大学出版社 (编著 耿祥义 张跃平) 实验模版代码 建议使用文档结构图 (选择Word菜单→视图→文档结构图) 上机实践1 初识Java 4 实验1 一个简单的应用程序 ...
GBIF 科学名称解析器库的 Java 命令行界面 #NameParser 实现创建了一个名为 Impl 的包,其中将有一个类将使用 nameparser 库并将从传递的参数创建所需的 json 输出。 #Developers 安装 jdk 1.7.0 安装 Maven ...
您可以使用Java 1.8编译和运行Sprout Life 可执行文件SproutLife.jar或源代码。 通过在桌面上打开文件或使用以下命令行来运行SproutLife.jar : java -jar -Xmx2g SproutLife.jar 编译并运行: 并按照 mvn ...
Clone本项目,在命令行执行 mvn test 能成功运行并测试通过 使用IntelliJ IDEA将本项目作为一个新的Maven项目导入并成功编译 使用 mvn test 命令可以运行全部测试 使用 mvn clean package 命令可以清理、编译并打包...
Clone本项目,在命令行执行 mvn test 能成功运行并测试通过 使用IntelliJ IDEA将本项目作为一个新的Maven项目导入并成功编译 使用 mvn test 命令可以运行全部测试 使用 mvn clean package 命令可以清理、编译并打包...
Todo演示Web应用该存储库包含一个小的Todo列表Web... 如果您想编译并从命令行运行,则假设您已安装Maven命令行: mvn packagejava -jar target/todoapp1-1.0-SNAPSHOT.jar 现在,只需将浏览器指向即可使用该应用程序。
#Weka和清道夫 Weka的weka.experiment.CrossValidationResultProducer的版本,它使用清除剂。 每个折叠将并行执行,并且结果...###从命令行运行 对于以下命令,类路径应包含dist / <version> / <version> .jar和lib /
蝙蝠笔试题java 适合 系统要求 FITS 是一个 Java 程序,需要 Java 1.8 或更高版本。 要找出您的 Java 版本,请在命令行窗口中键入 java -version。 建立适合 从 1.3.0 版开始,FITS 是使用 . 构建工件是 fits-.jar ...
Clone本项目,在命令行执行 mvn test 能成功运行并测试通过 使用IntelliJ IDEA将本项目作为一个新的Maven项目导入并成功编译 使用 mvn test 命令可以运行全部测试 使用 mvn clean package 命令可以清理、编译并打包...