jena ExceptionInInitializerError bug 解决

前言

昨天在 将项目打包成jar包,放到服务器上运行的时候,遇到了一个jena中的ExceptionInInitializerError 错误,这个问题比较少见,StackOverflow 上只有两篇模糊不清的讲述了如何解决,现在将我的解决办法,分享如下,方便因为不好的同学。

问题描述

情景复现

当时的项目 在idea IDE中是能够正常跑的,但是当我打包成jar包时, 在命令行中运行时 就发生了错误, 因此 初步判断 是打包的过程出现了问题。
错误代码如下:

1
2
3
4
5
6
7
8
9
10
Caused by: java.lang.NullPointerException
at org.apache.jena.tdb.sys.EnvTDB.processGlobalSystemProperties(EnvTDB.java:33)
at org.apache.jena.tdb.TDB.init(TDB.java:250)
at org.apache.jena.tdb.sys.InitTDB.start(InitTDB.java:29)
at org.apache.jena.system.JenaSystem.lambda$init$40(JenaSystem.java:114)
at java.util.ArrayList.forEach(ArrayList.java:1249)
at org.apache.jena.system.JenaSystem.forEach(JenaSystem.java:179)
at org.apache.jena.system.JenaSystem.forEach(JenaSystem.java:156)
at org.apache.jena.system.JenaSystem.init(JenaSystem.java:111)
at org.apache.jena.tdb.TDBFactory.<clinit>(TDBFactory.java:40)

猜测可能是打包过程中没有将jena所需要的一些依赖,或者是其他东西包括进去,但是IDE 运行时这些东西默认是包含的,因此导致了这个奇怪的问题。

bug 解决

通过google,找到两篇StackOverflow, 两位外国同学大概也遇到了同样的问题。这两篇下面说的解决办法五花八门,有的根本没有用。
有说 是因为jena版本过低导致的,推荐使用3.1.0, 我一看自己的版本 是 3.8,0 显然不是这个问题
有说 是因为 jena 依赖的一些包没有加进去导致的, 比如jena-tdb, 当我将jena-tdb加入pom文件的dependency时,错误依旧。
实际上 这个错误 是因为 打包时 没有将 ..\src\main\kotlin\resources\META-INF\MANIFEST.MF 这个jena依赖的配置文件打包进去。
我是通过maven进行打包的,最开始是用assembly插件打包。 为了解决这个bug 要做两步:

  1. 改为使用 shade 插件打包
  2. 添加
    1
    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />

下面我将maven shade插件的配置贴在下面,以供参考

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>cn.edu.seu.wds.NAryRelationMiningKt</mainClass>
                                </transformer>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer" />
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer">
                                    <addHeader>false</addHeader>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

最后,maven clean , maven complied , maven package, 得到的包 就是包含所有依赖的正确的jar包,你可以在命令行中正确运行

如果觉得有用的话,打赏我吧~