ZT: https://blog.csdn.net/just3do/article/details/68957618
有時候寫個小測試,不想開idea,就用cmder,但是老忘記怎么編譯,就copy別人的一份博客。
javac和java命令行中的-classpath選項
這是個很基礎的問題,但是因為基本上都是用現有的IDE工具 來開發java程序,所以很少有人意識到這一點。
javac
-classpath,設定要搜索類的路徑,可以是目錄,jar文件,zip文件(里面都是class文件),會覆蓋掉所有在CLASSPATH里面的設定。
-sourcepath, 設定要搜索編譯所需java 文件的路徑,可以是目錄,jar文件,zip文件(里面都是java文件)。
所以一個完整的javac命令行應該是這樣的,
假設abc.java在路徑c:\src里面,在任何的目錄的都可以執行以下命令來編譯。
javac -classpath c:\classes;c:\jar\abc.jar;c:\zip\abc.zip -sourcepath c:\source\project1\src;c:\source\project2 \lib\src.jar;c:\source\project3\lib\src.zip c:\src\abc.java
表示編譯需要c:\classed下面的class文件,c:\jar\abc.jar里面的class文件,c:\zip\abc.zip里面的class文件
還需要c:\source\project1\src下面的源文件,c:\source\project2 \lib\src.jar里面的源文件,c:\source\project3\lib\src.zip里面的源文件,
注意:jar,zip里面的源文件不會有什么改動,目錄下的源文件,有可能會被重新編譯。
java
-classpath, 設定要搜索的類的路徑,可以是目錄,jar文件,zip文件(里面都是class文件),會覆蓋掉所有的CLASSPATH的設定。
由於所要執行的類也是要搜索的類的一部分,所以一定要把這個類的路徑也放到-classpath的設置里面。
表現在,在要執行的類的路徑里面執行java時,一定要添加上點號(.)標示本目錄也要搜索。
假設abc.class在路徑c:\src里面
可以在任何路徑下執行以下命令
java -classpath c:\classes;c:\jar\abc.jar;c:\zip\abc.zip;c:\src abc
問題:如果main.class屬於c:\jar\abc.jar,並且在com.cnblogs.jeffchen這個包里,那么執行java -classpath c:\classes;c:\jar\abc.jar;c:\zip\abc.zip;com.cnblogs.jeffchen.main即可, 但是如果classpath中包含多個jar包呢?並且其他jar包中也有com.cnblogs.jeffchen會發生什么情況?錯誤?
在windows下,
文件路徑的分割符為反斜杠 \
類或者java文件列表的分割符為分號 ;
在linux下
文件路徑的分隔符位斜杠 /
類或者java文件列表的分隔符為冒號 :
一個linux下編譯和運行的例子
/usr/local/java/bin/javac -classpath /tmp/javatest/lib/mail-1.3.3.jar -d /tmp/javatest/bin/ /tmp/javatest/src/jp/co/realseed/Capability.java
/usr/local/java/bin/java -classpath /tmp/javatest/lib/mail-1.3.3.jar:/tmp/javatest/bin/ jp.co.realseed.Capability
-----------------------------------------------------------------
今天寫了個測試程序,帶有包名,竟然忘記了怎么編譯和運行,所以現在記下來
1 帶包程序的編譯與運行
- package test;
- public class HiveJdbcClient {
- public static void main(String[] args) {
- System.out.println("-------------------");
- }
- }
程序中帶有包名,編譯應該使用
- javac -d . HiveJdbcClient.java
這里在當前目錄會生成一個 test目錄,里面就是 HiveJdbcClient.class 文件
運行的時候命令:
- java test.HiveJdbcClient
運行結果:
- -------------------
2 對於需要依賴其他jar的運行
在實際的運行中,可能需要依賴額外的jar包,那么javac 和 Java 應該怎么做呢
使用 java -cp 指定依賴的jar包就可以。例子如下:
HiveJdbcClient.java
- #package test;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- // import org.apache.hive.jdbc.HiveDriver;
- public class HiveJdbcClient {
- private static String driverName = "org.apache.hive.jdbc.HiveDriver";
- public boolean run() {
- try {
- Class.forName(driverName);
- Connection con = null;
- con = DriverManager.getConnection(
- "jdbc:hive2://192.168.17.15:10000/hivedb", "hiveuser", "hiveuser");
- Statement stmt = con.createStatement();
- ResultSet res = null;
- String sql = "select count(*) from test_data";
- System.out.println("Running: " + sql);
- res = stmt.executeQuery(sql);
- System.out.println("ok");
- while (res.next()) {
- System.out.println(res.getString(1));
- }
- return true;
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println("error");
- return false;
- }
- }
- public static void main(String[] args) throws SQLException {
- HiveJdbcClient hiveJdbcClient = new HiveJdbcClient();
- hiveJdbcClient.run();
- }
- }
里面的代碼里,我們依賴了Hive的jdbc jar 包,在編譯和運行時我們也要加上依賴的jar包,需要注意的是,使用 java -cp 有額外的jar的時候:在Linux下面ClassPath前面是一個點號加一個冒號;在Windows下面ClassPath前面是一個點號加一個分號
- javac -cp .;D:\ochadoop4.0.1\hive-0.13.1-cdh5.2.1-och4.0.1\user_lib\hive--jdbc-0.13.1-cdh5.2.1.jar HiveJdbcClient.java
運行命令:
- java -cp .;D:\ochadoop4.0.1\hive-0.13.1-cdh5.2.1-och4.0.1\user_lib\hive-jdbc-0.13.1-cdh5.2.1.jar HiveJdbcClient
這樣就可以了
如果我們把代碼中的 package 注釋打開(該文件又多了一個包)
那么,編譯時使用:
- javac -cp .;D:\ochadoop4.0.1\hive-0.13.1-cdh5.2.1-och4.0.1\user_lib\hive--jdbc-0.13.1-cdh5.2.1.jar -d . HiveJdbcClient.java
運行命令:
- java -cp .;D:\ochadoop4.0.1\hive-0.13.1-cdh5.2.1-och4.0.1\user_lib\hive-jdbc-0.13.1-cdh5.2.1.jar test.HiveJdbcClient
這樣就可以了
-d .(點) :代表的是把class 文件打到哪個目錄里