命令行编译带外部包依赖的java源文件 [以JDBC MySQL8为例]
环境: MySQL8 JDK11(SE)
首先下载MySQL8的JDBC驱动
https://dev.mysql.com/downloads/connector/j/
选 PlatForm Independent
下载完文件名差不多是 “mysql-connector-java-8.<小版本号>.jar”
然后写一个JDBC小的程序(需要数据库提前建好表)
1 import java.sql.Connection; 2 import java.sql.DriverManager; 3 import java.sql.ResultSet; 4 import java.sql.Statement; 5 import java.lang.ClassNotFoundException; 6 7 8 public class jdbcer { 9 public static final String DRIVER = "com.mysql.cj.jdbc.Driver"; 10 public static final String URL = "jdbc:mysql://localhost:3306/zk_stu?useSSL=false&serverTimezone=UTC"; 11 public static final String USER = "root"; 12 public static final String PASSWD = "yourpasswd"; 13 14 public static void main(String[] args) throws Exception{ 15 Class.forName("com.mysql.cj.jdbc.Driver"); 16 Connection conn = DriverManager.getConnection(URL, USER, PASSWD); 17 Statement stmt = conn.createStatement(); 18 ResultSet rs = stmt.executeQuery("SELECT * FROM 路人194班"); 19 20 while (rs.next()){ 21 System.out.println(rs.getString("学号") + " 姓名:" + rs.getString("姓名")); 22 } 23 } 24 25 26 }
把MySQL8的JDBC驱动和jdbcer.java放在同一目录
例子如下(tab键可以智能补全路径)
编译
javac -encoding UTF-8 -cp mysql-connector-java-8.0.16.jar; jdbcer.java
运行
java -cp mysql-connector-java-8.0.16.jar; jdbcer
如果不加cp参数,就会出现类的加载抛出异常(运行错误:java.lang.ClassNotFoundException)
-encoding用于指定编码格式,用UTF-8来避免中文乱码
-cp 即classpath是依赖路径,多个包可以用逗号分割,最后用分号表示classpath结束(分号绝不能少)
分为两种:目录和jar包
- 目录型:
fie.java依赖于目录dirA和dirB下的一些class文件,这种就是目录型的
编译: javac -cp dirA,dirB; fie.java
- Jar包型:
fig.java依赖于1.jar和2.jar(尽管这两个包在同一个目录dirC下)
编译: javac -cp 1.jar, 2.jar; fig.java
注意:直接 javac -cp dirC; fig.java 是没用的,因为jar包其实也是一种“目录”,javac编译器要打开jar包才能看到里面的内容
记得不要漏掉逗号和分号
两者运行都要加classpath,即-cp参数
当然可以编译后直接运行,把两个命令写成一句
javac -encoding UTF-8 -cp mysql-connector-java-8.0.16.jar; jdbcer.java && java -cp mysql-connector-java-8.0.16.jar; jdbcer
MySQL8和MySQL5的密码策略和JDBC驱动名等都不一样,最后附上:javac中使用-d,以及javac / java中使用-cp介绍
这里丢个读取Jar内sqlite数据库(db格式文件)的例子:
private Connection initConnection() { String url = "jdbc:sqlite:" + ":resource:" + getClass().getResource("resources/my.db").toString(); System.out.println("url: " + url); Properties config = new Properties(); config.setProperty("open_mode", "1"); // readonly try { Class.forName("org.sqlite.JDBC"); conn = DriverManager.getConnection(url, config); System.out.println("Connected! Version: " + conn.getMetaData().getDatabaseProductVersion()); } catch (Exception e) { e.printStackTrace(); System.exit(-1); } return conn; }
目录结构
jar内
未打包时
Manifest-Version: 1.0 Main-Class: demo.sqliteJDBC Class-Path: lib/sqlite-jdbc-3.30.1.jar
ps. MF这个文件最后必须有个空行
打包命令
jar cvfm sqliteDemo.jar ./MANIFEST.MF -C bin/ .
执行命令
java -jar .\sqliteDemo.jar
java命令行执行程序解决依赖外部jar包的问题
转载波波仔86 最后发布于2019-07-30 10:47:30
用java命令行直接执行程序,如果这个程序需要引用外部jar包。就不能单纯用java xx来执行
如果你的jar包和程序就在一个目录:
编译
javac -cp D:\yy\yy.jar,D\xx\xx.jar test.java
执行
java -cp D:\yy\yy.jar,D\xx\xx.jar test
但是往往我们依赖的包很多,要一个个填写估计就疯了。所有我们一般会把所有的外部依赖包都放在一个文件夹里,比如在D:\lib
编译
javac -Djava.ext.dirs=D:\lib test.java
执行
java -Djava.ext.dirs=D:\lib test
这个方法需要在jdk1.6以上支持