mysql外部架包_命令行编译带外部包依赖的java源文件 [以JDBC MySQL8为例]

环境: MySQL8 JDK11(SE)

首先下载MySQL8的JDBC驱动

c700bd981cbce69bcac690b85e358f3a.png

下载完文件名差不多是 “mysql-connector-java-8..jar”

ab861da9ff8f785a6283d55b3acff167.png

然后写一个JDBC小的程序(需要数据库提前建好表)

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 importjava.sql.Connection;2 importjava.sql.DriverManager;3 importjava.sql.ResultSet;4 importjava.sql.Statement;5 importjava.lang.ClassNotFoundException;6

7

8 public classjdbcer {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) throwsException{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 }

View Code

把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格式文件)的例子:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

privateConnection initConnection() {

String url= "jdbc:sqlite:" + ":resource:" + getClass().getResource("resources/my.db").toString();

System.out.println("url: " +url);

Properties config= newProperties();

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);

}returnconn;

}

View Code

目录结构

jar内

4d9527e91d047e94d39ad5335097f546.png

未打包时

1a76f0baeeeda4904824dc99b88571c0.png

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

Manifest-Version: 1.0Main-Class: demo.sqliteJDBC

Class-Path: lib/sqlite-jdbc-3.30.1.jar

MANIFEST.MF

7042a5b8fb1c9a8cb3a29291c37ad84d.png

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以上支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值