weixin_39760434
weixin_39760434
2021-01-07 08:17

使用Maven pakage后 java -jar 运行报错

报错信息如下所示,找不到 mysql logger的 扩展,我知道lts-logger下有一个子模块叫 lts-logger-mysql,最初以为是该模块没有在lts-example上配置依赖,后来查看一下jar包,里面确实有该模块的class文件。另外,在eclipse和IDEA中编译运行没问题,但使用maven打包成jar后 java -jar 就不行(打包时已经将所有依赖都打进jar包),报错信息如下:

[ERROR] [09:28:38] com.lts.core.cluster.JobNode - [LTS] Start failed!, lts version: 1.5-SNAPSHOT-jar-with-dependencies, current host: 10.37.129.2 java.lang.IllegalStateException: No such extension com.lts.biz.logger.JobLoggerFactory by name mysql at com.lts.core.extension.ExtensionLoader.findException(ExtensionLoader.java:304) at com.lts.core.extension.ExtensionLoader.createExtension(ExtensionLoader.java:315) at com.lts.core.extension.ExtensionLoader.getExtension(ExtensionLoader.java:175) at com.lts.biz.logger.JobLoggerFactory$Adpative.getJobLogger(JobLoggerFactory$Adpative.java) at com.lts.jobtracker.JobTracker.innerStart(JobTracker.java:47) at com.lts.core.cluster.AbstractJobNode.start(AbstractJobNode.java:52) at com.lts.example.api.JobTrackerTest.testMysqlQueue(JobTrackerTest.java:84) at com.lts.example.api.JobTrackerTest.main(JobTrackerTest.java:17) [ERROR] [09:28:40] com.lts.core.cluster.JobNode - [LTS] Stop failed!, lts version: 1.5-SNAPSHOT-jar-with-dependencies, current host: 10.37.129.2 java.lang.NullPointerException at com.lts.core.cluster.AbstractJobNode.stop(AbstractJobNode.java:69) at com.lts.example.api.JobTrackerTest$2.run(JobTrackerTest.java:89) at java.lang.Thread.run(Thread.java:745)

该提问来源于开源项目:ltsopensource/light-task-scheduler

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

8条回答

  • weixin_39760434 weixin_39760434 4月前

    找到报错的原因了,但仍然有一些疑问,希望作者给予以解答,谢谢。

    以下是我的解决过程:

    首先,我肯定所有依赖的jar包都通过maven打进了可执行的Jar中。 通过调试源码,发现在 ExtensionLoader 类中有一个 loadFile 方法,其作用是加载文件并解析后,将得到的class添加到缓存中,供后续使用。通过打印输出 fileName变量,得到如下结果: image

    从而得知,loadFile 会去 META-INF/lts/internal 目录下查找相应文件,解析文件内容后得到相应的class类,使用zip软件打开jar文件查看,在 META-INF/lts/internal目录下,发现很多文本文件,如图: image

    当我打开 com.lts.biz.logger.JobLoggerFactory_时,_发现了问题所在,如图: image

    只有 mongo 一行指定了其实现类,并没有mysql,也没有console,也就是这个原因,在使用 java -jar lts-example-xxx.jar 时,一直报找不到 mysql extension 的错误。

    最后,我利用压缩软件编辑该文件,手动加入一行:

    mysql=com.lts.biz.logger.mysql.MysqlJobLoggerFactory

    保存回jar文件后再次运行,原来那个错误就解决了,然后遇到 mysql queue的extension找不到,很自然,使用相同的方法在 _com.lts.queue.ExecutableJobQueueFactory_文件中加上mysql的配置,即可,最终,使得jar文件成功执行。

    以上是我的解决过程,我想,如果每次打完jar包都这样来编辑一遍实在是痛苦,所以将问题与解决过程详细列出,希望作者能指点一二,如何配置使得每次 maven package 可以自动将mysql的扩展加入到 META-INF/lts/internal/ 下的文件当中,不胜感激!

    点赞 评论 复制链接分享
  • weixin_39640372 weixin_39640372 4月前

    这里很多jar,功能都是按需引入的,如果你选择mysql做队列的话,只需要将lts-logger-mysql引入(或者打包进去就行了),自动的会将mysql 的 lts-logger-mysql/src/main/resources/META-INF/lts/internal/com.lts.biz.logger.JobLoggerFactory 加入进去了, 如果你把lts-logger-mysql 和 lts-logger-mongo 都打包进去了,那么可能存在这个覆盖问题,因为 com.lts.biz.logger.JobLoggerFactory 这个文件名都一样,内容不一样。

    点赞 评论 复制链接分享
  • weixin_39640372 weixin_39640372 4月前

    文档暂时比较缺乏,后面花时间补补,抱歉了, 有什么问题都可以问

    点赞 评论 复制链接分享
  • weixin_39760434 weixin_39760434 4月前

    OK,Thank You!

    点赞 评论 复制链接分享
  • weixin_39640372 weixin_39640372 4月前

    应该是实现 依赖包没有加进去, 可以尝试用 shell 脚本启动

    点赞 评论 复制链接分享
  • weixin_39760434 weixin_39760434 4月前

    能否具体说明,目前各种方式都尝试过,该总是仍然没有解决,谢谢。

    点赞 评论 复制链接分享
  • weixin_39640372 weixin_39640372 4月前

    你运行的前提是要把所有的依赖包都加载进去,不是仅仅只是执行目的jar中的某个类 main方法 。 还一种你直接放在tomcat中启动就可以了,StartListener来启动,或者Spring 容器启动都可以

    点赞 评论 复制链接分享
  • weixin_39760434 weixin_39760434 4月前

    :ok_hand:

    点赞 评论 复制链接分享

相关推荐