jar在Windows上运行但在Ubuntu上不运行

时间:2017-03-17 13:39:07

标签: java maven jar java-native-interface compatibility

我正在使用Maven生成一个包含所有依赖项的项目的可运行jar文件(复制在一个单独的文件夹中)。

http://pastebin.com/NfhiVZhM(链接到pom.xml以避免复制巨型xml)

我正在使用jdk 1.8在Windows 10计算机上运行mvn包。在mvn运行之后,如果我打开cmd并运行java -jar instagramBot.jar,一切正常。

Maven生成结果(目标)的文件夹由Dropbox与带有oracle-jdk-1.8的Ubuntu机器同步。

但是如果在Ubuntu上打开一个shell并运行相同的命令,结果是:

  

rafa @ Bangkok:〜/ svn / instagramBot / target $ java -jar instagramBot.jar   错误:发生了JNI错误,请检查您的安装和   再次尝试线程“main”中的异常java.lang.NoClassDefFoundError:   COM / tomatechines / instagramapi /服务/异常/ InstagramException

打印完JVM堆栈跟踪后,程序崩溃。

我已经三次检查过包含com/tomatechines/instagramapi/services/exception/InstagramException的jar是否存在于类路径中,并且还存在于Ubuntu机器的libraries文件夹中。但错误不断发生。

我还检查了罐子名称中可能出现的任何特殊字符,但我什么都没找到。

堆栈跟踪没有对错误的任何进一步解释:

  

错误:发生了JNI错误,请检查您的安装和   再试一次

有没有人知道我应该检查什么或者应该检查什么来识别问题?

============== UPDATE ============

我使用的所有库都是罐子。没有DLL或OS特定文件。

我试图通过Eclipse导出一个可运行的jar文件并将所有库打包在一个jar(58MB)中,它在Ubuntu上正常工作......我不想使用这个方法因为我的代码会改变很多,我使用的库没有,但如果我把所有内容都装在一个jar中,每次修复一个小bug时,我都需要重新同步58MB,尽管Eclipse进程导出jar的过程非常不方便。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

我解决了这个问题,实际上我无法理解为什么会解决这个问题,但我却厌倦了尝试理解......

如果我在http://pastebin.com/NfhiVZhM上使用pom运行mvn包,我会收到两个警告

[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文件。 这个罐子的清单看起来像:

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

它试图在我的项目中查找libs的存储库结构,但是,copy dependencies插件只是创建一个文件夹(依赖项)并将所有jar放入其中。所以清单会查找一个从未存在过的文件夹结构,这个jar不会在windows或ubuntu上运行。

解决方案是删除<version>并添加

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

正如@asettouf所建议的那样。现在我已经回复了这个大警告,但罐子在这两个平台上工作得很好......我真的不关心它在工作时的警告