摘要
本文主要介绍javac和java这两个命令工具的用法。至于jdk环境的安装和配置本文不做讲述。阅读完本文,你应该具备不通过IDE工具就能够编译执行JAVA程序。
JAVAC的用法
- 作用
javac主要是将java源码文件(后缀是.java)编译成跨平台的字节码文件(后缀是.class)。 - 常见选项
可以输入javac -help查看有哪些选项
用法: javac <options> <source files>
其中, 可能的选项包括:
-verbose 输出有关编译器正在执行的操作的消息
-classpath <路径> 指定查找用户类文件和注释处理程序的位置
-cp <路径> 指定查找用户类文件和注释处理程序的位置
-sourcepath <路径> 指定查找输入源文件的位置
-bootclasspath <路径> 覆盖引导类文件的位置
-extdirs <目录> 覆盖所安装扩展的位置
-processorpath <路径> 指定查找注释处理程序的位置
-parameters 生成元数据以用于方法参数的反射
-d <目录> 指定放置生成的类文件的位置
-encoding <编码> 指定源文件使用的字符编码
-version 版本信息
-help 输出标准选项的提要
-X 输出非标准选项的提要
- 现学现用
- 首先我在我的磁盘目录D:\tmp\com\alibaba\jdk下创建了两个JAVA源文件,一个是Schedule.java文件,另外一个是ExecutorMark.java,并借助IDE工具编写代码。源文件代码见篇尾附录。
- 编译源代码
javac -verbose -cp "d:\tmp\jvm\guava-22.0.jar" -d "d:\tmp\target" d:\tmp\com\alibaba\jdk\Schedule.java d:\tmp\com\aliaba\jdk\ExecutorMark.java
说明:
- -cp选项同classpath,表示指定类加载路径,这里需要使用谷歌的guava库。
- -d选项表示指定编译后的字节码文件存储目录。
- 此命令一次可编译多个源代码文件,源码文件可以使用相对路径,也可以使用绝对路径。
- 注意指定源码路径时,要带上文件后缀(.java)。
- 编译完成后,检查d:\tmp\target目录,可以发现多了一个目录com\alibaba\jdk,进入相应目录会发现多了两个字节码文件。
JAVA的用法
- 作用
java命令会启动一个jvm,装载类路径下的字节码文件,并运行主程序(带有main方法的执行类)。 - 常见选项
用法: java [-options] class [args...]
其中选项包括:
-cp <目录和 zip/jar 文件的类搜索路径>
-classpath <目录和 zip/jar 文件的类搜索路径>
用 ; 分隔的目录, JAR 档案和 ZIP 档案列表, 用于搜索类文件。
-D<名称>=<值> 设置系统属性
-verbose:[class|gc|jni] 启用详细输出
-? -help 输出此帮助消息
-X 输出非标准选项的帮助
- 现学现用
- 可以使用cd命令切换到编译后的类文件目录,当然也可以不切换。不切换时,必须使用-cp选项指定类文件路径。
- 执行java命令
java -verbose -cp "d:\tmp\target;d:\tmp\jvm\guava-22.0.jar" com.alibaba.jdk.ExecutorMark
说明:
- -cp选项指定类文件路径,如果还有其他jar包依赖,则可以使用分号连接。
- 此命令只能传入一个主类文件,并且要写主类程序的包路径(不同于javac命令下的真实磁盘路径)。
- 和javac命令不同,指定主类程序包路径时不需要带上任何后缀。
- 程序执行结果
- 其他错误
当出现如下错误时,表示类路径没有指定guava-22.0.jar或者jar包的位置不正确。
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/util/concurrent/ThreadFactoryBuilder
at com.alibaba.jdk.ExecutorMark.main(ExecutorMark.java:19)
Caused by: java.lang.ClassNotFoundException: com.google.common.util.concurrent.ThreadFactoryBuilder
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 1 more
附录
- 源码文件Schedule.java代码如下:
package com.alibaba.jdk;
public class Schedule implements Runnable{
private String command;
public Schedule(String command){
this.command = command;
}
@Override
public void run() {
for(int i = 1; i<=10 ; i +=1){
System.out.println("this is " + i + " output, " + command + ".");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
- 源码文件ExecutorMark.java代码如下:
package com.alibaba.jdk;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy;
import java.util.concurrent.TimeUnit;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.alibaba.jdk.Schedule;
public class ExecutorMark {
public static void main(String[] args){
ThreadPoolExecutor executor = new ThreadPoolExecutor(4, 8,
60L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10),
new ThreadFactoryBuilder().build(), new CallerRunsPolicy());
executor.submit(new Schedule("javac"));
executor.submit(new Schedule("java"));
executor.submit(new Schedule("javap"));
executor.submit(new Schedule("javadoc"));
executor.submit(new Schedule("jconsole"));
executor.submit(new Schedule("jvisualvm"));
executor.submit(new Schedule("javaw"));
executor.submit(new Schedule("jstate"));
executor.submit(new Schedule("jar"));
executor.submit(new Schedule("curl"));
executor.submit(new Schedule("awk"));
executor.submit(new Schedule("crontab"));
executor.submit(new Schedule("screen"));
executor.submit(new Schedule("mvn"));
executor.submit(new Schedule("mysql"));
executor.submit(new Schedule("keytool"));
executor.shutdown();
}
}