使用某产品的官方javasdk写了个小工具,想打包放在服务器上跑。
通过Maven来package之后,尝试运行。报了错:
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: com/alibaba/fastjson/JSON
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.privateGetMethodRecursive(Unknown Source)
at java.lang.Class.getMethod0(Unknown Source)
at java.lang.Class.getMethod(Unknown Source)
at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.alibaba.fastjson.JSON
at 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)
... 7 more
我一开始还以为是这个fastjson的依赖出了问题,但是当我打开这个jar包后,发现只有120k大小,而pom里头明明引用了数不清的依赖,这不科学啊。
经过百度,确认是因为没有在pom中引入maven的打包插件导致依赖没有被打包造成的。
在pom文件下的<build><plugins> ..... </plugins> </build>
标签下加入了maven-shade-plugin插件得到解决。
插件引用如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId> maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.okex.program.MainClass</mainClass> <!--这里为运行类! -->
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
参考:https://www.cnblogs.com/hark0623/p/6252920.html
但是在随后的启动中,执行java -cp xxxx.jar com.oprsystem.program.MainClass main又报:
‘Error: A JNI error has occurred, please check your installation and try again
Exception in thread “main” java.lang.SecurityException: Invalid signature file digest for Manifest main attributes”
这个异常,百度后,参考:https://blog.csdn.net/mingyuli/article/details/84674483。
删除了jar包文件中META-INF目录下的*.SF和*.RSA文件得到了解决。