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

ZT: https://blog.csdn.net/just3do/article/details/68957618java

有時候寫個小測試,不想開idea,就用cmder,可是老忘記怎麼編譯,就copy別人的一份博客。python

javac和java命令行中的-classpath選項linux

這是個很基礎的問題,可是由於基本上都是用現有的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

sql

/usr/local/java/bin/java -classpath /tmp/javatest/lib/mail-1.3.3.jar:/tmp/javatest/bin/ jp.co.realseed.Capabilityapache

-----------------------------------------------------------------windows

 

今天寫了個測試程序,帶有包名,居然忘記了怎麼編譯和運行,因此如今記下來ide

1 帶包程序的編譯與運行工具

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

 

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

 
  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 文件打到哪一個目錄裏

相關文章
相關標籤/搜索