ZT : JAVA和JAVAC 命令行;java 帶有包名編譯並運行,附帶外部依賴jar包運行


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 帶包程序的編譯與運行

 
  1. package test;  
  2.   
  3. public class HiveJdbcClient {  
  4.   
  5.     public static void main(String[] args) {  
  6.         System.out.println("-------------------");  
  7.     }  
  8.   
  9. }  

 

程序中帶有包名,編譯應該使用

 
  1. javac -d . HiveJdbcClient.java  

這里在當前目錄會生成一個 test目錄,里面就是 HiveJdbcClient.class 文件

運行的時候命令:

[
  1. java test.HiveJdbcClient  

運行結果:

 
  1. -------------------  


2 對於需要依賴其他jar的運行

在實際的運行中,可能需要依賴額外的jar包,那么javac 和 Java 應該怎么做呢

使用 java -cp 指定依賴的jar包就可以。例子如下:

HiveJdbcClient.java

[java]  view plain  copy
 
  在CODE上查看代碼片派生到我的代碼片
  1. #package test;  
  2.   
  3. import java.sql.Connection;  
  4.   
  5.   
  6. import java.sql.DriverManager;  
  7. import java.sql.ResultSet;  
  8. import java.sql.SQLException;  
  9. import java.sql.Statement;  
  10. // import org.apache.hive.jdbc.HiveDriver;  
  11.   
  12. public class HiveJdbcClient {  
  13.   
  14.     private static String driverName = "org.apache.hive.jdbc.HiveDriver";  
  15.   
  16.     public boolean run() {  
  17.   
  18.         try {  
  19.             Class.forName(driverName);  
  20.             Connection con = null;  
  21.             con = DriverManager.getConnection(  
  22.                     "jdbc:hive2://192.168.17.15:10000/hivedb""hiveuser""hiveuser");  
  23.             Statement stmt = con.createStatement();  
  24.             ResultSet res = null;  
  25.   
  26.             String sql = "select count(*) from test_data";  
  27.   
  28.             System.out.println("Running: " + sql);  
  29.             res = stmt.executeQuery(sql);  
  30.             System.out.println("ok");  
  31.             while (res.next()) {  
  32.                 System.out.println(res.getString(1));  
  33.   
  34.             }  
  35.             return true;  
  36.         } catch (Exception e) {  
  37.             e.printStackTrace();  
  38.             System.out.println("error");  
  39.             return false;  
  40.         }  
  41.   
  42.     }  
  43.   
  44.     public static void main(String[] args) throws SQLException {  
  45.         HiveJdbcClient hiveJdbcClient = new HiveJdbcClient();  
  46.         hiveJdbcClient.run();  
  47.     }  
  48.   
  49. }  

里面的代碼里,我們依賴了Hive的jdbc jar 包,在編譯和運行時我們也要加上依賴的jar包,需要注意的是,使用 java -cp 有額外的jar的時候:在Linux下面ClassPath前面是一個點號加一個冒號;在Windows下面ClassPath前面是一個點號加一個分號

 
  1. 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  

運行命令:

 
  1. 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 注釋打開(該文件又多了一個包)
那么,編譯時使用:

 
  1. 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  

運行命令:

 
  1. 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 文件打到哪個目錄里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM