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 命令行运行程序如何引用第三方依赖包相关推荐

  1. JAVA 的命令行运行

    作者:孙英鹏 撰写时间:2019年4月18日 JAVA 的命令行运行 今天要讲的是如何在命令行里进行打印运行.说明(此方法是老师的上课内容,我重新理解一遍) 首先创建一个文本文档,放在一个文件夹里,文 ...

  2. 【原创】解决windows命令行运行程序必须输入.exe后缀的问题

    这个问题是因为环境变量有异常. 1.右键桌面上的"此计算机"图标,选择"属性",得到以下页面 2.单击左侧的"高级系统设置" 3.在&quo ...

  3. 【转】[Python Tip]如何在Windows下方便地进入命令行运行程序

    http://blog.donews.com/limodou/archive/2005/10/20/595292.aspx 在windows下的cmd窗口中执行python程序 ,我一般是这样做: 1 ...

  4. Win10命令行运行程序莫名停止

    问题   以前用Windows命令行窗口跑批处理脚本的时候,偶尔会碰到程序运行一段时间以后就停住了,然后输入Enter就能继续跑一段时间,因为遇到的次数也不是很多,所以就忍耐了,没有专门找办法解决这个 ...

  5. Cmd使用方式--命令行运行程序

    工具用惯却不知道如何去描述什么用,总感觉自己学东西用东西零零散散不系统,心虚!下面总结下自己使用cmd的几种方式. 1 => cmd,command,是window系统下命令提示符,是一种com ...

  6. java jar命令来运行jar包

    1. 首先把需要运行的代码通过myeclipse的export命令,打出jar包出来. 2. META-INF内部中,MANIFEST.MF内部格式如下: Class-Path 中采用lib/包名,中 ...

  7. python3命令行运行程序怎么关闭_python中怎样退出程序运行?

    python中退出程序的方法: 1.使用sys.exit()语句退出程序 执行该语句会直接退出程序,这也是经常使用的方法,也不需要考虑平台等因素的影响,一般是退出Python程序的首选方法. 该方法中 ...

  8. graalvm_GraalVM上的Picocli:极快的命令行应用程序

    graalvm GraalVM GraalVM允许您提前将程序编译为本地可执行文件. 与Java VM相比,生成的程序具有更快的启动时间和更低的运行时内存开销. 这对于通常寿命很短的命令行实用程序尤其 ...

  9. GraalVM上的Picocli:极快的命令行应用程序

    GraalVM GraalVM允许您提前将程序编译为本地可执行文件. 与Java VM相比,生成的程序具有更快的启动时间和更低的运行时内存开销. 这对于通常是短暂的命令行实用程序尤其有用. Graal ...

最新文章

  1. 机器学习与高维信息检索 - Note 2 - 统计决策和机器学习
  2. TensorFlow之变量OP
  3. 数据结构--单向链表
  4. Bootstrap整合ASP.NET MVC验证、jquery.validate.unobtrusive
  5. 【IT资讯】华为全球高薪招聘“天才少年”迎战:年薪89.6万起,201万封顶
  6. 《白鹿原》金句摘抄(七)
  7. java 使用jasper_使用Jasper Reports以Java创建报告
  8. 我们和全球的朋友一起回家
  9. RFID和安防究竟有什么关系?
  10. 产品设计体会(6016)我是哪种用户(下)
  11. 为什么我突然在Firefox中出现“阻止加载混合的活动内容”的问题?
  12. 构建Web内容的技术
  13. Blender制作火焰烟雾特效
  14. 不再以讹传讹 剖析720P 1080i和1080P
  15. 第九课堂-如何通过着装打造黄金比例完美好身材!
  16. Centos 安装 mysql5.7 示例教程
  17. 【大数据入门核心技术-Spark】(二)Spark核心模块
  18. 计算机乘法原理 移位,原码乘法,原码乘法原理详解
  19. 小程序实现图片预加载(图片延迟加载)
  20. 关于数学建模、机器学习与深度学习的思考

热门文章

  1. AnyChat开发流程指南
  2. PDF文件不能编辑的原因
  3. EasyExcel · 填充Excel
  4. EPC模式“设计优化、合理化建议、设计变更”界定思考
  5. 开环直流电机的机械特性_第二十三讲 20直流PWM变换器-电动机系统及开环调速系统机械特性.ppt...
  6. c语言中用递归实现等差数列前n项和,[编程题] 递归实现等差数列和阶乘
  7. java异常awt_java.awt.HeadlessException
  8. android 预装 gps test apk
  9. 面向对象系列教材 (一)- Java中的类和对象
  10. Java方法重写(Overriding)和方法重载(Overloading)