Java jar 命令行运行程序如何引用第三方依赖包
1 引言
mybatis generator 是一个命令行运行工具,可以生成 mybatis 代码。但它需要依赖数据库驱动 jar,否则会抛出 ClassNotFoundException 异常。
Exception in thread "main" java.lang.RuntimeException: Exception getting JDBC Driverat org.mybatis.generator.internal.JDBCConnectionFactory.getDriver(JDBCConnectionFactory.java:100)at org.mybatis.generator.internal.JDBCConnectionFactory.getConnection(JDBCConnectionFactory.java:83)at org.mybatis.generator.config.Context.getConnection(Context.java:542)at org.mybatis.generator.config.Context.introspectTables(Context.java:446)at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:257)at org.mybatis.generator.api.MyBatisGenerator.generate(MyBatisGenerator.java:189)at org.mybatis.generator.api.ShellRunner.main(ShellRunner.java:117)
Caused by: java.lang.ClassNotFoundException: org.postgresql.Driverat java.net.URLClassLoader.findClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)at java.lang.Class.forName0(Native Method)at java.lang.Class.forName(Unknown Source)at org.mybatis.generator.internal.ObjectFactory.internalClassForName(ObjectFactory.java:148)at org.mybatis.generator.internal.ObjectFactory.externalClassForName(ObjectFactory.java:119)at org.mybatis.generator.internal.JDBCConnectionFactory.getDriver(JDBCConnectionFactory.java:97)... 6 more
'-overwrite' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
这也就引出了本文的问题:利用 Java jar 命令行运行程序如何引用第三方依赖包?
2 Java 类加载器
JDK9 之前把类加载器分为三类,它们分别是启动类加载器、扩展类加载器和应用程序类加载器。
(1)启动类加载器 ( Bootstrap Class Loader )
启动类加载器负责加载存放在 <JAVA_HOME>\lib
目录,或者被 -Xbootclasspath 参数所指定的路径中存放的、且是 Java 虚拟机能够识别的类库加载到虚拟机的内存中。
(2)扩展类加载器 (Extension Class Loader)
扩展类加载器是在类 sun.misc.Launchers&ExtClassLoader
中以 Java 代码的形式实现的。它负责加载 <JAVA_HOME>\lib\ext
目录中,或者被 java. ext .dirs
系统变量所指定的路径中所有的类库。
(3)应用程序类加载器 (Application Class Loader )
应用程序类加载器由 sun.misc.Launcher&AppClassLoader
实现。它负责加载用户类路径 (Classpath) 上所有的类库。
3 双亲委派模型
类加载器之间的层次关系被称为类加载器的 “ 双亲委派模型 (Parents Delegation Model)”。 双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应有自己的父类加载器。
如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求 ( 它的搜索范围中没有找到所需的类 ) 时,子加载器才会尝试自己去完成加载。
4 引用第三方依赖包
(1)使用启动类加载器
-Xbootclasspath/a:xxx.jar
示例:
java -Xbootclasspath/a:postgresql-42.2.18.jar; -jar mybatis-generator-core-1.3.7.jar -configfile generatorConfig.xml -overwrite
(2) 使用扩展类加载器
-Djava.ext.dirs=扩展类所在路径
示例:
cd C:\workspace\ideaProjects\deniro-app\deniro-fly\generator\
java -Djava.ext.dirs=C:\programs\jdk1.8.0_181\jre\lib\ext -jar mybatis-generator-core-1.3.7.jar -configfile generatorConfig.xml
-overwrite
通过扩展类加载器来指定第三方依赖包的所在路径,可以实现多个命令行程序复用这些第三方依赖包,因此建议采用。
参考资料
周志明. 深入理解Java虚拟机[M]. 机械工业出版社, 2019.
https://www.cnblogs.com/wqbin/p/11122709.html
https://blog.csdn.net/cyony/article/details/74375251/
Java jar 命令行运行程序如何引用第三方依赖包相关推荐
- JAVA 的命令行运行
作者:孙英鹏 撰写时间:2019年4月18日 JAVA 的命令行运行 今天要讲的是如何在命令行里进行打印运行.说明(此方法是老师的上课内容,我重新理解一遍) 首先创建一个文本文档,放在一个文件夹里,文 ...
- 【原创】解决windows命令行运行程序必须输入.exe后缀的问题
这个问题是因为环境变量有异常. 1.右键桌面上的"此计算机"图标,选择"属性",得到以下页面 2.单击左侧的"高级系统设置" 3.在&quo ...
- 【转】[Python Tip]如何在Windows下方便地进入命令行运行程序
http://blog.donews.com/limodou/archive/2005/10/20/595292.aspx 在windows下的cmd窗口中执行python程序 ,我一般是这样做: 1 ...
- Win10命令行运行程序莫名停止
问题 以前用Windows命令行窗口跑批处理脚本的时候,偶尔会碰到程序运行一段时间以后就停住了,然后输入Enter就能继续跑一段时间,因为遇到的次数也不是很多,所以就忍耐了,没有专门找办法解决这个 ...
- Cmd使用方式--命令行运行程序
工具用惯却不知道如何去描述什么用,总感觉自己学东西用东西零零散散不系统,心虚!下面总结下自己使用cmd的几种方式. 1 => cmd,command,是window系统下命令提示符,是一种com ...
- java jar命令来运行jar包
1. 首先把需要运行的代码通过myeclipse的export命令,打出jar包出来. 2. META-INF内部中,MANIFEST.MF内部格式如下: Class-Path 中采用lib/包名,中 ...
- python3命令行运行程序怎么关闭_python中怎样退出程序运行?
python中退出程序的方法: 1.使用sys.exit()语句退出程序 执行该语句会直接退出程序,这也是经常使用的方法,也不需要考虑平台等因素的影响,一般是退出Python程序的首选方法. 该方法中 ...
- graalvm_GraalVM上的Picocli:极快的命令行应用程序
graalvm GraalVM GraalVM允许您提前将程序编译为本地可执行文件. 与Java VM相比,生成的程序具有更快的启动时间和更低的运行时内存开销. 这对于通常寿命很短的命令行实用程序尤其 ...
- GraalVM上的Picocli:极快的命令行应用程序
GraalVM GraalVM允许您提前将程序编译为本地可执行文件. 与Java VM相比,生成的程序具有更快的启动时间和更低的运行时内存开销. 这对于通常是短暂的命令行实用程序尤其有用. Graal ...
最新文章
- 机器学习与高维信息检索 - Note 2 - 统计决策和机器学习
- TensorFlow之变量OP
- 数据结构--单向链表
- Bootstrap整合ASP.NET MVC验证、jquery.validate.unobtrusive
- 【IT资讯】华为全球高薪招聘“天才少年”迎战:年薪89.6万起,201万封顶
- 《白鹿原》金句摘抄(七)
- java 使用jasper_使用Jasper Reports以Java创建报告
- 我们和全球的朋友一起回家
- RFID和安防究竟有什么关系?
- 产品设计体会(6016)我是哪种用户(下)
- 为什么我突然在Firefox中出现“阻止加载混合的活动内容”的问题?
- 构建Web内容的技术
- Blender制作火焰烟雾特效
- 不再以讹传讹 剖析720P 1080i和1080P
- 第九课堂-如何通过着装打造黄金比例完美好身材!
- Centos 安装 mysql5.7 示例教程
- 【大数据入门核心技术-Spark】(二)Spark核心模块
- 计算机乘法原理 移位,原码乘法,原码乘法原理详解
- 小程序实现图片预加载(图片延迟加载)
- 关于数学建模、机器学习与深度学习的思考
热门文章
- AnyChat开发流程指南
- PDF文件不能编辑的原因
- EasyExcel · 填充Excel
- EPC模式“设计优化、合理化建议、设计变更”界定思考
- 开环直流电机的机械特性_第二十三讲 20直流PWM变换器-电动机系统及开环调速系统机械特性.ppt...
- c语言中用递归实现等差数列前n项和,[编程题] 递归实现等差数列和阶乘
- java异常awt_java.awt.HeadlessException
- android 预装 gps test apk
- 面向对象系列教材 (一)- Java中的类和对象
- Java方法重写(Overriding)和方法重载(Overloading)