前言
昨天在 将项目打包成jar包,放到服务器上运行的时候,遇到了一个jena中的ExceptionInInitializerError 错误,这个问题比较少见,StackOverflow 上只有两篇模糊不清的讲述了如何解决,现在将我的解决办法,分享如下,方便因为不好的同学。
问题描述
情景复现
当时的项目 在idea IDE中是能够正常跑的,但是当我打包成jar包时, 在命令行中运行时 就发生了错误, 因此 初步判断 是打包的过程出现了问题。
错误代码如下:1
2
3
4
5
6
7
8
9
10Caused 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 要做两步:
- 改为使用 shade 插件打包
- 添加
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包,你可以在命令行中正确运行