摘要
本文主要介紹javac和java這兩個命令工具的用法。至于jdk環(huán)境的安裝和配置本文不做講述。閱讀完本文拔莱,你應(yīng)該具備不通過IDE工具就能夠編譯執(zhí)行JAVA程序桅打。
JAVAC的用法
- 作用
javac主要是將java源碼文件(后綴是.java)編譯成跨平臺的字節(jié)碼文件(后綴是.class)。 - 常見選項
可以輸入javac -help查看有哪些選項
用法: javac <options> <source files>
其中, 可能的選項包括:
-verbose 輸出有關(guān)編譯器正在執(zhí)行的操作的消息
-classpath <路徑> 指定查找用戶類文件和注釋處理程序的位置
-cp <路徑> 指定查找用戶類文件和注釋處理程序的位置
-sourcepath <路徑> 指定查找輸入源文件的位置
-bootclasspath <路徑> 覆蓋引導類文件的位置
-extdirs <目錄> 覆蓋所安裝擴展的位置
-processorpath <路徑> 指定查找注釋處理程序的位置
-parameters 生成元數(shù)據(jù)以用于方法參數(shù)的反射
-d <目錄> 指定放置生成的類文件的位置
-encoding <編碼> 指定源文件使用的字符編碼
-version 版本信息
-help 輸出標準選項的提要
-X 輸出非標準選項的提要
- 現(xiàn)學現(xiàn)用
- 首先我在我的磁盤目錄D:\tmp\com\alibaba\jdk下創(chuàng)建了兩個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選項表示指定編譯后的字節(jié)碼文件存儲目錄局服。
- 此命令一次可編譯多個源代碼文件钓瞭,源碼文件可以使用相對路徑,也可以使用絕對路徑淫奔。
- 注意指定源碼路徑時山涡,要帶上文件后綴(.java)。
- 編譯完成后唆迁,檢查d:\tmp\target目錄鸭丛,可以發(fā)現(xiàn)多了一個目錄com\alibaba\jdk,進入相應(yīng)目錄會發(fā)現(xiàn)多了兩個字節(jié)碼文件唐责。
JAVA的用法
- 作用
java命令會啟動一個jvm鳞溉,裝載類路徑下的字節(jié)碼文件,并運行主程序(帶有main方法的執(zhí)行類)鼠哥。 - 常見選項
用法: java [-options] class [args...]
其中選項包括:
-cp <目錄和 zip/jar 文件的類搜索路徑>
-classpath <目錄和 zip/jar 文件的類搜索路徑>
用 ; 分隔的目錄, JAR 檔案和 ZIP 檔案列表, 用于搜索類文件熟菲。
-D<名稱>=<值> 設(shè)置系統(tǒng)屬性
-verbose:[class|gc|jni] 啟用詳細輸出
-? -help 輸出此幫助消息
-X 輸出非標準選項的幫助
- 現(xiàn)學現(xiàn)用
- 可以使用cd命令切換到編譯后的類文件目錄看政,當然也可以不切換。不切換時抄罕,必須使用-cp選項指定類文件路徑允蚣。
- 執(zhí)行java命令
java -verbose -cp "d:\tmp\target;d:\tmp\jvm\guava-22.0.jar" com.alibaba.jdk.ExecutorMark
說明:
- -cp選項指定類文件路徑,如果還有其他jar包依賴呆贿,則可以使用分號連接嚷兔。
- 此命令只能傳入一個主類文件,并且要寫主類程序的包路徑(不同于javac命令下的真實磁盤路徑)做入。
- 和javac命令不同冒晰,指定主類程序包路徑時不需要帶上任何后綴。
- 程序執(zhí)行結(jié)果
- 其他錯誤
當出現(xiàn)如下錯誤時竟块,表示類路徑?jīng)]有指定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();
}
}