在Windows上可以运行的jar文件在Ubuntu上无法运行。

3
我正在使用Maven生成一个可运行的jar文件,其中包括所有依赖项(复制到单独的文件夹中)。 我在Windows 10机器上使用jdk 1.8运行mvn package。 在mvn运行之后,如果我打开cmd并运行java -jar instagramBot.jar,则一切正常。 Maven生成结果的文件夹(target)与安装了oracle-jdk-1.8的Ubuntu机器同步。 但是,如果在Ubuntu上打开shell并运行相同的命令,则结果为:Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.NoClassDefFoundError: com/tomatechines/instagramapi/services/exception/InstagramException。然后会打印JVM堆栈跟踪,并导致程序崩溃。
我已经仔细检查了包含com/tomatechines/instagramapi/services/exception/InstagramException的jar包是否存在于类路径中,并且还存在于Ubuntu机器的库文件夹中。但是错误仍然发生。
我还检查了可能出现在jar文件名中的任何特殊字符,但是没有发现任何问题。
堆栈跟踪对错误没有进一步的解释:

错误:发生了JNI错误,请检查您的安装并重试

有人有任何想法是什么可能或者还应该检查什么来确定问题吗?
==============更新============
我使用的所有库都是jar文件。没有DLL或特定于操作系统的文件。
我尝试通过Eclipse导出可运行的jar文件,并将所有库打包到一个单独的jar文件中(58MB),它在Ubuntu上正常工作...我不想使用这种方法,因为我的代码将会经常更改,而我使用的库不会变化,但是如果我将所有内容打包到一个单独的jar中,每次修复小错误时,我都需要重新同步58MB,尽管Eclipse处理导出jar的过程非常不方便。

2
JNI是Java Native Interface的缩写,它是Java与本地库(专门为操作系统编写的库,例如C或C++)通信的方式。您尝试运行的程序是否需要本地库?您是否已经将适用于Linux的相关库放置在正确的位置?(注意:Windows DLL在Linux上不起作用,您需要使用适用于Linux的特定版本库)。 - Jesper
不!我使用的所有库都是jar文件。现在我尝试通过Eclipse导出可运行的jar文件,并将所有库打包到一个单独的jar文件中(58MB),它在Ubuntu上正常工作... - Rafael Lima
错误提示指出请检查您的安装。可能是指 JVM 本身。 - efekctive
这是一个多模块项目吗?你在maven中使用什么命令?你能展示一下maven的输出吗? - Adonis
@asettouf,这不是多模块,我使用的命令只是mvn package(您可以在链接中检查pom.xml)。您可以检查mvn输出http://pastebin.com/gW4tQuX6,但没有什么特别的。 - Rafael Lima
2个回答

1
答案在这里。
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent

你可能想在pom中声明源编码为utf8,参见this link

<properties>
    ...
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    ...
</properties>

将这些信息添加到pom中可以消除警告,但并不能解决我的问题,我在Windows和Ubuntu上仍然会收到错误提示。 - Rafael Lima
实际上,导致项目在Windows上停止工作的不是您的建议...而是Maven向我提出的另一个“修复”建议,我没有检查...现在问题已经解决。谢谢。 - Rafael Lima

1
我解决了这个问题,但实际上我不明白为什么它解决了,但我太累了,无法尝试去理解...
如果我使用 http://pastebin.com/NfhiVZhM 上的pom运行mvn package,我会得到两个警告。
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for InstagramBot:InstagramBot:jar:2.0.1
[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-jar-plugin is missing. @ line 26, column 12
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.

//大量的信息输出//

[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!

我得到了一个可在Windows上正常运行的可执行jar文件。 这个jar文件的清单看起来像这样:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: rafael
Class-Path: dependency/utils-1.4.3.jar dependency/commons-io-2.5.jar d
 ependency/slf4j-api-1.7.22.jar dependency/slf4j-log4j12-1.7.22.jar de
 pendency/log4j-1.2.17.jar dependency/hibernate-core-5.1.0.Final.jar d
 ependency/jboss-logging-3.3.0.Final.jar dependency/hibernate-jpa-2.1-
 api-1.0.0.Final.jar dependency/javassist-3.20.0-GA.jar dependency/ant

由于第一个警告太大了,我在发布到pastebin后立即解决了它,只需在我的maven-jar-plugin中添加以下行(该行解决了警告)。

<version>3.0.0</version>

简单来说,使用Maven创建的清单文件会发生变化:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: rafael
Class-Path: dependency/com/tomatechines/utils/1.4.3/utils-1.4.3.jar de
 pendency/commons-io/commons-io/2.5/commons-io-2.5.jar dependency/org/
 slf4j/slf4j-api/1.7.22/slf4j-api-1.7.22.jar dependency/org/slf4j/slf4
 j-log4j12/1.7.22/slf4j-log4j12-1.7.22.jar dependency/log4j/log4j/1.2.
 17/log4j-1.2.17.jar dependency/org/hibernate/hibernate-core/5.1.0.Fin

它试图查找我项目中库的存储库结构,但是复制依赖插件只创建一个单独的文件夹(dependency)并将所有jar文件放在其中。因此,清单寻找从未存在的文件夹结构,这个jar文件在Windows和Ubuntu上都无法工作。
解决方案是删除并添加。

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

正如@asettouf所建议的那样。现在我收到了一个大警告,但这个jar文件在两个平台上都可以正常工作...而且只要它能正常工作,我真的不在乎那个警告。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接