JAVA命令行的常见用法

摘要

本文主要介绍javac和java这两个命令工具的用法。至于jdk环境的安装和配置本文不做讲述。阅读完本文,你应该具备不通过IDE工具就能够编译执行JAVA程序。

JAVAC的用法

  • 作用
    javac主要是将java源码文件(后缀是.java)编译成跨平台的字节码文件(后缀是.class)。
  • 常见选项
    可以输入javac -help查看有哪些选项
用法: javac   
其中, 可能的选项包括:
  -verbose                   输出有关编译器正在执行的操作的消息
  -classpath <路径>            指定查找用户类文件和注释处理程序的位置
  -cp <路径>                   指定查找用户类文件和注释处理程序的位置
  -sourcepath <路径>           指定查找输入源文件的位置
  -bootclasspath <路径>        覆盖引导类文件的位置
  -extdirs <目录>              覆盖所安装扩展的位置
  -processorpath <路径>        指定查找注释处理程序的位置
  -parameters                生成元数据以用于方法参数的反射
  -d <目录>                    指定放置生成的类文件的位置
  -encoding <编码>             指定源文件使用的字符编码
  -version                   版本信息
  -help                      输出标准选项的提要
  -X                         输出非标准选项的提要
  • 现学现用
  1. 首先我在我的磁盘目录D:\tmp\com\alibaba\jdk下创建了两个JAVA源文件,一个是Schedule.java文件,另外一个是ExecutorMark.java,并借助IDE工具编写代码。源文件代码见篇尾附录。
  2. 编译源代码
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

说明:

  1. -cp选项同classpath,表示指定类加载路径,这里需要使用谷歌的guava库。
  2. -d选项表示指定编译后的字节码文件存储目录。
  3. 此命令一次可编译多个源代码文件,源码文件可以使用相对路径,也可以使用绝对路径。
  4. 注意指定源码路径时,要带上文件后缀(.java)。
  5. 编译完成后,检查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            输出非标准选项的帮助
  • 现学现用
  1. 可以使用cd命令切换到编译后的类文件目录,当然也可以不切换。不切换时,必须使用-cp选项指定类文件路径。
  2. 执行java命令
java -verbose -cp "d:\tmp\target;d:\tmp\jvm\guava-22.0.jar"  com.alibaba.jdk.ExecutorMark

说明:

  1. -cp选项指定类文件路径,如果还有其他jar包依赖,则可以使用分号连接。
  2. 此命令只能传入一个主类文件,并且要写主类程序的包路径(不同于javac命令下的真实磁盘路径)。
  3. 和javac命令不同,指定主类程序包路径时不需要带上任何后缀。
  • 程序执行结果
ThreadExecutorPool.png
  • 其他错误
    当出现如下错误时,表示类路径没有指定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(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();
    }
}

你可能感兴趣的:(JAVA命令行的常见用法)