java和javac编译运行java程序
2015-08-06 20:59
549 查看
目录
目录前言
编译命令介绍
javac
java
代码编译与运行
java类发现规则
分离class和java文件
参考链接
前言
给自己定了一个月学习JVM虚拟机的计划,不管有没有卵用,学点新东西总是好的。但是在学习过程中,我想在命令行测试一些JVM参数的时候,发现自己脱离了IDE,竟然无法直接编译java程序!!
我的原则不能抱怨太多,像个Loser,不会的就花时间补回来。
下面,主要是总结一些如何在命令行中编译java程序。主要是想记录总结一下java的类发现原则。
编译命令介绍
其实,java编译过程主要使用了javac和java两个命令。这里先介绍一下这两个命令的使用方法。javac
javac用于将java文件编译成byte-code class文件。使用方法如下:javac [ options ] [ sourcefiles ] [ classes ] [ @argfiles ]
其中options有几个关键参数:
-d:指定编译成的class文件的存放位置。默认情况下,编译生成的class文件和源java文件在同一目录下。
-classpath(-cp):用于搜索编译所需要的class文件,指出编译所用到的class文件的位置。
java
java用于执行程序,格式如下:java [options] classfile
其中,options一般需要指定-classpath参数,用于指定要执行的文件所在的位置以及需要用到的类的路径。
代码编译与运行
这里介绍一个带package的测试用例。以前大家在学习javac编译的时候,都是在默认包下进行的编译,一般不会出问题,但是遇到带package的类就不一样了。示例目录结构如下:
其中,src是默认的package目录。我们在src/jvm目录下增加两个测试文件,内容如下:
src/jvm/CompileClass.java
package jvm; public class CompileClass { public static void main(String[] args) { TestClass1 mTestClass1 = new TestClass1(); mTestClass1.sayHello(); } }
src/jvm/TestClass1.java
package jvm; public class TestClass1 { public void sayHello() { System.out.println("Hello World!"); } public static void main(String[] args) { TestClass1 mTestClass1 = new TestClass1(); mTestClass1->sayHello(); } }
这时,如果直接在src/jvm目录下,用javac编译CompileClass,报错如下:
我想平时大家写完这么简单的代码,用Ecplise点一下run按钮是不可能遇到这种问题的。那之所以会遇到这个问题,就是由于Ecplise这种编译器替我们掩盖了java是有类发现规则的。
java类发现规则
要想成功的编译和执行java文件,是需要有classpath和包名的共同配合。我们先尝试禁用一下classpath,禁用的方法是在运行javac的时候,指定
-classpath ""。
在src/jvm目录下,我们禁用classpath,编译TestClass1.java:
javac -classpath "" TestClass1.java
大家执行之后,发现是可以编译通过的(至于能否执行大家先不要在意)。
但是,同样在src/jvm目录下,我们禁用classpath去编译CompileClass.java,是无法编译通过的,编译错误和之前是一样的。之所以ComplieClass.java无法编译通过,是因为ComplieClass.java的源码中调用了TestClass1这个类,而禁用掉classpath之后,javac无法找到TestClass1了。由此,我们可以总结出如下规律:
当你需要编译(或执行)的类A引用了其他的类如B时,编译器需要在-classpath指定的目录下去找B。
当类B中也指定了package时,那B的路径path=classpath + “/” + package(将所有的”.”转换为”/”)。
因此,在src/jvm目录下,为了能让ComplieClass.java在编译时能够找到TestClass1这个类,我们需要这样设置classpath:
javac -classpath ".." CompileClass.java
执行的时候,命令如下:
java -classpath ".." jvm.CompileClass
分离.class和.java文件
在了解了java类发现规则之后,我们应该再去优化一下我们的编译方法。参考Eclipse,它在java项目的根目录下,分别创建了一个src目录和一个bin目录。其中:
src目录:存放所有的.java文件。
bin目录:存放所有的编译出来的.class文件。
我们可以很轻松的通过-d参数指定目录实现该功能。并且,当我们这么做的时候,bin目录生成的.class文件都保持了src目录的相应结构,我们就不用再去费心考虑classpath查找类的问题了。
示例过程如截图所示:
参考链接
[1] Mastering the JAVA CLASSPATH相关文章推荐
- windows命令行中java和javac、javap使用详解(java编译命令)
- javac 多个jar文件 用封号 隔开
- Javac命令的使用
- IntelliJ IDEA编译Android项目比Eclipse慢
- 亲测!JDK环境变量设置——或找不到或无法加载主类con.sun.tools.javac.Main的问题解决
- Android NDK 学习笔记
- ant——调用java程序
- javac 编译带有package的类
- 错误:仅当显式请求注释处理时才接受类名称‘HelloWorld’1 个错误
- IntelliJ IDEA编译Android项目比Eclipse慢
- 2014.2.21 mac OS terminal 编译运行 C 和 java 程序的指令
- Ant 对java webapp打包war 的配置
- 命令行执行class文件和jar文件
- Classpath 设置了但是找不到包?
- Java学习_02_JDK环境配置、测试、…
- Eclipse “cannot be resolved to a type” error
- Java报错No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing
- Java中Could not find the main class.program will exit和java.lang.UnsupportedClassVersionError 的解决方法
- 【深入Java虚拟机】之七:Javac编译与JIT编译
- 职场菜鸟初窥Ant